Ответ 1
NSLog(@"%@",[NSThread callStackSymbols]);
Этот код работает в любом потоке.
Я хотел бы зарегистрировать трассировку вызова в определенные моменты, например, неудачные утверждения или неотображаемые исключения.
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]
Для исключений вы можете использовать элемент NSStackTraceKey словаря пользовательских данных исключения для этого. См. Управление откликом программы на Исключения на веб-сайте Apple.