134

异常代码是什么意思EXC_I386_GPFLT

它的含义是否因情况而异?

在这种情况下,我指的是EXC_BAD_ACCESS带有异常代码的异常类型EXC_I386_GPFLT

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

非常感谢!

4

15 回答 15

127

EXC_I386_GPFLT 肯定指的是“一般保护错误”,这是 x86 告诉您“您做了不允许做的事情”的方式。这通常并不意味着您访问超出内存范围,但可能是您的代码超出范围并导致错误的代码/数据以某种方式使用,从而导致某种保护违规。

不幸的是,如果没有更多的上下文,可能很难确切地找出问题所在,我的 AMD64 程序员手册,2005 年第 2 卷中列出了 27 个不同的原因 - 无论如何,8 年后可能会增加一些更多的。

如果它是 64 位系统,一个合理的情况是您的代码使用“非规范指针”——这意味着 64 位地址的形成方式使得地址的高 16 位不是低 48 位顶部的所有副本(换句话说,基于 16 位以下的位,地址的顶部 16 位应该全部为 0 或全部为 1)。这条规则是为了保证架构可以“安全地扩展地址范围内的有效位数”。这表明代码要么用其他东西覆盖一些指针数据,要么在读取一些指针值时越界。

另一个可能的原因是与 SSE 寄存器的未对齐访问 - 换句话说,从不是 16 字节对齐的地址读取 16 字节 SSE 寄存器。

正如我所说,还有许多其他可能的原因,但其中大多数涉及“正常”代码在 32 位或 64 位操作系统中不会做的事情(例如加载具有无效选择器索引的段寄存器或写入MSR(模型特定寄存器))。

于 2013-10-29T07:34:41.020 回答
28

要调试和查找源:为应用程序启用 Zombies (Product\Scheme) 并启动仪器,选择 Zombies。在 Xcode 中运行您的应用程序然后转到 Instruments 开始录制。返回您的应用程序并尝试生成错误。如果有错误呼叫,仪器应该检测到错误呼叫(对僵尸的呼叫)。

希望能帮助到你!

于 2015-04-30T12:46:27.850 回答
25

您通常可以从头文件中获取信息。例如:

$ 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 一般保护错误”会产生很多命中,但这看起来很有趣:

内存保护也使用段描述符来实现。首先,处理器检查加载到段寄存器中的值是否引用了有效的描述符。然后它检查计算出的每个线性地址实际上是否位于段内。此外,还会根据段描述符中的信息检查访问类型(读、写或执行)。每当这些检查之一失败时,就会引发异常(中断)13(十六进制 0D)。此异常称为一般保护故障 (GPF)。

13与我们在头文件中看到的一致,所以看起来是一样的。然而,从应用程序程序员的角度来看,这只是意味着我们引用了我们不应该引用的内存,它在硬件上的实现方式并不重要。

于 2013-10-29T07:29:53.527 回答
19

我想知道为什么在我的单元测试中会出现这种情况。

我在协议中添加了一个方法声明,其中包括throws;但是在那个特定的测试中甚至没有使用潜在的投掷方法。在测试中启用 Zombies 听起来太麻烦了。

事实证明 ⌘K clean 成功了。当解决实际问题时,我总是大吃一惊。

于 2015-10-10T13:44:07.433 回答
11

我在 Swift 4.2 也有类似的例外。我花了大约半个小时试图在我的代码中找到一个错误,但在关闭 Xcode 并删除派生数据文件夹后问题就消失了。这是快捷方式:

rm -rf ~/Library/Developer/Xcode/DerivedData
于 2018-12-13T16:35:48.283 回答
4

在我的情况下,在 iOS 模拟器上运行应用程序时,Xcode 中引发了错误。虽然我无法回答“错误意味着什么”这个具体问题,但我可以说是什么帮助了我,也许它也帮助了其他人。

我的解决方案是Erase All Content and Settings在模拟器和Clean Build Folder...Xcode 中。

于 2018-06-13T20:50:35.593 回答
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)
])

改变safeAreaLayoutGuideself解决问题。

意思是将视图与超级视图的前导、尾随、顶部、底部对齐,而不是与安全区域对齐)

于 2020-02-27T21:35:17.193 回答
0

这发生在我身上是因为 Xcode 似乎不喜欢我在两个不同的类中使用相同的变量名(如果这很重要,那么它们符合相同的协议,尽管变量名在任何协议中都没有任何关系)。我只是重命名了我的新变量。

在调试时,我必须进入崩溃的设置器才能看到它。此答案适用于 iOS

于 2018-08-09T19:06:24.767 回答
0

我在 Xcode 12.0 Beta 6 上看到这个错误代码轮换崩溃,仅在 iOS 14 模拟器上。它不会在我运行 iOS 13 的真实设备上崩溃!因此,如果您正在运行 beta 版本并在模拟器中看到旋转崩溃,那么您可能只需要在具有非 beta iOS 版本的真实设备上运行即可。

于 2020-09-04T17:37:44.033 回答
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
于 2019-08-23T23:58:58.640 回答
0

我的问题是愚蠢的 Xcode Playground。自从几年前问世以来,操场对我来说一直不稳定,Apple 真是一团糟。

删除派生数据等没有帮助,让我的代码不抛出的唯一方法是在应用程序项目中运行它

于 2021-06-16T16:43:15.740 回答
0

如果错误是在定义self为的闭包中引发的unowned,则您可以访问的内容可能会受到限制,并且在某些情况下会收到此错误代码。特别是在调试时。如果您是这种情况,请尝试更改[unowned self][weak self]

于 2019-02-21T15:36:24.627 回答
0

我可以得到这个错误UnsafeMutablePointer

let ptr = rawptr.assumingMemoryBound(to: A.self) //<-- wrong A.self Change it to B.Self
ptr.pointee = B()
于 2020-11-20T22:53:56.640 回答
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

于 2021-01-27T13:22:12.303 回答
-1

对我来说,它与情节提要相关的问题有一个 ViewController 构建选项,用于设置 iOS 9.0 及更高版本,之前设置为 iOS 10.0 及更高版本。实际上我想将版本从 10 降级到 iOS 9.3。

于 2020-06-15T11:53:29.737 回答