如何从iOS崩溃日志中获取汇编代码

3
我正在处理一个难以重现的内存崩溃,并使用wwdc18 session 414提供的指导和这个so article提供的额外线索进行故障排除。
我没有问题地对堆栈跟踪进行符号化(请参见底部),但是当我尝试反汇编最后一帧的地址时,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...

作为替代方案,考虑使用Hopper对Flux库进行静态分析。您需要弄清楚ASLR,但最后3个十六进制数字将保持不变。 - Kamil.S
谢谢@Kamil.S,我尝试了一下,将可执行文件从.dSYM/Resources/DWARF加载到工具中,但每个指令都像db 0x00; '.'(就像这个https://reverseengineering.stackexchange.com/questions/27409/how-to-add-instruction-in-a-new-segment-in-hopper-disassembler-on-arm64)。你有成功让它工作的经验吗? - Hugo
抱歉,我应该让说明更清楚一些。你需要在Flux框架二进制文件上使用Hopper(就像@Jim Ingham在他的回答中提到的那样),而不是DWARF文件本身。 - Kamil.S
1个回答

0
dSYM 中的 DWARF 文件仅包含符号信息和调试信息,不包含二进制 TEXT 和 DATA 段的完整副本。如果在文件系统上的 dSYM 旁边有二进制副本,则 lldb 在加载 dSYM 时会同时加载该副本。或者您可以使用“target modules add”命令告诉 lldb 将二进制文件加载到当前会话中。

谢谢提供额外的线索。当涉及使用LLDB时,我是一个悲伤的新手...你能添加一些细节吗?我如何获取二进制文件 - 这是自动生成的文件,通常是Xcode存档的一部分,还是需要以特定方式生成的文件(例如.ipa文件)? - Hugo
@Hugo 在你解压后的ipa中,这将是 Frameworks/Flux.framework/Flux 二进制文件。我猜它会是 Flux。但我仍然期望名称与此非常接近。 - Kamil.S
1
Flux是一个Swift Package,我不认为它有自己的二进制文件。这就是说,所有的评论都非常有用...我花了一些时间才理解它的含义,但最终将MyApp.app包从归档中移动到了可在崩溃日志所引用的路径上使用(/private/var/containers/Bundle/Application/D048A52F-E4BE-4EE0-A1DA-9B0A4A9AE51B/MyApp.app)。在此之后,符号化和反汇编都开始工作了。 - Hugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接