符号化 iOS 崩溃地址返回不适当的结果

Posted

技术标签:

【中文标题】符号化 iOS 崩溃地址返回不适当的结果【英文标题】:Symbolicating iOS crash address returns inappropriate results 【发布时间】:2014-03-27 15:04:17 【问题描述】:

我最近花了几天时间学习如何用自定义解决方案表示我收到的崩溃的行号。

我发现我需要 .app 和 .dSYM 文件,我检查了 UUID,它与我遇到的崩溃相同,我还需要验证 UUID。

三个相同的 UUID,架构是 arm64,我在 iPhone5S 上测试它的崩溃。

好的,假设我的堆栈跟踪中有两个与我的应用程序行相关。这是我得到的 JSON 的完整堆栈跟踪。

      "0   MyTestApp 0x10000efe8 0x100008000 + 28648",
      "1   UIKit 0x1863d90c8 0x186390000 + 299208",
      "2   UIKit 0x1863d905c 0x186390000 + 299100",
      "3   UIKit 0x1863c2538 0x186390000 + 206136",
      "4   UIKit 0x1863d8a5c 0x186390000 + 297564",
      "5   UIKit 0x1863d86f0 0x186390000 + 296688",
      "6   UIKit 0x1863d3388 0x186390000 + 275336",
      "7   UIKit 0x1863a4b68 0x186390000 + 84840",
      "8   UIKit 0x1863a2c58 0x186390000 + 76888",
      "9   CoreFoundation 0x18339b044 0x1832d0000 + 831556",
      "10  CoreFoundation 0x18339a3a0 0x1832d0000 + 828320",
      "11  CoreFoundation 0x183398638 0x1832d0000 + 820792",
      "12  CoreFoundation 0x1832d96d0 0x1832d0000 + 38608",
      "13  GraphicsServices 0x188fbdc0c 0x188fb0000 + 56332",
      "14  UIKit 0x18640afdc 0x186390000 + 503772",
      "15  MyTestApp 0x10000e4f0 0x100008000 + 25840",
      "16  libdyld.dylib 0x18fed3aa0 0x18fed0000 + 15008"

好的,现在我在包含 .app 和 .dSYM 文件的文件夹中运行 atos 命令来尝试查找和符号化内存地址。

xcrun atos -arch arm64 -o 'MyTestApp.app'/'MyTestApp' 0x10000efe8

但是这一行并不完全返回我可以使用的东西。

-[AFHTTPRequestSerializer multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:] (in MyTestApp) (AFURLRequestSerialization.m:317)

我仍在学习这个过程,但我相信 (in MyTestApp) 应该是我的测试应用程序中可读的内容。

我用来使应用程序崩溃并测试如何符号化堆栈跟踪的代码如下。

113 - (IBAction)logUnhandledException:(UIButton *)sender
114    
115    void (*nullFunction)() = NULL;
116    nullFunction();
117    

编辑: 我有"image_size": "0xa8000""image_base_address": "0x100008000"

我不应该得到一些关于这个方法和行号的信息(如果可行的话)吗?

感谢任何帮助和 cmets。

谢谢。

【问题讨论】:

您需要应用二进制文件的加载地址。为什么不使用已经解决所有问题的现有崩溃报告库?例如。基于PLCrashReporter.org的东西 感谢您的评论。实际上,我正在使用 PLCrashReporter,它很棒,这就是我获取堆栈跟踪的方式。它是如何解决这个问题的?说实话,我正在尝试更多地了解符号,更多方式等。还有更多帮助吗?如何获取加载地址?或者 PLCrashReporter 是如何解决这个问题的,这样我才能得到最好的结果。 加载地址是崩溃报告中Binary Images 部分的一部分。关于如何用数据进行符号化有很多问题和答案。搜索或检查我为此类问题多次给出的答案。 PLCrashReporter 具有在运行时生成完整报告的功能:plcrashreporter.org/documentation/api/v1.2-rc4/… 好的,我已经用图像大小和图像基地址更新了问题。这些有帮助吗?将进行研究,但我很想在这个线程中添加我的问题的答案。 OK,我试试generateLiveReportWithThread方法查看结果,查看崩溃报告的图片地址。 基地址 = 加载地址 【参考方案1】:

当您想符号化使用 -l 标志之后的加载地址(第二个地址,最好始终使用框架/库的图像基地址,但到目前为止,这在我的经验中从未改变过),然后此框架的所有符号地址、架构和您要符号化的框架的相应 ios 版本,或者如果它是您的应用程序的行,则使用 dSYM 文件,例如对于 iOS 8.1.1 的 UIKit 符号

xcrun atos -arch arm64 -o ~/Library/Developer/Xcode/iOS DeviceSupport/8.1.1 (12B436)/Symbols/System/Library/Frameworks/UIKit.framework/UIKit -l <load_address> <symbols_addressess> ...

用于您自己的应用程序线

xcrun atos -arch arm64 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp -l <load_address> <symbols_addressess> ...

你会得到所有合适的结果。

【讨论】:

以上是关于符号化 iOS 崩溃地址返回不适当的结果的主要内容,如果未能解决你的问题,请参考以下文章

atos 和 dwarfdump 不会象征我的地址

iOS 崩溃日志在线符号化实践

如何“手动”符号化 [NSThread callStackSymbols](获取 atos 的起始地址)(iOS)

xcode 4.5 上的符号化崩溃失败

符号化 iPad 崩溃日志后,回溯仍然不可读

Xcode 5.0 不符号化崩溃日志