Я хотел бы зарегистрировать трассировку вызова в определенные моменты, например, неудачные утверждения или неотображаемые исключения.
Как распечатать трассировку стека на консоль/журнал в Cocoa?
Ответ 1
NSLog(@"%@",[NSThread callStackSymbols]);
Этот код работает в любом потоке.
Ответ 2
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
Cocoa уже регистрирует трассировку стека на неперехваченных исключениях на консоли, хотя они являются просто необработанными адресами памяти. Если вам нужна символическая информация на консоли, пример кода от Apple.
Если вы хотите создать трассировку стека в произвольной точке вашего кода (и вы находитесь на Leopard), см. справочную страницу backtrace. До Leopard вам действительно приходилось прорываться через стек вызовов.
Ответ 4
Это в значительной степени говорит вам, что делать.
По существу вам нужно настроить обработку исключений приложений для журнала, например:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Ответ 5
Для исключений вы можете использовать элемент NSStackTraceKey словаря пользовательских данных исключения для этого. См. Управление откликом программы на Исключения на веб-сайте Apple.