用一个播放器,播放流媒体视频时总是崩溃,不知道为何,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
参考:
http://www.kandroid.org/online-pdk/guide/debugging_gdb.html
http://laokaddk.blog.51cto.com/368606/1162260
===============================================================
===============================================================
.把ida 目录下android_server 传到android 目录中
如:
adb push android_server /data/local/tmp/
adb shell 进入模拟器
cd /data/local/tmp/
chmod 755 android_server
./android_server
看到监听端口 23946
2.在windows 控制台下转发window 到模拟器或者手机的端口
adb forward tcp:23946 tcp:23946
3.ida 中选择android 调试
在Debuggger 中的process options 的
hostname 填上localhost
port: 23946
4.在Debuggger 中的attach 上android 所对应的程序就行了
如果不调so,而是调是bin的话
第3部application 填上:你bin 在模拟器或者手机的路径
Input file:同application
Directory:你bin 在模拟器或者手机的目录路径
有参数的话,参数也填上
然后直接在第4部F9 或者start process
对于使用symbian的同学注意下:
第3部application 填上:你bin 在手机的路径
Input file:你本机电脑上的程序路径
port:com口
手机上要安装trk
注意:ida6.1 才支持android 调试,5.5 不支持