用android自带的gdb与gdbserver调试native C/C++程序

本文介绍如何使用gdbserver和gdb解决Android应用崩溃时logcat提供的backtrace信息不完整的问题,详细步骤包括安装配置gdbserver及gdb,并设置符号库路径等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缘起:

用一个播放器,播放流媒体视频时总是崩溃,不知道为何,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值