0

我试图在我的设备上表示崩溃日志。我有堆栈帧、每个帧的指令指针地址、IP 所在的模块以及该模块的偏移量。我的计划是用来dladdr()获取每个堆栈帧地址的函数或方法。

我正在尝试在新的应用程序启动时执行此操作,因此我不知道当前已加载库或加载了它们的地址。我可以使用它dlopen()来确保库是打开的,但我不确定要将我之前计算的偏移量添加到哪个基地址。

有没有办法确定库的加载位置或从返回的句柄的意义dlopen()

4

1 回答 1

1

在设备的下一次启动时进行符号化的问题是,您需要确保应用程序版本没有改变(如果您也想对它们进行符号化,那么您不应该这样做,因为您不会获得行号) 并且需要确保iOS版本也相同。因此,尝试打开它们可能会给您带来比您想要的更多的麻烦不成功的结果。

最安全、最可靠的方法是在您的 Mac 或服务器上进行符号化,您可以在其中收集所有符号,还可以获取您自己的应用程序代码的行号。

为什么不使用 PLCrashReporter 来收集崩溃日志?这以一种非常安全和可靠的方式完成了您所需要的一切,包括捕获异常、信号处理程序等。本文详细介绍了处理崩溃时遇到的一些问题:http: //landonf.bikemonkey.org/code/objc/Reliable_Crash_Reporting .20110912.html

请参阅https://code.google.com/p/plcrashreporter/和我们的分叉,在崩溃发生时添加了一些 Mac 支持和安全(!!)系统库符号,请参阅https://github.com/bitstadium /PLCrashReporterhttps://github.com/bitstadium/HockeySDK-iOS使用该分支。

一个重要的注意事项我忘了提及:自从 iOS 6 以来,很多符号在设备上进行符号化时都会导致“编辑”。您可能想要避免这种情况的另一个原因。

于 2012-10-02T23:03:58.693 回答