环境部署
如图,windows上运行虚拟机,虚拟机中安装linux系统,主要用于android 系统编译调试环境。至于为什么要这样搞,而不直接在windows上运行gdb程序是因为运行于设备上的gdbserver要和运行于调试pc上的gdb要配套。而目前windows上gdb编译的程序往往是很老的。但是linux环境下的gdbserver和gdb程序是和android编译环境完全匹配的,并且已经预制在android源代码中了(具体位置可以在prebuilts/gdb下找到)。
环境配置
- 将gdbserver(64位系统使用gdbserver64)push到调试设备任意可执行目录,将匹配的gdb放到虚拟机系统中。
- 增加调试信息到待调试的代码中
一般需要在cflags中增加 -g -O0选项,并且不strip调试信息// Android.bp中增加,对二进制不做strip strip : { none :ture, }
用带调试信息的二进制替换调试设备中的同名二进制。
- 配置网络环境
调试设备上的配置
在调试设备上启动gdbserver,设定调试端口(此处我们选择9999端口做gdb调试端口)// 比如我们使用9999端口调试1号init进程 gdbserver64 :9999 --attach 1 // 另开一个adb 窗口配置端口转发,将调试设备9999端口的tcp报文转发到本机9999端口 adb forward tcp:9999 tcp:9999 // adb forward --list可以查看所有的adb端口转发规则 adb forward --list e7328503 tcp:9999 tcp:9999
调试PC上的配置
// windows上配置将目的192.168.100.1:9999报文转发到127.0.0.1:9999 netsh interface portproxy add v4tov4 listenaddress=192.168.100.1 listenport=9999 connectaddress=127.0.0.1 connectport=9999 // netsh interface portproxy show all可以查看所有的端口转发配置 netsh interface portproxy show all 侦听 ipv4: 连接到 ipv4: 地址 端口 地址 端口 --------------- ---------- --------------- ---------- 192.168.100.1 9999 127.0.0.1 9999
注意:要关闭windows的防火墙已经杀毒软件的网络防护功能,否则可能导致windows上的gdb无法连接到gdbserver。
调试PC上开启gdb调试gdb/linux-x86/bin$ ./gdb (gdb) target remote 192.168.100.1:9999
如果连接gdbserver成功后,我们就愉快的调试我们的程序了。