如何从android获得更长的堆栈转储(墓碑)?

如何从android获得更长的堆栈转储(墓碑)?,android,stack-trace,logcat,tombstoning,Android,Stack Trace,Logcat,Tombstoning,正如我所注意到的,logcat总是返回34行crashlog,如下所示: 4cf7c700 401c0000 4cf7c704 48463ff0 4cf7c708 44d11f7c 4cf7c70c afd0cd89 4cf7c710 00000000 4cf7c714 82ab29dc libmyproject.so 4cf7c718 00000000 4cf7c71c 4cf7c73c 4cf7c720 836c44f0 libmyproject.

正如我所注意到的,logcat总是返回34行crashlog,如下所示:

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\u 0[0-9]
。在那里我可以找到许多其他堆栈(我不完全理解它们来自何处),其中一些堆栈的长度是前面提到的堆栈的两倍


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

我建议调试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/libc.so 0x00010a20
您可以使用下面的命令了解函数名、文件名和行号

$(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中名为debuggerd的崩溃处理程序只将堆栈的一部分写入日志,但将整个堆栈写入墓碑文件。这是在system/core/debuggerd/debuggerd.c中硬编码的

在例程debug_stack_和_code()中查找对_LOG()的调用。_LOG的第二个参数控制内容是只进入墓碑,还是进入日志和墓碑

当您看到
(sp|u depth>2 | |仅_in_tombstone)
时,您可以将2更改为其他内容,以获得日志中报告的更深的堆栈帧。这假设您可以重新编译debuggerd并在系统上替换它。如果没有,您将不得不检查墓碑文件本身以获得更长的堆栈转储

当程序在Linux下崩溃时,debuggerd会创建转储。当这种情况发生时,内核将向即将死亡的程序发送一个信号。这个信号被安装在每个本地Android应用程序中的特殊信号处理程序捕获。由仿生C库提供。信号处理程序联系debuggerd(通过一个命名管道),然后debuggerd使用ptrace连接回垂死的程序,读取寄存器和内存以生成逻辑删除和日志条目