如何从Android获取更长的堆栈转储(tombstone)?

16

我注意到,logcat总是返回34行崩溃日志,就像这样:

4cf7c700  401c0000 
4cf7c704  48463ff0 
4cf7c708  44d11f7c  
4cf7c70c  afd0cd89 
4cf7c710  00000000  
4cf7c714  82ab29dc  libmyproject.so
4cf7c718  00000000  
4cf7c71c  4cf7c73c  
4cf7c720  836c44f0  libmyproject.so
4cf7c724  82f3a414  libmyproject.so
4cf7c728  4cf7c768  
4cf7c72c  0000008d  
4cf7c730  007ea0a8  [heap]
4cf7c734  00270100  [heap]
4cf7c738  e3a07077  
4cf7c73c  ef900077  
4cf7c740  00000000  
4cf7c744  4cf7c774  
4cf7c748  836c44f0  libmyproject.so
4cf7c74c  00000000  
4cf7c750  836c44f0  libmyproject.so
4cf7c754  82f63768  libmyproject.so
4cf7c758  00000000  
4cf7c75c  4cf7c7e4  
4cf7c760  00000000  
4cf7c764  00000001  
4cf7c768  00000000  
4cf7c76c  0badc0de  
4cf7c770  fffffff8  
4cf7c774  00000000  
4cf7c778  00000168  
4cf7c77c  00000009  
4cf7c780  00000200  
4cf7c784  00000000  

然而我知道堆栈也保存在/date/tombstones/tombstone_0[0-9]。在那里,我可以找到许多其他的堆栈(我不完全了解它们来自何处),其中一些比前面提到的堆栈还要长两倍。

如何从我的应用程序崩溃中获取如此长的堆栈转储?

2个回答

32
安卓系统中的崩溃处理程序称为debuggerd,仅将部分堆栈记录在日志中,但将完整堆栈记录在tombstone文件中。此功能是在system/core/debuggerd/debuggerd.c中进行硬编码的。
在debug_stack_and_code()例程中查找对_LOG()的调用。_LOG的第二个参数控制数据是否仅写入tombstone还是同时写入日志和tombstone。
如果您看到(sp_depth>2||only_in_tombstone),则可以更改2以便在日志中报告更深层次的堆栈帧。这需要假设您能够重新编译debuggerd并在系统上替换它。否则,您只能通过检查tombstone文件本身来获得更长的堆栈转储。
当Linux下的程序崩溃时,debuggerd会创建转储。此时,内核会向正在关闭的程序发送信号。每个本地Android应用程序都安装了一个特殊的信号处理程序,该程序由bionic C库提供。信号处理程序通过命名管道联系debuggerd,后者使用ptrace连接回临死程序,以读取寄存器和内存以生成tombstone和日志条目。

13
我建议像下面的例子一样调试在tombstone文件中找到的堆栈跟踪信息。

示例:

#00  pc 00010a20  /system/lib/libc.so
#01  pc 0000b332  /system/lib/libc.so
#02  pc 0000ca62  /system/lib/bluez-plugin/audio.so
#03  pc 0000d1ce  /system/lib/bluez-plugin/audio.so
#04  pc 0000e0ba  /system/lib/bluez-plugin/audio.so
你可以使用下面的命令知道函数名称、文件名和行号。
$(android-root)prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/addr2line -f -e /out/product/xxx/symbols/system/<SO filename> <PC address>

例子:

$(android-root)prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/addr2line -f -e /out/product/xxx/symbols/system/libc.so 0x00010a20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接