Android定位backtrace地址

一,backtrace地址定位方式

shell指令如下:

#cd [Android源码根目录]
#./prebuilts/clang/host/linux-x86/llvm-binutils-stable/llvm-addr2line [address] -e [symbols so] -f -c

注意:一定要使用symbol库。

二,新手用例示范

手写一个空指针访问内存简单样例,如下:

#include 

void test_segment()
{
    int *p = NULL;
    *p = 1;
}

int main()
{
	test_segment();
}

可自行安装Android交叉编译器arm-linux-androideabi, 注意加上-g,编译命令如下:

arm-linux-androideabi-gcc main.c -o -g main

存在多文件时,使用Makefile进行编译很方便,可参照我的这篇博文linux addr2line 定位ASan Dump信息-CSDN博客中编写的Makefile,需要增加PREFIX = arm-linux-androideabi-

#make
#adb push test /data
#adb shell
#cd /data;chmod 777 test
#./test
Segmentation fault

执行完以上步骤,出现的“Segmentation fault”,不要慌,Android实现了linux backtrace机制,“Segmentation fault”对应的信号是 signal 11 (SIGSEGV),会生成dump文件,路径为/data/tombstones

打开tombstone_00,截取一段dump信息:

ABI: 'arm'
Timestamp: 2023-03-09 02:48:57.617829369+0000
Process uptime: 1s
Cmdline: ./test
pid: 8462, tid: 8462, name: test  >>> ./test <<<
uid: 0
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x00000000
Cause: null pointer dereference
    r0  00000000  r1  00000001  r2  ffb4b99c  r3  00000000
    r4  079894a4  r5  ffb4b994  r6  00000001  r7  00000000
    r8  00000000  r9  00000000  r10 00000000  r11 ffb4b948
    ip  f128e0b8  sp  ffb4b940  lr  079894c4  pc  07989474

backtrace:
      #00 pc 00001474  /data/test (test_segment+44)
      #01 pc 000014c0  /data/test (main+28)
      #02 pc 0005ceb7  /apex/com.android.runtime/lib/bionic/libc.so (__libc_init+54) (BuildId: 9327215259308a8e804349a31
567ea50)

使用交叉编译arm-linux-androideabi-addr2line定位地址,指令如下:

# arm-linux-androideabi-addr2line 00001474 -e ./build/test -f
/home/licq/c-example/1-basic/segm/main.c:6

显示问题代码正是第6行,与预期一致。

你可能感兴趣的:(linux,运维,服务器)