Подтвердить что ты не робот

Символизирующая трассировка стека без сбоев

Есть ли способ символизировать трассировку стека, которая не является полным сообщением о сбое?

Я регистрирую результат строки [NSThread callStackSymbols] на нашем сервере. Это не дает полностью отформатированный отчет о сбоях, а просто несимметричную трассировку стека (пример ниже).

Я попытался символизировать именно это. Я также попытался заменить трассировку потока потока 0 фактического отчета о сбое из той же сборки. Ничего не сработало. У меня есть dSYM сборки в архиве приложения. Есть ли способ сделать это, не оставляя символы в сборке распределения?

0   domino free                         0x00072891 domino free + 465041
1   domino free                         0x000ea205 domino free + 954885
2   domino free                         0x000ea033 domino free + 954419
3   domino free                         0x0007fe55 domino free + 519765
4   domino free                         0x0006f6d5 domino free + 452309
5   domino free                         0x0006f7a3 domino free + 452515
6   domino free                         0x0006fb9b domino free + 453531
7   Foundation                          0x30558c29 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0 + 16
8   Foundation                          0x304b06d9 -[NSURLConnectionInternalConnection invokeForDelegate:] + 28
9   Foundation                          0x304b06a3 -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 198
10  Foundation                          0x304b05c5 -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 60
11  CFNetwork                           0x31f297f5 _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 192
12  CFNetwork                           0x31f1e4a5 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 424
13  CFNetwork                           0x31f1e599 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 668
14  CFNetwork                           0x31f1e1a3 _ZN19URLConnectionClient13processEventsEv + 106
15  CFNetwork                           0x31f1e0d9 _ZN17MultiplexerSource7performEv + 156
16  CoreFoundation                      0x30abead3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
17  CoreFoundation                      0x30abe29f __CFRunLoopDoSources0 + 214
18  CoreFoundation                      0x30abd045 __CFRunLoopRun + 652
19  CoreFoundation                      0x30a404a5 CFRunLoopRunSpecific + 300
20  CoreFoundation                      0x30a4036d CFRunLoopRunInMode + 104
21  GraphicsServices                    0x30e7f439 GSEventRunModal + 136
22  UIKit                               0x3123acd5 UIApplicationMain + 1080
23  domino free                         0x0004fd3b domino free + 322875
24  domino free                         0x00004004 domino free + 12292
4b9b3361

Ответ 1

Я столкнулся с той же проблемой, и этот ответ сработал у меня: fooobar.com/questions/16671/...

Вы можете использовать atos для обозначения отдельных адресов, если у вас есть dSYM.

пример команды:

atos -arch armv7 -o 'app name.app'/'app name' 0x000000000

Ответ 2

Я не думаю, что это возможно. [NSThread callStackSymbols] возвращает адрес памяти функций. Он не может быть символизирован без сброса памяти сразу после сбоя. При сбое адреса различаются для каждого устройства. Даже на одном устройстве, если вы перезагрузите телефон, адреса изменились после очередного сбоя. Несколько парней упомянули atos, но это для журнала сбоев, а не для callStackSymbols.

Ответ 3

Я знаю, что это довольно старый вопрос, но у меня была такая же проблема сейчас, и на то, чтобы найти ответ, потребовалось довольно много времени, поэтому я подумал, что лучше документировать его (где-то).

Если у вас есть dSYM для версии приложения, откуда начинается трассировка стека, вы можете превратить это во что-то полезное. Чтение этого ответа здесь приводит к этой статье, которая мне очень помогла. У меня была эта строка поверх моей трассировки стека:

0    MyApp                           0x000000010010da68 MyApp + 236136
                                     ^ stack address            ^ symbol offset

У вас есть два варианта, оба связаны с некоторой математикой. Если вы идете с помощью atos, вам просто нужно сделать математику один раз, и вы можете найти все шаги одним вызовом.

Используя atos

Чтобы использовать atos, вам понадобится адрес стека из трассировки стека, и вам нужно узнать адрес загрузки через некоторую математику:

  • Рассчитайте значение load address, вычитая значение смещения символа из значения стека (load address= stack address - symbol offset), конечно, вы должны преобразовать их в одну базу, чтобы сделать это

    В моем случае это было 0x1000D4000

  • Найдите записи трассировки стека с помощью atos, используя адрес загрузки и адреса стека из трассировки стека с atos -arch <architecture> -o <path to executable inside (!) the dSYM> -l <load address> <stack address 1> <stack address 2> ...

    В моем случае это было atos -arch arm64 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp -l 0x1000D4000 0x000000010010da68

Пожалуйста, имейте в виду, что вы должны указать путь к фактическому исполняемому файлу внутри dSYM, иначе вы получите сообщение об ошибке. Самое приятное в том, что все это с помощью atos заключается в том, что вы можете просто перечислить все адреса из вашей трассировки стека, и вы сразу получите читаемый формат.

Используя dwarfdump

Чтобы использовать dwarfdump, вам понадобится адрес файла, соответствующий адресу стека в трассировке стека.

  • Узнайте значение слайд для архитектуры, в которой происходит трассировка стека (см. "Получение значения слайда в связанной статье" ).

    В моем случае это было 0x100000000 для 64-битного.

  • Преобразуйте значение символьного смещения (число справа после MyApp +... в трассировке стека, 236136 в моем случае), чтобы перейти в шестнадцатеричный код и добавить результат в слайд. Число, которое вы получаете сейчас, называется адресом файла (file address= symbol offset + slide)

    В моем случае это привело к 0x100039A68.

  • Найдите записи трассировки стека с помощью dwarfdump, используя адрес файла с dwarfdump --lookup <file address> --arch <architecture> <path to dSYM>

    В моем случае это было dwarfdump --lookup 0x100039A68 --arch arm64 MyApp.dSYM