异常代码EXC_I386_GPFLT
的含义是什么?
其含义是否因情况而异?
在这种情况下,我指的是例外类型EXC_BAD_ACCESS
,异常代码为EXC_I386_GPFLT
该程序是在Xcode 5.0.1中开发的,处理BLAS库的cblas_zgemm()
。(好吧,我想这没关系......)
非常感谢!
答案 0 :(得分:96)
EXC_I386_GPFLT肯定是指“一般保护错误”,这是x86告诉你“你做了一件你不允许做的事”的方法。它通常并不意味着您访问内存不足,但可能是您的代码超出范围并导致错误的代码/数据以某种方式导致保护违规。
不幸的是,如果没有更多的上下文,很难弄清楚问题究竟是什么,我的AMD64程序员手册中列出了27种不同的原因,从2005年开始的第2卷 - 从所有情况来看,8年之后很可能会有又添了几个。
如果它是一个64位系统,一个合理的场景是你的代码使用“非规范指针” - 这意味着64位地址的形成方式是地址的高16位并不是所有低48位的顶部副本(换句话说,地址的前16位应全部为0或全1,基于16位以下的位)。此规则用于保证架构可以“安全地扩展地址范围内的有效位数”。这表明代码要么用其他东西覆盖某些指针数据,要么在读取某些指针值时超出范围。
另一个可能的原因是使用SSE寄存器进行未对齐访问 - 换句话说,从非16字节对齐的地址读取16字节SSE寄存器。
正如我所说,还有许多其他可能的原因,但大多数都涉及“正常”代码在32位或64位操作系统中不会执行的操作(例如加载具有无效选择器索引的段寄存器)或写入MSR(模型特定寄存器))。
答案 1 :(得分:22)
您经常可以从头文件中获取信息。例如:
$ 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 */
好的,所以这是一个普遍的保护错误(正如其名称所暗示的那样)。谷歌搜索“i386一般保护错误”产生了许多命中,但这looks有趣:
还使用段描述符实现内存保护。 首先,处理器检查段中是否加载了值 register引用有效的描述符。然后它检查每一个 计算出的线性地址实际上位于段内。而且, 访问类型(读,写或执行)是根据 段描述符中的信息。每当其中一个检查 失败,引发异常(中断)13(十六进制0D)。这个例外是 称为一般保护错误(GPF)。
13
与我们在头文件中看到的匹配,所以它看起来是一样的。然而,从应用程序员的角度来看,它只是意味着我们引用了我们不应该的内存,而且它在硬件上的实现方式并不重要。
答案 2 :(得分:21)
调试并查找源代码: 为应用程序启用Zombies(Product \ Scheme)和Launch Instruments,Select Zombies。 在Xcode中运行您的应用程序 然后去仪器开始录音。 返回到您的应用程序并尝试生成错误。 如果有的话,仪器应该检测到不良呼叫(僵尸)。
希望它有所帮助!
答案 3 :(得分:16)
我想知道为什么这会在我的单元测试中出现。
我在包含throws
的协议中添加了方法声明;但是潜在的投掷方法甚至没有用于那个特定的测试。在测试中启用Zombies听起来有点麻烦。
结果显示⌘K干净。当解决实际问题时,我总是松脆的。
答案 4 :(得分:4)
我在Swift 4.2上也有类似的例外。我花了大约半个小时试图在代码中查找错误,但是在关闭Xcode并删除派生数据文件夹后,问题不再存在。这是快捷方式:
rm -rf ~/Library/Developer/Xcode/DerivedData
答案 5 :(得分:2)
在我的情况下,在iOS模拟器上运行应用程序时,Xcode中会抛出错误。虽然我无法回答具体问题"错误意味着什么",我可以说是什么帮助了我,也许它也有助于他人。
我的解决方案是模拟器中的Erase All Content and Settings
和Xcode中的Clean Build Folder...
。
答案 6 :(得分:1)
离开视图时我遇到了这个问题(弹出回到先前的视图)。
原因是
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
view.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor),
view.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
view.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor),
view.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor)
])
将safeAreaLayoutGuide
更改为self
即可解决问题。
含义是使视图与超级视图的前,后,顶部,底部对齐,而不是与安全区域对齐
答案 7 :(得分:0)
这是发生在我身上的原因,因为Xcode在两个不同的类中似乎不喜欢我使用相同的变量名(如果重要的话,它们遵循相同的协议,尽管变量名在任何协议中都没有关系)。我只是重命名了我的新变量。
我必须在调试时进入崩溃的设置器才能看到它。此答案适用于iOS
答案 8 :(得分:0)
如果在将self
定义为unowned
的闭包中引发错误,则可能会限制您的访问范围,并且在某些情况下会获得此错误代码。特别是在调试时。如果是这种情况,请尝试将[unowned self]
更改为[weak self]
答案 9 :(得分:0)
执行此操作时出现此错误:
NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:<#(nonnull id), ...#>, nil]; //with 17 objects and keys
当我恢复到以下位置时,它消失了:
NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] init];
[aDictionary setObject:object1 forKey:@"Key1"]; //17 times
答案 10 :(得分:0)
对我来说,它与情节提要相关的问题是,对于设置iOS 9.0和更高版本(先前为iOS 10.0和更高版本)设置了ViewController构建选项。实际上,我想将版本从10降级到iOS 9.3。
答案 11 :(得分:0)
我在Xcode 12.0 Beta 6上仅在iOS 14模拟器上看到旋转中的此错误代码崩溃。但是,它不会在运行iOS 13的真实设备上崩溃!因此,如果您正在运行Beta版本的东西,并在模拟器中看到旋转崩溃,也许您只需要在具有非Beta版本iOS版本的真实设备上运行即可。
答案 12 :(得分:0)
我可以在使用UnsafeMutablePointer
时遇到此错误
let ptr = rawptr.assumingMemoryBound(to: A.self) //<-- wrong A.self Change it to B.Self
ptr.pointee = B()
答案 13 :(得分:0)
就我而言,EXC_I386_GPFLT
是由属性 getter 中缺少返回值引起的。像这样:
- (CppStructure)cppStructure
{
CppStructure data;
data.a = self.alpha;
data.b = self.beta;
return data; // this line was missing
}
Xcode 12.2
答案 14 :(得分:0)
我的问题是愚蠢的 Xcode Playground。自从几年前出来后,playground 对我来说一直不稳定,苹果太烂了。
删除派生数据等无济于事,使我的代码不抛出的唯一方法是在应用程序项目中运行它