当前位置:  开发笔记 > IOS > 正文

什么是"中止陷阱"以及如何调试它?

如何解决《什么是"中止陷阱"以及如何调试它?》经验,为你挑选了1个好方法。

我每次编译项目时都收到此消息:

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];

但是,我想删除那条线,那个方法仍然可以得到它!让我疯了.

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



1> Jason Coco..:

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

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

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

首先,stringWithFormatNSString对象作为参数,因此您需要使用"@"字符来指定字符串文字是NSString.这非常重要,因为@"blah blah"它实际上被翻译成了一个对象.你正在进行的调用stringWithFormat是期望NSString对象信息驻留在该内存地址,但是它获得了一串字符并且很可能在那里爆炸.确保所有字符串文字都是@"blah blah"预期的NSString类型,并且它们不是简单的c字符串.

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

顺便说一下,使用的原因%lld%dNSInteger根据您是编译32位还是64位目标而改变大小.通过将NSInteger提升为long long类型并使用说明%lld符,如果编译为64位并且NSInteger值需要存储超过32位,则确保将来不会出现截断问题.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有