programing

스택 트레이스를 코코아 콘솔/로그로 출력하려면 어떻게 해야 합니까?

showcode 2023. 4. 15. 09:40
반응형

스택 트레이스를 코코아 콘솔/로그로 출력하려면 어떻게 해야 합니까?

실패한 어설션이나 포착되지 않은 예외와 같은 특정 포인트의 콜 트레이스를 기록하려고 합니다.

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

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

콜 스택 기호를 포함하는 배열을 반환합니다.각 요소는NSString에 의해 결정되는 형식의 값을 가진 오브젝트backtrace_symbols()기능.

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 man 페이지를 참조해 주세요.Leopard 이전에는 콜 스택 자체를 조사해야 했습니다.

이것으로 무엇을 해야 할지 알 수 있습니다.

기본적으로 다음과 같이 기록할 응용 프로그램 예외 처리를 설정해야 합니다.

#import <ExceptionHandling/NSExceptionHandler.h>

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

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

빠른 인쇄 방법:

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

NSString으로 받고 싶다면.

[NSThread  callStackSymbols].description

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

반응형