gpt4 book ai didi

objective-c - 什么是 "Abort trap"以及如何调试它?

转载 作者:太空狗 更新时间:2023-10-30 03:36:37 26 4
gpt4 key购买 nike

我每次编译我的项目时都会收到这条消息:

RunIPhoneUnitTest.sh: line 92: 31389 Abort trap              "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents

我知道我的代码有问题,但我不知道如何解决或找到它。

奇怪的是,我通过这个电话得到了这个:

-- This is the interface
@interface DbObject : NSObject {
NSInteger Id;
NSDate* timeStamp;
}

@property (nonatomic) NSInteger Id;
@property (nonatomic, retain) NSDate *timeStamp;
----
This fail with above error
----
NSString * filter = [NSString stringWithFormat:"id = %@", ds.Id, nil];

但奇怪的是,我删除了那一行、那个方法,但仍然得到它!让我发疯。

目前,我正在考虑删除代码直到没有错误并开始添加它,但想知道是否存在更实用的解决方案...

最佳答案

中止陷阱通常意味着在某处调用了中止。这很可能发生,因为您的单元测试工具代码正在抛出它不期望的异常,并通过调用 abort(3) 简单地处理它。 abort 调用不是很容易调试,因为它不提供有关谁调用它或为什么调用它的信息,从不返回并生成 SIGABRT。您可以为 SIGABRT 安装一个新的处理程序并在那里放置一个断点,然后至少检查当前的调用堆栈……但首先阅读其余部分以了解为什么会发生这种情况。

但是,上面代码的问题在于 NSInteger 不是对象类型,它是常规原语。要更正您的错误,请将失败的行替换为:

NSString *filter = [NSString stringWithFormat:@"id = %lld", (long long)ds.Id];

首先,stringWithFormat接受一个NSString对象作为参数,所以需要使用'@'字符来指定字符串字面量是一个NSString。这一点非常重要,因为 @"blah blah" 实际上被翻译成了一个对象。您对 stringWithFormat 的调用期望 NSString 对象信息驻留在该内存地址,但它获取的是一串字符,很可能在那里爆炸。确保所有字符串文字都是 @"blah blah",其中需要 NSString 类型,并且它们不是简单的 C 字符串。

其次,格式字符串中的“@”字符指定了一个对象。由于 NSInteger 不是对象,因此不能使用此格式字符。而是使用 %lld 来指定一个 long long 整数。最后,您不需要在使用 stringWithFormat 时在参数列表末尾添加 nil,因为格式字符串本身指定了期望的参数数量。

顺便说一句,使用 %lld 而不是 %d 的原因是 NSInteger 会根据您是否为 32 位编译而改变大小或 64 位目标。通过将 NSInteger 提升为 long long 类型并使用 %lld 说明符,您可以确保将来在为 64 位编译时不会出现截断问题并且您的 NSInteger 值需要超过 32 位来存储。

关于objective-c - 什么是 "Abort trap"以及如何调试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/431235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com