android调试中,不可避免的会遇到tombstone日志。借用某位仁兄的话"tombstone一般是由Dalvik错误、状态监视调试器、C层代码以及libc的一些问题导致的。当系统发生tombstone的时候,kernel首先会上报一个严重的警告信号(signal),上层接收到之后,进程的调试工具会把进程中当时的调用栈现场保存起来,并在系统创建了data/tombstones目录后把异常时的进程信息写在此目录里面,开发者需要通过调用栈来分析整个调用流程来找出出问题的点。"
在ndk包中,为我们提供了供windows环境下使用的工具列表。这些列表都以arm-linux-androideabi-开头。并且接上linux常用bin的名字,例如arm-linux-androideabi-dumpobj和arm-linux-androideabi-nm。
调试tombstone的时候一般会用到arm-linux-androideabi-addr2line.exe、arm-linux-androideabi-nm.exe、arm-linux-androideabi-objdump.exe。
$ arm-eabi-addr2line.exe --help
Usage: arm-eabi-addr2line [option(s)] [addr(s)]
Convert addresses into line number/file name pairs.
If no addresses are specified on the command line, they will be read from stdin
The options are:
@<file> Read options from <file>
-b --target=<bfdname> Set the binary file format
-e --exe=<executable> Set the input file name (default is a.out)
-i --inlines Unwind inlined functions
-j --section=<name> Read section-relative offsets instead of addresses
-s --basenames Strip directory names
-f --functions Show function names
-C --demangle[=style] Demangle function names
-h --help Display this information
-v --version Display the program's version
arm-linux-androideabi-addr2line.exe最为常用,它负责把相对地址转换成符号,让我们知道错误的地方是在哪个函数里。好让我们有的放矢。
使用方法为 arm-linux-androideabi-addr2line -C -e -f xxx.so 0xxxxxxxxx
到目前为止,只定位到了出错的函数,我们还需要arm-linux-androideabi-objdump来反汇编so文件,找到出错的汇编指令。还原出错现场。
使用方法为 arm-linux-androideabi-objdump -S -D xxx.so > xxx.txt