异常代码“EXC_I386_GPFLT”的含义是什么?

时间:2013-10-29 07:06:55

标签: c++ c exc-bad-access

异常代码EXC_I386_GPFLT的含义是什么?

其含义是否因情况而异?

在这种情况下,我指的是例外类型EXC_BAD_ACCESS,异常代码为EXC_I386_GPFLT

该程序是在Xcode 5.0.1中开发的,处理BLAS库的cblas_zgemm()。(好吧,我想这没关系......)

非常感谢!

15 个答案:

答案 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 对我来说一直不稳定,苹果太烂了。

删除派生数据等无济于事,使我的代码不抛出的唯一方法是在应用程序项目中运行它