前言
记录一下调试的整个过程,坑实在是太多了。
开始调试
首先,确保以下操作已完成:
- 程序的android:debuggable设置为true
- 关闭Android studio(如果打开的话jdb可能连接不上,应该是端口被占用了)
正式开始:
- 安装程序
adb install xxx.apk
- 配置好android_server并启动,这里网上别的教程很多,就重复了。需要注意的是,我的IDA Pro里有两个版本的android_server,另一个名叫android_server64。如果你调试的是32位so,则启动android_server,并使用调试32位程序的IDA Pro来调试,否则可能会有问题,64位同理。
- 设置端口转发
adb forward tcp:23946 tcp:23946
- 以调试模式启动APP
adb shell am start -D -n [程序包名]/[启动activity]
其中,程序的包名与启动activity都可以先用apktool解包,然后在AndroidManifest.xml文件里找到。 - 启动IDA Pro,调试器选择 Remote ARM Linux/Android debugger
- 在目录Debugger–>process options里填写hostname与port
- 在目录Debugger–>attach to process 里附加到要调试的进程中
- 点击 Debugger–>Debugger options,设置相关选项如下
- 下一步网上的教程都是使用DDMS来进行的,但是这个工具已经被Google废弃,配置起来也麻烦,所以我们就不用它。
首先我们在IDA上点击F9,让程序先跑起来
然后使用这个命令查看要调试的程序的PIDadb jdwp
然后执行adb forward tcp:8700 jdwp:<pid>
,映射到本地8700端口上
最后执行jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
此时你应该可以看到程序的waiting for debugger标签已经没有了,程序已经跑起来了。之后你可以在刚兴趣的函数上继续下断点,调试程序。