最新的NDK已经支持在eclipse下调试so的c/c++代码了,但设置比较复杂,本人搞了半天都搞不定。就用NDK里的工具直接gdb调试了。
手机端:
1.确保手机root了,再运行adb remount。
2.把apk源码路径下的libs\armeabi\gdbserver push到手机,再chmod可执行权限。
3.安装要调试的apk,运行之。
4.adb shell ps命令查看此apk的pid,比如
app_37 1387 662 192988 18116 ffffffff afd0c53c S com.example.hellojni
pid就是1387
5.运行gdbserver,比如要通过1234端口调试上面pid是1387的应用
gdbserver --attach localhost:1234 1387
显示
Attached; pid = 1387
Listening on port 1234
PC端
1.手机端口映射过来,比如1234端口,在cmd下运行
adb forward tcp:1234 tcp:12342.用ndk-build.cmd NDK_DEBUG=1编译带调试信息的so,再用NDK目录里面的arm-linux-androideabi-gdb.exe打开,显示出gdb调试窗口。
3.打开gdbserver的远程端口,比如上面的1234端口,在gdb调试窗口运行
target remote localhost:1234
4.加断点。比如要在43行加断点,在gdb调试窗口运行
b 43
返回错误!!
Cannot access memory at address 0x1a14
是的,0x1a14只是在so中的地址,还要加上so的起始地址。
查看so起始地址要在手机上adb shell查看,比如需调试的apk的pid是1387,cat /proc/1387/maps显示内存地址,找到so的起始地址,比如
80600000-80604000 r-xp 00000000 16:01 39190 /data/data/com.example.hellojni/lib/libhello-jni.so
80604000-80606000 rw-p 00003000 16:01 39190 /data/data/com.example.hellojni/lib/libhello-jni.so
起始地址就是80600000,断点地址就是80601a14。
再设断点,在gdb调试窗口运行b *0x80601a14,成功!!