如何从其中的库和地址列表中进行符号化?

时间:2012-10-02 22:32:46

标签: ios dlopen

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

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

有没有办法确定加载库的位置或理解dlopen()返回的句柄?

1 个答案:

答案 0 :(得分: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以来,许多符号在设备上进行符号化时会导致“编辑”。你可能想避免这种情况的另一个原因。