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

What's the meaning of exception code "EXC_I386_GPFLT"?

本文关键字:是什么 I386 代码 EXC 异常 GPFLT      更新时间:2023-10-16

异常代码EXC_I386_GPFLT是什么意思?

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

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

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

谢谢!

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

不幸的是,如果没有更多的上下文,很难弄清楚问题到底是什么,我的 AMD64 程序员手册,第 2 卷中列出了 2005 种不同的原因 - 从各方面来看,很可能 8 年后会添加更多。

如果是 64 位

系统,一个合理的场景是你的代码正在使用"非规范指针"——这意味着 64 位地址的形成方式是地址的前 16 位不是低 48 位顶部的所有副本(换句话说,地址的前 16 位应该全部为 0 或全部为 1, 基于略低于 16 位的位)。制定此规则是为了保证架构可以"安全地扩展地址范围内的有效位数"。这将表明代码要么用其他内容覆盖某些指针数据,要么在读取某些指针值时超出界限。

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

正如我所说,还有许多其他可能的原因,但其中大多数涉及"正常"代码在 32 位或 64 位操作系统中不会做的事情(例如加载具有无效选择器索引的段寄存器或写入 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     */

好的,所以这是一个一般的保护错误(顾名思义)。 谷歌搜索"i386 通用保护故障"会产生很多点击,但这看起来很有趣:

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

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

调试并查找源代码:为应用程序启用僵尸(产品\方案)并启动工具,选择僵尸。在 Xcode 中运行您的应用然后转到乐器开始录制。返回您的应用程序并尝试生成错误。仪器应该检测到错误的呼叫(对僵尸)如果有的话。

希望对您有所帮助!

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

我已经在包含throws的协议中添加了一个方法声明;但是在该特定测试中甚至没有使用潜在的抛出方法。在测试中启用僵尸听起来太麻烦了。

事实证明,⌘K 清洁做到了。当这解决了实际问题时,我总是大吃一惊。

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

rm -rf ~/Library/Developer/Xcode/DerivedData

就我而言,在 iOS 模拟器上运行应用程序时,Xcode 中抛出了错误。虽然我无法回答"错误意味着什么"这个具体问题,但我可以说是什么帮助了我,也许它也帮助了其他人。

对我来说,解决方案是在模拟器中Erase All Content and Settings,在Xcode中Clean Build Folder...

我在离开视图时遇到了这个问题(弹出回上一个视图)。

原因是有

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解决问题。

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

就我而言,我没有在 String.localizedStringWithFormatformat 参数中使用正确的占位符:

let format = "I have an %s."
let string = "exception"
String.localizedStringWithFormat(format, string)

%s更改为%@解决了问题。

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

我不得不进入它崩溃的设置器才能在调试时看到它。这个答案适用于 iOS

如果错误在将self定义为 unowned 的闭包中抛出,您可能会受到限制,并且在某些情况下会收到此错误代码。尤其是在调试时。如果是这种情况,请尝试将[unowned self]更改为[weak self]

我在

执行此操作时收到此错误:

 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

我在 Xcode 12.0 Beta 6 上看到旋转崩溃的错误代码,仅在 iOS 14 模拟器上。不过,它不会在运行iOS 13的真实设备上崩溃!因此,如果您正在运行测试版并在模拟器中看到旋转崩溃,也许您只需要在具有非测试版 iOS 版本的真实设备上运行。

我可能会遇到此错误UnsafeMutablePointer

let ptr = rawptr.assumingMemoryBound(to: A.self) //<-- wrong A.self Change it to B.Self
ptr.pointee = B()

在我的情况下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

我的问题是愚蠢的Xcode Playground。自从几年前问世以来,游乐场对我来说一直不稳定,苹果太乱了。

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

我在 Swift/iOS 上看到了同样的错误。就我而言,这是因为我试图通过直接使用其start()功能来启动(NS)Operation。但相反,我需要做的是将其传递给OperationQueue。像这样的东西var queue = OperationQueue(); queue.addOperation(myOperation)

老问题。没有太多的Objective-C东西被问到,所以会把我的一分钱扔进去。可能会帮助某人。

有典型的EXC_BAD_ACCESS,并且正在与到底是什么原因导致它作斗争。

经过一番深思熟虑,我发现这是由我的代码引用块内定义的变量引起的,该变量是在块外部定义的,而不是使用__block前缀。并且引用的变量被传递给块内的方法调用,并从并定义为自动释放参数。

很难用言语解释。因此,一个示例 = 代码用于删除我使用块枚举的数组中的客户。传入"错误"。然后,我将其传递给块中调用的方法。错误参数的值在方法调用中更改。然后,我尝试在块之外引用此内容。这就是我获得错误访问权限的时候。可能与OP的问题有点无关,但是将问题放在此页面上,其他人可能会发现这很有用。

- (BOOL)deleteCustomer:(CHCustomer *)customer
                 error:(NSError *__autoreleasing*)error {
    __block BOOL success = YES;
    NSMutableArray *customerOrders = [self ordersForCustomer:customer 
                                                       error:error];
    if ([customerOrders count] > 0) {
        [customerOrders enumerateObjectsUsingBlock:^(id obj,
                                                     NSUInteger idx,
                                                     BOOL *stop) {
        
            CHOrderHeader *orderHeader = (CHOrderHeader *)obj;
            if (![self deleteOrderForOohSeqNo:[orderHeader oohSeqNo]
                    preserveExistingPhotoKeys:NO
                                        error:error]) {
            
                *stop = YES;
                success = NO;
            }
        }]; // enumerateObjectsUsingBlock
    }
    // EXC_BAD_ACCESS occurred on line below:    
    NSLog(@"Is this an NSError? %@", [*error class]);
    return success;
}
对我来说,

它与故事板有关的问题,可以选择为iOS 9.0和更高版本设置iOS 10.0及更高版本构建视图控制器构建。实际上,我想将版本从10降级到iOS 9.3。