Цель:Как "вручную" symbolicate [NSThread callStackSymbols] (получить начальный адрес для Atos) (IOS)
Я хочу symbolicate на "выход" из [NSThread callStackSymbols]
.
Боковых Примечания:
Я знаю, как сделать это с крешлогами. Тем не менее, мне нужно исследовать некоторые проблемы, когда я хотел бы посмотреть на стек вызовов. К сожалению, в наши дни адреса каркаса - все <redacted>
. Причинение сбоя в правильных точках (или в конце - см. Конец моего вопроса) не совсем приемлемо, но если я не смогу найти другое решение, это будет путь.
Мне нужно запустить мои тесты на устройстве, поэтому я не могу использовать Симулятор.
Текущий подход:
Когда я называю это:
NSLog(@"call stack:\n%@", [NSThread callStackSymbols]);
я получаю этот выход:
2015-12-08 15:04:03.888 Conversion[76776:4410388] call stack:
(
0 Conversion 0x000694b5 -[ViewController viewDidLoad] + 128
1 UIKit 0x27259f55 <redacted> + 1028
...
9 UIKit 0x274f67a7 <redacted> + 134
10 FrontBoardServices 0x2b358ca5 <redacted> + 232
11 FrontBoardServices 0x2b358f91 <redacted> + 44
12 CoreFoundation 0x230e87c7 <redacted> + 14
...
16 CoreFoundation 0x23038ecd CFRunLoopRunInMode + 108
17 UIKit 0x272c7607 <redacted> + 526
18 UIKit 0x272c22dd UIApplicationMain + 144
19 Conversion 0x000767b5 main + 108
20 libdyld.dylib 0x34f34873 <redacted> + 2
)
("Преобразование" в этом выводе приложение.)
Теперь я могу использовать эту команду, чтобы «символизировать» объявление платья:
xcrun atos -o /path/to/Conversion.app -arch arm64 -l 0x0???
Run так (конечно, с соответствующим значением для -l
), можно вводить адреса как 0x000694b5
и выложит что-то вроде -[ViewController viewDidLoad] + 128
. Конечно, проблема заключается в начальном адресе (значение опции -l).
Когда у меня есть журнал сбоев, я могу получить их. Однако я хотел бы уйти без крушения.
Вопросы:
Q1: Могу ли я определить начальный адрес во время выполнения и, возможно, включить его в выходной журнал, так что я могу кормить его к Atos -l
вариант?
EDIT: Похоже, что это возможно, как это: (спасибо NSProgrammer ответа https://stackoverflow.com/a/12464678/1396265)
#import <mach-o/dyld.h>
...
intptr_t slide = _dyld_get_image_vmaddr_slide(0);
const struct mach_header * load_addr = _dyld_get_image_header(0);
NSLog(@"slide %lx load addr %lx", (long)slide, (long)load_addr);
/EDIT
(как я заинтересован в вызове методы фреймворки, я, конечно, нужен начальные адреса фреймворков. Начальный адрес приложения часто изменяется (рандомизация), я еще не знаю, были ли рандомизированы начальные адреса каркаса.)
Q2: Существуют ли другие подходы к исследованию методов в стеке вызовов? (точки останова также довольно неуклюжи в моем сценарии.)
EDIT:
Q3: Как я могу symbolicate адреса рамок? Например, где я могу найти dSYM (или что-то еще) для UIKit?
(К примеру у меня есть что-то на:. ~/Library/Developer/Xcode/iOS\ DeviceSupport/9.1\ \(13B143\)/Symbols/System/Library/Frameworks/UIKit.framework/
я изучу более подробно здесь.)
/EDIT
Может быть, решение:
Одним из способов может быть, сохранить вывод журнала в файл, а в конце тестов вызвать сбой в приложении. Таким образом, в журнале сбоев будут отображаться начальные адреса и с информацией стека вызовов из журналов, которые я должен иметь возможность отображать вывод callStackSymbols
. Я попробую это дальше.
Есть несколько способов сделать это, если symbolicatecrash не работает, в том числе Atos, dwarfdump и lldb. Существует очень приятная запись о полном символическом процессе [здесь] (https://www.apteligent.com/developer-resources/symbolicating-an-ios-crash-report/?partner_code=GDC_so_symbolicateios), который может быть дополнительная помощь – cjbeauchamp