【问题标题】:Xcode - Call stack trace on assert?Xcode - 在断言上调用堆栈跟踪?
【发布时间】:2011-01-18 01:05:42
【问题描述】:

现在,当我在 Xcode 中触发我的一个断言时,我会收到断言消息和堆栈转储,其中充满了对我来说意义不大的数字。

为了跟踪调用堆栈,需要我调试应用程序,并将其运行到断言发生的位置,并希望它再次断言。对于 100% 可重现的错误,这不是什么大问题,但仍然是浪费时间。

如果每次断言被命中时我都能得到一个调用堆栈跟踪会更好。

如何定义一个断言宏来转储 Xcode 中的调用堆栈跟踪?

【问题讨论】:

    标签: objective-c xcode assert callstack


    【解决方案1】:

    NSThread 有一个名为callStackSymbols 的类方法(而NSException 有一个同名的实例方法)。抱歉,我不经常使用异常,也不经常使用断言(对这两个事实都不感到自豪),所以我不确定断言宏应该做什么。

    #define AssertWithStackSymbols(x) \
    do { \
        if (!(x)) { \
            NSLog (@"%s failed assertion\n%@", #x, [NSThread callStackSymbols]); \
            abort(); \
        } \
    } while(0) 
    

    或者,正如 KennyTM 所指出的,您可以使用backtrace_symbols。甚至还有一种方法可以将符号直接输出到文件描述符backtrace_symbols_fd

    #define AssertWithStackSymbols(x) \
    do { \
        if (!(x)) { \
            void *stack[128]; \
            int count; \
            fputs (#x " failed assertion.\n", stderr); \
            count = backtrace (stack, sizeof stack / sizeof (void *)); \
            backtrace_symbols_fd (stack, count, STDERR_FILENO); \
        } \
    while (0)
    

    【讨论】:

    • 哦,忘了说:callStackSymbols 方法仅适用于 Mac OS X 10.6。
    • 在 OS X 10.5 和 iPhoneOS 上,您可以使用backtrace_symbols(3)
    【解决方案2】:

    在 iOS 4.x 上你可以使用 [NSThread callStackSymbols] 所以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 2012-01-29
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多