Как получить код сборки из аварийного журнала iOS
Я имею дело с трудно воспроизводимым памяти и устранением неполадок, используя рекомендации, приведенные в сбоемсеансе 414 wwdc18, с дополнительными подсказками из этой статьи.
У меня нет проблем с символизацией трассировки стека (см. Внизу), но когда я пытаюсь разобрать адрес из последнего кадра, я получаю эту ошибку из консоли lldb:
(lldb) disassemble -a 0x00000001052faed4
error: error reading data from section __text
error: Failed to disassemble memory in function at 0x1052faed4.
Сбои памяти сложны, и в этом случае мне действительно нужны дополнительные подсказки из кода сборки, чтобы разобраться.
К сожалению, видео WWDC проходит через установку / конфигурацию, предполагая, что оно должно работать... но это не так. Я подозреваю, что в видео отсутствует какая-то важная конфигурация? Кто-нибудь знает, как попасть в ассемблерный код?
Для справки, это верхняя часть символьной трассировки стека (показывающая сбойный поток)
Thread[0] EXC_BAD_ACCESS (SIGSEGV) (KERN_INVALID_ADDRESS at 0x8000000000000010 -> 0x0000000000000010 (possible pointer authentication failure))
[ 0] 0x00000001052faed4 myApp`Flux.FASFluxDispatcher.invokeCallback(token: Swift.String) -> () + 60
[ 1] 0x00000001052faecf myApp `Flux.FASFluxDispatcher.invokeCallback(token: Swift.String) -> () + 55
[ 2] 0x00000001052fb2eb myApp `closure #1 () -> () in Flux.FASFluxDispatcher.doDispatch(action: Any) -> () + 195
[ 3] 0x00000001052feeb7 myApp `partial apply forwarder for reabstraction thunk helper from @callee_guaranteed () -> (@error @owned Swift.Error) to @escaping @callee_guaranteed () -> (@out (), @error @owned Swift.Error) + 19
[ 4] 0x00000001bff1ef30 autoreleasepool<A>(invoking:) + 64 (ObjectiveC.swift:172)
[ 5] 0x00000001052fb5af myApp `Flux.FASFluxDispatcher.dispatchAction(action: Any) -> () + 339
[ 6] 0x00000001052ff77f myApp `partial apply forwarder for closure #1 () -> () in Flux.FASActionCreator.dispatchAsync(action: Any, completion: Swift.Optional<() -> ()>) -> () + 111
[ 7] 0x00000001052fc0bf myApp `reabstraction thunk helper from @escaping @callee_guaranteed () -> () to @escaping @callee_unowned @convention(block) () -> () + 19
[ 8] 0x000000019967024c _dispatch_call_block_and_release + 32 (init.c:1454)
[ 9] 0x0000000199671db0 _dispatch_client_callout + 20 (object.m:559)
[ 10] 0x000000019967f7ac _dispatch_main_queue_callback_4CF + 836 (inline_internal.h:2548)
[ 11] 0x00000001999f911c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16 (CFRunLoop.c:1790)
[ 12] 0x00000001999f3120 __CFRunLoopRun + 2508 (CFRunLoop.c:3118)
[ 13] 0x00000001999f221c CFRunLoopRunSpecific + 600 (CFRunLoop.c:3242)
[ 14] 0x00000001b15bc784 GSEventRunModal + 164 (GSEvent.c:2259)
[ 15] 0x000000019c432ee8 -[UIApplication _run] + 1072 (UIApplication.m:3253)
[ 16] 0x000000019c43875c UIApplicationMain + 168 (UIApplication.m:4707)
[ 17] 0x0000000104edcf67 myApp `main + 67 at AppDelegate.swift:29:9
[ 18] 0x00000001996b26b0 start + 4
Thread[1]
[ 0] 0x00000001c79cd1ac __psynch_cvwait + 8
[ 1] etc...
1 ответ
Файл DWARF в dSYM содержит только символьную и отладочную информацию, он не содержит полной копии сегментов TEXT и DATA двоичного файла. Если есть копия двоичного файла рядом с dSYM в файловой системе, lldb загрузит ее при загрузке dSYM. Или вы можете использовать
target modules add
команда, указывающая lldb загрузить двоичный файл в текущий сеанс.