exception代码“EXC_I386_GPFLT”的含义是什么?
exception代码EXC_I386_GPFLT
的含义是什么?
它的含义是否因情况而异?
在这种情况下,我指的是exceptiontypesEXC_BAD_ACCESS
,exception代码EXC_I386_GPFLT
这个程序是在Xcode 5.0.1中开发的,处理BLAS库的cblas_zgemm()
(好吧,我想这不重要…)
非常感谢你!
EXC_I386_GPFLT肯定是指“一般保护错误”,这是x86的方式告诉你,“你做了你不允许做的事情”。 它通常不意味着你访问的内存不足,但可能是你的代码超出了界限,并导致错误的代码/数据被用于某种方式的保护违规。
不幸的是,如果没有更多的上下文,可能很难找出问题的真正原因,我的“AMD64程序员手册”第二卷从2005年开始列出了27个不同的原因 – 总而言之,8年后可能会增加一些更多。
如果它是一个64位的系统,一个合理的情况是你的代码使用了“非规范指针” – 这意味着一个64位的地址是这样形成的,即地址的高16位不是低48位顶部的所有副本(换句话说,地址的前16位应全部为0或全1,基于低于16位的位)。 这个规则是为了保证体系结构能够“安全地扩展地址范围内的有效位数”。 这将表明代码要么覆盖某些指针数据与其他东西,要么读取某些指针值时出界。
另一个可能的原因是与SSE寄存器非alignment的访问 – 换言之,从一个不是16字节alignment的地址读取一个16字节的SSE寄存器。
正如我所说的,还有很多其他可能的原因,但其中大多数涉及“正常”代码不会在32位或64位操作系统中执行的操作(例如加载具有无效select器索引的段寄存器或写入MSR(型号特定的寄存器))。
您通常可以从头文件中获取信息。 例如:
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk $ find usr -name \*.h -exec fgrep -l EXC_I386_GPFLT {} \; usr/include/mach/i386/exception.h ^C $ more usr/include/mach/i386/exception.h .... #define EXC_I386_GPFLT 13 /* general protection fault */
好的,所以这是一个普遍的保护错误(正如其名称所暗示的那样)。 谷歌search“i386一般保护错误”产生很多点击,但是这看起来很有趣:
内存保护也使用段描述符来实现。 首先,处理器检查加载到段寄存器中的值是否引用了有效的描述符。 然后检查每个计算出的线性地址是否在段内。 此外,还会根据段描述符中的信息来检查访问types(读取,写入或执行)。 只要其中一个检查失败,引发exception(中断)13(hex0D)。 这个例外被称为通用保护错误(GPF)。
这13
符合我们在头文件中看到的,所以看起来像是一样的东西。 然而,从应用程序员的angular度来看,这仅仅意味着我们正在引用内存,而不是在硬件上如何实现。
debugging和查找源代码:为应用程序(Product \ Scheme)启用僵尸和启动工具,select僵尸。 在Xcode中运行你的应用程序然后去Instrument开始录制。 回到你的应用程序,并尝试生成错误。 如果有的话,仪器应该检测到不好的呼叫(对僵尸)。
希望它有帮助!
我想知道为什么这出现在我的unit testing。
我已经添加了一个方法声明到一个协议,其中包括throws
; 但潜在的投掷方法甚至没有在特定的testing中使用。 在testing中启用僵尸听起来太麻烦了。
结果发现一个⌘K干净的伎俩。 解决实际问题的时候,我总是心灰意冷。