【问题标题】:Easy way to print current stack trace of an app?打印应用程序当前堆栈跟踪的简单方法?
【发布时间】:2010-11-25 07:44:44
【问题描述】:

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

所以我想做一个 NSLog();在我的整个应用程序中使用的每种方法的开头。但也许有一种更简单的方法来找出真正的堆栈跟踪,人类可读?不仅在应用程序启动或崩溃时,而且一直在发生的每一项活动中?对调试有很大帮助。

【问题讨论】:

  • 你可以在调试器中跟踪堆栈跟踪,它应该带你到我认为崩溃前的最后一个方法调用
  • 不,调试器信息并没有真正的帮助。
  • 为什么调试器信息没有帮助?如果你在调试器中启动你的应用程序,它崩溃了,调试器应该提供一个很好的堆栈跟踪,你可以返回查看每个调用的行。如果您的应用程序因异常而停止,请参阅 alex_c 的答案以了解如何调试。

标签: iphone cocoa-touch xcode debugging uikit


【解决方案1】:

这样的事情也可能对你有帮助


@implementation UIApplication (MyCategory)

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

@end

【讨论】:

  • 这在 iOS 4 之前很有用。在 iOS 4+ 上使用 [NSThread callStackSymbols]。
【解决方案2】:

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

How to add a breakpoint to objc_exception_throw?

【讨论】:

    【解决方案3】:

    真的没有办法在应用程序中可靠地做到这一点。如果您的应用程序崩溃并且没有给出符号,这听起来像是您运行的是剥离版本而不是调试版本?

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

    您可能不想记录每个方法调用的堆栈。信息量很快就会变得不堪重负。并且为什么您的应用程序中的大多数方法都被调用,这不应该是一个谜(尽管需要一段时间才能理解为什么 UIKit 和您的应用程序之间的接口以它的方式工作)。

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多