链接地址:代码分析工具
我们在调试代码的时候,有时会遇到空指针的问题,这个可能是内核的,串口打印出了oops,也可能是Linux上层的,比如c的so库等,下面截取了一个这样的一个log,:
来分析一下几个命令的使用。这个是上层so库打印出来的堆栈信息,其他部分我也没有看懂 ,我们就关注一红色框的部分,在这里我们只是看到了出问题的库的名字和地址,还不清楚是具体哪个函数,具体哪一行代码出的问题,我们可以用arm-eabi-addr2line 这个命令。
该可执行程序在Android的工程代码中已经包含了,路径在linux/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin,使用方法:
./arm-eabi-addr2line -f -e libc.so 0000d630
打印出:
pthread_mutex_lock_impl
/home/android/disk/13005/linux/bionic/libc/bionic/pthread.c:1198
注意,这里的libc.so,是用out目录下的\symbols\system\lib 这个里面的库文件,这里面的库文件是带有符号的,才能输出更多的信息。我们可以依次去打印,他们分别是从下往上调用。这个主要是用来看看调用的流程,出现问题一般也没有这么容易分析。
第二个命令是反汇编的命令:arm-eabi-objdump。这里作为演示,我们把libsensor1.so反汇编看看,命令如下:
./arm-eabi-objdump -S -D libc.so > deassmble_libc.txt 反汇编下你的动态连接库文件,并且将它写入一个文件中,我们就可以根据堆栈打出的地址来找到对应的代码,我们截取一段来看:
34ce:f7ff ed38 前面表示地址,后面表示操作码,这里一共占据了4字节 34ce, 34cf, 34d0, 34d1,所有下一条指令就是34d2了。这个出问题的地方正是代码
pthread_mutex_lock( &libsensor_cli_data_mutex );
这个分析只是定位了代码,其实是不是这里引起很不一定,距离正在分析出问题的原因还很远。这里举例只是讲了这个命令的使用以及堆栈信息的查看。
未完待续。。。