1,将ida中的android_server导入手机端。存放位置(/data/local/tmp)


2,adb shell 进入手机端指令操作,进入到该目录下,给该文件权限

3,直接执行该文件,可以得到端口

之后转发端口:adb forward tcp:23946 tcp:23946
然后adb shell。
动态调试目标apk,格式如下:
adb shell am start -D -n com.example.testjniso/com.example.testjniso.MainActivity
4,打开ida进行动态调试

(用android非官方的模拟器,可以选择下面的Linux…)
然后就弹出列表,选择要调试的包名。
如果这里的列表只有显示一行,大概率是你运行android_server错了。
到这里算是一大步了,但动态调试时,如果用的不是真机(或不是官方的虚拟机),那一般来说选择完包名后,ida都会崩溃,好像原因是ida不支持x86。
所以后面我就选择了使用真机来动态调试。
选择完目标包名后,就进入了这样一个界面:

demo2
先打开Android Device Monitor。
步骤和上面的一样,运行android_server,然后转发端口,将要动态调试的so拖进ida,按F2在想要调试的地方设置断点。







配置完上面的设置后,就该进行调试了。
输入(包名):
以调试模式启动该应用
adb shell am start -D -n xxx.xxx.xxx/.MainActivity
之后就可以出现了调试的应用程序包名
然后就进入了该界面,会出现一些弹框,都选择yes就好了
进行上面操作后,按F9运行程序,然后输入:
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
然后可能卡在某个点上,不管,还是按F9执行程序,直到弹出这个框,点击same(中间可能有弹框,都选yes)

然后运行程序直到自己的 设置的断点处。
这里说一下,在你确保能运行到断点处的情况下,但是so没有运行到该处,可能是你选的so文件版本错了,我测试机是arm64的,一开始选的armeabi,但是就出现这种情况,就选了armeabi-v7。
还有一种可能就是,你设置断点处前面有反调试使得程序在运行到该处前就已经崩溃。
版权声明:本文为qq_43616001原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。