Android ARM C ++异常调试

我有一个程序的回溯堆栈(在Android ARM上运行),如下所示:

#00 pc 0001d796 /system/lib/libc.so (abort+57) [armeabi-v7a]
#01 pc 0004f663 libxx.so (__gnu_cxx::__verbose_terminate_handler()+226) [armeabi-v7a]
#02 pc 00024709 libxx.so (__cxxabiv1::__terminate(void (*)())+4) [armeabi-v7a]
#03 pc 0002477d libxx.so (std::terminate()+8) [armeabi-v7a]
#04 pc 0058f3d3 libxxx_sdk.so [armeabi-v7a]
#05 pc 00065ac7 /system/lib/libc.so (__pthread_start(void*)+22) [armeabi-v7a]
#06 pc 0001e9ad /system/lib/libc.so (__start_thread+32) [armeabi-v7a]

这可能是由异常引起的,但是我无法弄清楚libxxx_sdk.so中抛出该异常的位置。

那么,我能做些什么使回溯对我来说更有价值,以便找出正确的问题?

注意:

  • 我没有coredump文件,系统仅报告回溯信息。
  • 此问题无法在本地重现。
  • 当程序在用户的Android手机上运行时,很少发生此问题。

更新1

我用objdump -Cd转储了libxxx_sdk.so,并把地址定位在0058f3d3附近,但仍然不知道下面是谁叫__pointer_catch

0055c290 <__cxxabiv1::__pointer_type_info::__pointer_catch(__cxxabiv1::__pbase_type_info const*,void**,unsigned int) const>:
~~~
...
~~~
  58f3c0:       e7d7            b.n     58f372 <__cxxabiv1::__pointer_type_info::__pointer_catch(__cxxabiv1::__pbase_type_info const*,unsigned int) const+0x330e2>
  58f3c2:       2901            cmp     r1,#1
  58f3c4:       d103            bne.n   58f3ce <__cxxabiv1::__pointer_type_info::__pointer_catch(__cxxabiv1::__pbase_type_info const*,unsigned int) const+0x3313e>
  58f3c6:       f7ed e486       blx     17ccd4 <__cxa_begin_catch@plt>
  58f3ca:       f7ed e73c       blx     17d244 <__cxa_rethrow@plt>
  58f3ce:       f7ed e482       blx     17ccd4 <__cxa_begin_catch@plt>
  58f3d2:       f7ee e136       blx     17d640 <std::terminate()@plt>
  58f3d6:       f7ed e484       blx     17cce0 <__cxa_end_catch@plt>
  58f3da:       b114            cbz     r4,58f3e2 <__cxxabiv1::__pointer_type_info::__pointer_catch(__cxxabiv1::__pbase_type_info const*,unsigned int) const+0x33152>
  58f3dc:       4620            mov     r0,r4
...
~~~

谢谢!

ljxljy 回答:Android ARM C ++异常调试

  

我在libxxx_sdk.so中找不到正确的位置

堆栈跟踪表明libxxx_sdk.so已被完全剥离。 如果想要调试它,请不要这样做

为了确定libxxx_sdk.so中对应于地址0x058f3d3的位置,您需要知道该库加载到的地址。由于当前没有该信息,您可能希望将日志记录添加到库中,以便在每次加载该库时,都在其中记录某些函数的地址(我们将其称为fn)。下次崩溃时,您可以从崩溃地址中减去日志记录的值&fn,并从&fn输出中添加nm libxxx_sdk.so,以获取崩溃函数的地址。 / p>

或者,您可以检查0x3d3中以libxxx_sdk.so结尾的地址处的每条指令,以找到调用__throw的一条指令。如果只有这样一条指令,则可能是引发异常的那一条。

本文链接:https://www.f2er.com/3059503.html

大家都在问