代码之家  ›  专栏  ›  技术社区  ›  robottobor

如何在Cocoa中打印出控制台/日志的堆栈跟踪?

  •  304
  • robottobor  · 技术社区  · 16 年前

    我想记录 呼叫跟踪 在某些情况下,比如断言失败或未捕获的异常。

    7 回复  |  直到 3 年前
        1
  •  563
  •   Paulo Mattos    3 年前

    这段代码适用于任何线程:

    NSLog(@"%@", NSThread.callStackSymbols);
    

    返回一个包含调用堆栈符号的数组。每个元素都是一个 NSString 对象,其值的格式由 backtrace_symbols() 功能。

        2
  •  35
  •   Cœur Gustavo Armenta    6 年前

    n13的答案不太奏效——我稍微修改了一下,得出了这个结论

    #import <UIKit/UIKit.h>
    
    #import "AppDelegate.h"
    
    int main(int argc, char *argv[])
    {
        @autoreleasepool {
            int retval;
            @try{
                retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
            }
            @catch (NSException *exception)
            {
                NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
                @throw;
            }
            return retval;
        }
    }
    
        3
  •  9
  •   Cœur Gustavo Armenta    6 年前

    Cocoa已经将未捕获异常的堆栈跟踪记录到控制台,尽管它们只是原始内存地址。如果你想在控制台中获得符号信息,有一些 sample code 来自苹果。

    如果您想在代码中的任意点生成堆栈跟踪(并且您使用的是Leopard),请参阅回溯手册页。在Leopard之前,您实际上必须挖掘调用堆栈本身。

        4
  •  6
  •   Cœur Gustavo Armenta    6 年前

    This 几乎告诉你该做什么。

    本质上,您需要设置应用程序异常处理以记录日志,类似于:

    #import <ExceptionHandling/NSExceptionHandler.h>
    
    [[NSExceptionHandler defaultExceptionHandler] 
                      setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                                NSLogUncaughtSystemExceptionMask | 
                                                NSLogUncaughtRuntimeErrorMask]
    
        5
  •  2
  •   Ben Gottlieb    16 年前

    对于异常,您可以使用异常的userInfo字典的NSStackTraceKey成员来执行此操作。看见 Controlling a Program's Response to Exceptions 在苹果公司的网站上。

        6
  •  1
  •   Dipak    6 年前

    以这种方式快速打印:

    print("stack trace:\(Thread.callStackSymbols)")
    
        7
  •  -2
  •   miragessee    3 年前

    如果你想把它作为NSString。

    [NSThread  callStackSymbols].description