Android上gdb+gdbserver调试初体验


工作需要gdb+gdbserver调试Android程序,在网上查了一堆资料,有点乱,自己总结一下。


开发环境:

1. 开发机,MacBook Pro

2. 目标手机,Nexus 4 Android4.3.1


需要准备的东西:

1. gdbserver,我理解远程调试需要在目标机上有个类似调试服务器的东西来给gdb传送数据什么的,所以需要这个东西,在网上看的资料各种在线下载或者交叉编译什么的才能得到这个东西,其实不用那么麻烦,NDK里自带~,位置:$NDK_DIR/prebuild/android-arm/gdbserver

2. gdb,这个不用说了,也是NDK里自带,位置:$NDK_DIR/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb,中间的路径根据自己情况更改。

需要注意的是gdbserver和gdb的版本要匹配,否则会出错。


准备步骤:

1. 先要在目标手机的/data目录下建一个目录bin,然后把gdbserver push到这个/data/bin/目录下,然后运行chmod 777 gdbserver增加执行权限。

2. 在目标手机上运行你要调试的APP,获取这个APP的进程号,比如是18440,然后在目标手机的命令行下执行./gdbserver :1234 --attach 18440,输出如下:

root@mako:/data/bin # ./gdbserver :1234 --attach 18440                         

Attached; pid = 18440

Listening on port 1234

      

表示已经attach到进程2559上了,在tcp端口1234上监听,gdb这边只要也连上1234这个端口就可以了。

3. 在开发机这边的命令行上面启动gdb,然后执行shell命令(shell adb forward tcp:1234 tcp:1234),表示通过adb映射tcp端口1234,命令中前面的是local的端口,后面的是remote的端口,然后再执行命令(target remote localhost:1234),这条命令表示与远程程序建立链接。如下:

  1. BriansdeMacBook-Pro:bin brian$ ./arm-linux-androideabi-gdb

  2. GNU gdb (GDB) 7.3.1-gg2

  3. Copyright (C) 2011 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later
  5. This is free software: you are free to change and redistribute it.
  6. There is NO WARRANTY, to the extent permitted by law. Type "show copying"
  7. and "show warranty" for details.
  8. This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi".
  9. For bug reporting instructions, please see:
  10. .
  11. (gdb) shell adb forward tcp:1234 tcp:1234
  12. (gdb) target remote localhost:1234
  13. Remote debugging using localhost:1234
  14. 0x40011384 in ?? ()
  15. (gdb)

4. 下面就可以开始gdb的调试之旅了~~


我找了个爱加密加密过的程序,想要gdb调试一下,结果gdbserver刚attach上目标进程,目标程序就崩溃退出了,这是因为爱加密实现了防ptrace的功能,之前就关注过Android上怎样防ptrace,答案是不太可能防得住,因为程序可能有很多个进程,主进程防得住,其它进程可不一定。于是到目标手机上的/proc/PID/task目录下看有哪些进程,用gdbserver试一下attach其它的进程,很容易就可以attach上了。

继续往下调试发现NDK中提供的gdb和gdbserver有诸多的限制,比如gcore这些重要的功能都不能用,看来还是要自己去编译才可以啊。具体方法可以参考下面链接:

http://jingpin.jikexueyuan.com/article/56471.html



以上的所有这些都是远程调试,其实把上面的gdb直接放在目标手机上,然后在目标手机的命令行中直接运行gdb调试也是可以的,这样就算是本地调试不需要gdbserver了。


先简单介绍到这里,以后深入了解以后再更新。

你可能感兴趣的:(Android上gdb+gdbserver调试初体验)