当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将堆栈跟踪打印到Cocoa中的控制台/日志?》经验,为你挑选了4个好方法。

我想在某些点记录调用跟踪,例如失败的断言或未捕获的异常.



1> smokris..:
 NSLog(@"%@",[NSThread callStackSymbols]);

此代码适用于任何线程.


Mac OS X 10.6中的新功能,在最初询问此问题时不存在.对于Snow-Leopard之前,使用`backtrace`和`backtrace_symbols`函数; 请参阅backtrace(3)联机帮助页.
仅适用于iOS 4.0及更高版本.
也适用于iOS.

2> Zayin Krige..:

n13的答案并不是很有效 - 我稍微修改了它以得出这个

#import 

#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;
    }
}


Gah ...... Apple应该至少在开发应用程序时将其作为标准.一堆内存地址是......过时的

3> vt...:

Cocoa已经将未捕获的异常的堆栈跟踪记录到控制台,尽管它们只是原始内存地址.如果您想在控制台中获得符号信息,那么Apple会提供一些示例代码.

如果要在代码中的任意点生成堆栈跟踪(并且您在Leopard上),请参阅backtrace手册页.在Leopard之前,你实际上不得不深入挖掘调用堆栈本身.


显然可以在iOS 4中使用,但不能在3.2中使用.这是我使用的,从backtrace手册页无耻地复制:#include ... void*callstack [128]; int i,frames = backtrace(callstack,128); char**strs = backtrace_symbols(callstack,frames); for(i = 0; i
4> Max Stewart..:

这几乎告诉你该怎么做.

基本上,您需要设置应用程序异常处理以进行记录,例如:

#import 

[[NSExceptionHandler defaultExceptionHandler] 
                  setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                            NSLogUncaughtSystemExceptionMask | 
                                            NSLogUncaughtRuntimeErrorMask]

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有