Ich möchte die Anrufverfolgung an bestimmten Punkten protokollieren, z. B. bei fehlgeschlagenen Zusicherungen oder nicht erfassten Ausnahmen.
Ich möchte die Anrufverfolgung an bestimmten Punkten protokollieren, z. B. bei fehlgeschlagenen Zusicherungen oder nicht erfassten Ausnahmen.
Antworten:
NSLog(@"%@",[NSThread callStackSymbols]);
Dieser Code funktioniert in jedem Thread.
backtrace/backtrace_symbols
direkt verwenden
Die Antwort von n13 hat nicht ganz funktioniert - ich habe sie leicht modifiziert, um dies zu erreichen
#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;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
wenn Sie die tatsächliche Ausnahme auch möchten
Cocoa protokolliert den Stack-Trace bereits bei nicht erfassten Ausnahmen in der Konsole, obwohl es sich nur um Rohspeicheradressen handelt. Wenn Sie symbolische Informationen in der Konsole wünschen, gibt es einen Beispielcode von Apple.
Wenn Sie an einer beliebigen Stelle in Ihrem Code eine Stapelverfolgung generieren möchten (und sich auf Leopard befinden), lesen Sie die Manpage zur Rückverfolgung. Vor Leopard mussten Sie tatsächlich den Call-Stack selbst durchsuchen.
Dies sagt Ihnen ziemlich genau, was zu tun ist.
Im Wesentlichen müssen Sie die Ausnahmebehandlung für Anwendungen für die Protokollierung einrichten.
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Für Ausnahmen können Sie dazu das NSStackTraceKey-Mitglied des userInfo-Wörterbuchs der Ausnahme verwenden. Siehe Steuern der Reaktion eines Programms auf Ausnahmen auf der Apple-Website.
backtrace
undbacktrace_symbols
; Siehe die Manpage backtrace (3).