使用 Xcode(4.3.3 和 llvm),我在所有异常上设置了一个断点,但通常当断点被命中时,堆栈看起来像这样:
(lldb) bt
* thread #1: tid = 0x1c03, 0x31a891c4 libobjc.A.dylib`objc_exception_throw, stop reason = breakpoint 1.1
frame #0: 0x31a891c4 libobjc.A.dylib`objc_exception_throw
frame #1: 0x33a677b8 CoreFoundation`+[NSException raise:format:arguments:] + 100
没有关于调用者的信息NSException raise:format:arguments:
,堆栈就停在那里。
一定有什么东西叫了raise,那么堆栈发生了什么?我应该寻找什么来帮助我调试此类问题(例如,这是否表明某种特定类型的堆栈损坏或其他)?
更新:这是带有垃圾的代码。
问题是当我指的是 %@ 时,我不小心写了 %s。将其称为正确分配的字符串可能有点牵强,但我可以在 llvm 控制台中“po imageName”,它最后只是有一些垃圾。
NSString *imageName = [NSString stringWithFormat:@"award_%s", award];
UIImage *image = [UIImage imageNamed:imageName];
[_awardIconMapping setObject:image forKey:award];
到异常发生时,没有线程#0。使用@try/@catch,我从最后一行得到了一个合理的异常(对不起,我认为这是之前的 image= 行):
2012-07-06 10:43:36.184 CallVille[834:707] ****** Hit exception ********
-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: wiseGuy)