Как получить номер строки, имя метода и имя класса при сбое с использованием Objective C

Я разрабатываю приложение, в котором я должен отслеживать сбои. Существует ограничение, что я не могу использовать какой-либо сторонний источник, такой как платформа Twitter Fabric, для обработки журнала сбоев.

В настоящее время я могу только получить причину сбоя. Я не могу определить точную точку падения.

Что я делаю:

В методе didFinishLaunchingWithOptions моего делегата приложения я создал свой собственный обработчик исключений:

    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

uncaughtExceptionHandler ----

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"CRASH: %@", exception);
    NSLog(@"callStackSymbols: %@", [exception callStackSymbols]);
    NSLog(@"callStackReturnAddresses: %@", [exception callStackReturnAddresses]);
    NSLog(@"reason: %@", [exception reason]);
    NSLog(@"name: %@", [exception name]);    
    NSLog(@"%s %d %s %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);
// Internal error reporting
}

Я разбил свое приложение методом viewDidLoad, используя это:

   NSArray *myary;

   myary = [NSArray arrayWithObjects:@"sad", nil];

   NSString *str =  [myary objectAtIndex:22];

Вот моя трассировка стека.

Есть ли у них способ добиться того, чего я хочу?

Я пробовал следовать этим решениям из SO, но они не дают мне никаких указаний:

Решение 1

Решение 2


person Dalvik    schedule 23.06.2016    source источник
comment
ваш последний оператор NSLOg имеет имя класса вместе с именем метода, верно? Что еще тебе нужно ?   -  person Teja Nandamuri    schedule 23.06.2016
comment
@TejaNandamuri, это номер строки метода appDelegates ... но я хочу указать номер строки точки сбоя и имя метода   -  person Dalvik    schedule 23.06.2016
comment
вы получаете имя метода, так что вам нужен точный номер строки, верно?   -  person Teja Nandamuri    schedule 23.06.2016
comment
@TejaNandamuri Мне нужен номер строки для [myary objectAtIndex:22]; this ... но номер строки, который я получаю, относится к этому `NSLog(@%s %d %s %s, FILE, LINE , PRETTY_FUNCTION, FUNCTION);`   -  person Dalvik    schedule 23.06.2016
comment
да, кажется, что это невозможно, поскольку номер строки не включен в журнал сбоев. Даже инструменты для сбоев, такие как crashlytics или Fabric, не могут получить номер. Они получают только номер строки метода.   -  person Teja Nandamuri    schedule 23.06.2016
comment
Такие службы, как Crashlytics, получают номер строки, анализируя dsym файлы, которые вы загружаете (обычно с помощью сценария этапа сборки). dsym имеет сопоставление между фрагментами кода и номером файла и строки, из которых они были скомпилированы.   -  person Avi    schedule 23.06.2016
comment
Я понимаю вашу обеспокоенность, когда вы говорите, что использование третьих лиц ограничено, поскольку вы не хотите, чтобы данные передавались им. Однако вы можете использовать средство отслеживания сбоев с открытым исходным кодом, например plcrashreporter.org, или, возможно, окунуться в их код, чтобы проверить   -  person Ganesh Somani    schedule 24.06.2016