轻松打印应用程序的当前堆栈跟踪?

时间:2009-09-03 14:45:36

标签: iphone cocoa-touch xcode debugging uikit

Xcode / objective c并没有真正打印出有用的堆栈跟踪。我的应用程序崩溃了,该死的东西只给我45353453,34524323,6745345353,457634524234这样的数字。完全没用。

所以我想制作一个NSLog();在我的整个应用程序中的每个方法的开头。但也许有一种更简单的方法来找出真正的堆栈跟踪,人性可读?不仅在应用程序启动或崩溃时,而且在所有发生的活动中始终如此?有助于调试很多。

3 个答案:

答案 0 :(得分:5)

这样的事情对你也有帮助


@implementation UIApplication (MyCategory)

+ (void)logStackTrace {
    @try {
        [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise];
    }
    @catch (NSException *e) {
        NSLog(@"%@", [e callStackSymbols]);
    }
}

@end

答案 1 :(得分:3)

为objc_exception_throw添加一个全局断点,然后你可以在调试器中获得一个有用的堆栈跟踪。

How to add a breakpoint to objc_exception_throw?

答案 2 :(得分:1)

确实无法在应用内可靠地完成此操作。如果你的应用程序崩溃而没有给出符号,这听起来像是你运行的剥离版本而不是调试版本?

如果您有未解压缩的版本,则可以使用atos命令关联这些数字与堆栈帧的实际名称(请参阅终端中的man atos或搜索atos在Xcode的文档或Google)中。

您可能不希望记录每个方法调用的堆栈。信息量很快就会变得无法抗拒。关于为什么你的应用程序中的大多数方法被调用都不应该是一个谜(尽管需要一段时间来理解为什么UIKit和你的应用程序之间的界面按照它的方式工作)。