IT

Cocoa의 콘솔 / 로그에 스택 추적을 어떻게 인쇄합니까?

lottoking 2020. 3. 19. 08:31
반응형

Cocoa의 콘솔 / 로그에 스택 추적을 어떻게 인쇄합니까?


어설 션 실패 또는 포착되지 않은 예외와 같은 특정 지점에서 통화 추적을 기록하고 싶습니다.


 NSLog(@"%@",[NSThread callStackSymbols]);

이 코드는 모든 스레드에서 작동합니다.


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

Cocoa는 미처리 메모리 예외 일 뿐이지 만 캐치되지 않은 예외에 대한 스택 추적을 콘솔에 이미 기록합니다. 콘솔에서 기호 정보를 원한다면 Apple의 샘플 코드가 있습니다.

코드의 임의 지점에서 스택 추적을 생성하려면 (그리고 Leopard를 사용하는 경우) backtrace 매뉴얼 페이지를 참조하십시오. Leopard 이전에는 실제로 호출 스택 자체를 파헤쳐 야했습니다.


이것은 당신에게 무엇을 해야할지 거의 알려줍니다.

기본적으로 다음과 같이 로깅하도록 애플리케이션 예외 처리를 설정해야합니다.

#import <ExceptionHandling/NSExceptionHandler.h>

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

예외의 경우 예외 userInfo 사전의 NSStackTraceKey 멤버를 사용하여이를 수행 할 수 있습니다. Apple 웹 사이트의 예외대한 프로그램 응답 제어를 참조하십시오 .


이 방법으로 신속하게 인쇄하십시오.

print("stack trace:\(Thread.callStackSymbols)")

참고 : https://stackoverflow.com/questions/220159/how-do-you-print-out-a-stack-trace-to-the-console-log-in-cocoa

반응형