缘起:
用一个播放器,播放流媒体视频时总是崩溃,不知道为何,logcat出来的log里面,崩溃信息里面的backtrace不全,堆栈的值仅仅打印出两行,且都停留在libc库里面.因此也没有办法用arm-linux-androideabi-objdump来跟踪代码.Google上给的解决方法是用gdb调试.
参考:http://stackoverflow.com/questions/17633866/incomplete-backtrace-in-logcat
以调试mediaserver为例:
准备:
1.gdbserver运行在目标机(android设备)上,开发机(PC)上运行gdb.用gdb连上gdbserver开始调试
2.android代码版本是android4.0.3.
在android的源代码目录下.prebuilt目录中find到gdbserver: $ANDROID_SOURCE/prebuilt/android-arm/gdbserver/gdbserver
然后将gdbserver 给adb push 到目标机上,比如:
先在android目标机上建立/data/bin目录,将gdbserver给push到/data/bin下
$adb push $ANDROID_SOURCE/prebuilt/android-arm/gdbserver/gdbserver /data/bin
3.目标机端:
$adb shell
$cd data/bin
然后连接gdbserver:
gdbserver 开发机IP:端口 应用程序名或者(--attach 进程号)
$gdbserver 192.168.10.166:1234 --attach 1168
或者:
$gdbserver 192.168.10.166:1234 /system/bin/mediaserver
开发机端:
1.将上述1234端口的TCP通过adb都转到目标机上:
$adb forward tcp:1234 tcp:1234
2.运行gdb.注意gdb与gdbserver的版本要一致,可以用gdbserver --version查看版本,gdb在运行时也能看到版本打印,两者一致.
同样,在android源代码之prebuilt目录下找到相应的arm-eabi-gdb
我们可以看到在prebuilt目录下有很多相关的gdb,因为是在ubuntu下开发,选择linux下的,且版本与gdbserver版本一致的arm-eabi-gdb
$($ANDROID_SOURCE)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gdb $ANDROID_SOURCE/out/target/product/nusmart3_stick/symbols/system/bin/mediaserver
3.给gdb设置库的查找路径
(gdb) set solib-absolute-prefix $ANDROID_SOURCE/out/target/product/nusmart3_stick/symbols/system/lib
(gdb) set solib-search-path $ANDROID_SOURCE/out/target/product/nusmart3_stick/symbols/system/lib
4.连接gdbserver:
(gdb) target remote 目标机IP:端口
如:
(gdb) target remote 192.168.10.104:1234
参考: