在没有崩溃日志的情况下解析iOS崩溃堆栈跟踪信息

3

我正在使用BugSense来追踪iOS应用程序的崩溃。最近我注意到在live usage(实际使用)中,从符号化堆栈跟踪存在问题。

问题在于,苹果在iOS 4.3中引入了地址空间随机化,因此仅仅使用感兴趣的堆栈地址无法准确地获取导致崩溃的正确方法。

目前,我正在尝试通过计算来获取正确的地址。

symbol address = slide + stack address - load address

我已经有了幻灯片和堆栈地址,但据我所知,加载地址只能在崩溃报告中找到,而我无法通过BugSense获取该报告。 堆栈跟踪看起来像:

0 CoreFoundation 0x342723e7 + 162
1 libobjc.A.dylib 0x3bf63963 objc_exception_throw + 30
2 CoreFoundation 0x3427229d + 0
3 Foundation 0x34b48fa3 + 90
4 UIKit 0x360b5bd9 + 7640
5 MyApp 0x000c6e99 0xb3000 + 81561
6 UIKit 0x3623c2ff 0x3607e000 + 1827583
7 UIKit 0x361b8737 0x3607e000 + 1287991
8 UIKit 0x361a9869 0x3607e000 + 1226857
9 UIKit 0x361a97ad 0x3607e000 + 1226669
10 CoreFoundation 0x34247941 0x341b0000 + 620865
11 CoreFoundation 0x34245c39 0x341b0000 + 613433
12 CoreFoundation 0x34245f1d 0x341b0000 + 614173
13 CoreFoundation 0x341b923d CFRunLoopRunSpecific + 356
14 CoreFoundation 0x341b90c9 CFRunLoopRunInMode + 104
15 GraphicsServices 0x37d9733b GSEventRunModal + 74
16 UIKit 0x360d52b9 UIApplicationMain + 1120
17 MyApp 0x000b61bf 0xb3000 + 12735
18 MyApp 0x000b4a08 0xb3000 + 6664

有没有其他方法来符号化这个地址或获取相应的加载地址?

可能是 Symbolicating iPhone App Crash Reports 的重复问题。 - Ben S
@Benoit,我认为问题在于sven.b没有足够的声望来评论你刚刚发布的答案。而且sven.b认为,由于iOS 4.3中添加了空间随机化,因此该线程中给出的答案不再有效。 - Pascal Klein
谢谢Benoit,你提到的帖子有点过时了。 atos命令是正确的,但是如上所述,符号地址不能再从堆栈跟踪中获取。 - sven.b
1
你应该要求Bugsense提供完整的标准格式崩溃报告,以便获取所需的所有数据。加载地址显示在二进制图像部分中。如果他们不能提供,您可能需要考虑使用其他更好的服务。顺便说一下:所提出的重复接受答案确实是错误的,请参见我的评论:https://dev59.com/43M_5IYBdhLWcg3wQQld#vKSeEYcBWogLw_1bcVvK - Kerni
另外还有一个要求:您能否发布您所拥有的崩溃报告数据。根据显示的内容,也许可以推导出相关信息。 - Kerni
显示剩余2条评论
1个回答

1

加载地址0xb3000

幸运的是,您的应用程序二进制文件已经剥离了符号,否则这将不可见。

此外,这次崩溃是由于抛出异常,因此崩溃报告应该给您提供一个最后异常回溯,显示实际异常发生的位置和实际异常原因。很可能在发布的堆栈跟踪的第5行调用不会给您提供太多信息。您获取的崩溃信息看起来非常有限 :(


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