android gdb调试

先学一篇文章

https://blog.csdn.net/zhu929033262/article/details/76064044

1, 流程通路大概是这个样子的
1) gdbserver attach到待调试进程上.su;gdbserver remote:1234 --attach 1137&;
2) gdbserver建立一个端口为1234的socket server,并开启监听.
3) adb forward tcp:11111 tcp:1234    ,将pc的11111与设备的tcp:1234建立端口映射
4) IDE在PC端,建立一个socket client端,连接到端口为11111的server上

2, android标准gdb调试流程.https://source.android.google.cn/devices/tech/debug/gdb?hl=zh-cn
1) source/build;lunch;配置环境
2) gdbclient.py(android 6.0以上)/gdbclient(android 6.0以下),启动gdb调试.envsetup.sh中function gdbclient()
3) gdbclient可以处理3个传入参数,$1,EXE,待调试的/system/bin/"exe"名字,$2,PORT,$3,PID.
从代码来看,是在远程运行了adb forward "tcp$PORT" "tcp$PORT"
adb shell gdbserver $PORT --attach $PID &
如果没有参数3,就通过EXE去找PID,这个玩意,感觉还不如直接使用gdb,虽然封装了一些,但是默认只能调试/system/bin.

尝试一下调试

android4.4/hardware/libhardware_legacy/wifi/wifi.c为例
将netd加入gdb调试.ps为1137,执行su;gdbserver remote:1234 --attach 1137&;发现ps状态变成了t,表示trace调试模式.
root      1137  1     9752   1236  ffffffff ffff0520 t /system/bin/netd

然后adb forward tcp:11111 tcp:1234

arm-linux-androideabi-gdb 然后输入下面内容,可以参见gdbclient.cmds

set solib-absolute-prefix /home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols
set solib-search-path /home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/lib:/home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/lib/hw:/home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/lib/ssl/engines:/home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/lib/drm:/home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/lib/egl:/home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/lib/soundfx
source /home/seth/code/CQA20Android4.4_bv2_v1.2/android/development/scripts/gdb/dalvik.gdb
dir /home/seth/code/CQA20Android4.4_bv2_v1.2/android/system/core
file /home/seth/code/CQA20Android4.4_bv2_v1.2/android/out/target/product/wing-k10x6/symbols/system/bin/netd
target remote :11111

gdb常用命令
l 函数名 //找到代码位置
backtrace/bt //列出当前线程堆栈
thread apply all bt //列出所有线程调用堆栈
thread 线程号//切换线程上下文
ctrl x+a //切换到源码浏览窗口 ,再按ctrl x+a 切换回去
ctrl c //中断当前运行
c/continue //继续运行
info sharedlibrary //列出so加载列表
info threads //列出线程列表
info locals //列出当前堆栈上的局部变量
info breakpoints //列出断点
print 变量名 //列出变量内容 /x变为16进制
print 变量名= //修改变量名的值
b/break 源码文件名:行号 //下断点
d/delete 断点id //删除断点
f/frame 栈帧序号 //切换到指定的栈帧 如 f 0 顶层
s/step //下一步,有函数调用会进入
n/next //下一步,有函数调用不会进入
fin/finish //返回到上层函数调用
disable 断点id //禁用断点
enable 断点id //启用断点
disassemble/disas //查看汇编代码
设置一个断点,就可以调试了,剩下的两个问题是,1,不是单步运行的,这个可能是由于没有-O0导致的,只能多加一点断点.2,不能从应用启动的时候开始调试.

如果想要在启动的时候开始调试,需要在启动的时候 adb shell gdbserver :11111 /system/bin/netd .
但对于目前的代码,会同时存在两个netd进程,其中一个是gdb启动的,一个是自动启动的.所以需要改动一下init.rc文件.把netd变成手动启动.
有的时候登录后发现没有root权限,就传一个带su的busybox或者su进去,使用chmod 4755 busybox或者su,就可以了.

有的时候,机器上没有adb,那就只能用两个串口进行调试.

先看这篇文章https://www.jianshu.com/p/4f1140300516

假设adb类似docker的情况,则使用串口+adb调试.
1,首先把,串口登录,然后执行 gdbserver remote:1234 --attach 1137&;   //
2,然后 adb forward tcp:11111 tcp:1234;
3,再然后 arm-linux-androideabi-gdb,后面操作基本相同了.

 

 

你可能感兴趣的:(linux内核,linux_drv)