我试图在我的设备上表示崩溃日志。我有堆栈帧、每个帧的指令指针地址、IP 所在的模块以及该模块的偏移量。我的计划是用来dladdr()
获取每个堆栈帧地址的函数或方法。
我正在尝试在新的应用程序启动时执行此操作,因此我不知道当前已加载库或加载了它们的地址。我可以使用它dlopen()
来确保库是打开的,但我不确定要将我之前计算的偏移量添加到哪个基地址。
有没有办法确定库的加载位置或从返回的句柄的意义dlopen()
?
在设备的下一次启动时进行符号化的问题是,您需要确保应用程序版本没有改变(如果您也想对它们进行符号化,那么您不应该这样做,因为您不会获得行号) 并且需要确保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 /PLCrashReporter和https://github.com/bitstadium/HockeySDK-iOS使用该分支。
一个重要的注意事项我忘了提及:自从 iOS 6 以来,很多符号在设备上进行符号化时都会导致“编辑”。您可能想要避免这种情况的另一个原因。