您的位置:首页 > 移动开发 > Android开发

单纯gdb调试android的so断点

2014-01-15 16:53 423 查看
最新的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:1234
2.用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,成功!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: