使用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:
调用者的信息,堆栈就在那里停止了。
有什么必须调用加注所以堆栈发生了什么?我应该寻找什么来帮助我调试这些问题(例如,这是否表明某些特定类型的堆栈损坏或其他原因)?
更新:这里是带垃圾的代码。
问题是当我的意思是%@时,我不小心写了%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)
答案 0 :(得分:0)
我使用此函数从NSException打印堆栈跟踪:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
+ (void) printStackTrace: (NSException*) e
{
NSArray * addresses = [e callStackReturnAddresses];
if( [addresses count])
{
void * backtrace_frames[[addresses count]];
int i = 0;
for (NSNumber * address in addresses)
{
backtrace_frames[i] = (void *)[address unsignedLongValue];
i++;
}
char **frameStrings = backtrace_symbols(&backtrace_frames[0], [addresses count]);
if(frameStrings != NULL)
{
int x;
for(x = 0; x < [addresses count]; x++)
{
NSString *frame_description = [NSString stringWithUTF8String:frameStrings[ x]];
NSLog( @"------- %@", frame_description);
}
free( frameStrings);
frameStrings = nil;
}
}
}