版权归薛定諤耗子所有,转载请表明出处。
1,有源码,需要导入符号表
2,没有源码,如何调试
1)运行ndk-gdb:../../ndk-gdb --verbose --launch=com.example.test.MainActivity
2)(gdb) shell adb shell ps:超找出当前apk所在的线程
结果
3)(gdb) shell adb shell cat /proc/2362/maps
结果
我们关心的内容在
4)由上面可以看出,我们需要调试库的加载地址是40a16000,使用IDA Pro打开该库文件,找到我们感兴趣的地址
5)所以,其所在便宜地址应该是0x40a16000+0x59d98=0x40A6FD98,我们去反汇编该内存地方的内容看看,是不是确实是这几条指令
IDA显示的内容是
可见,是一致的。
6)这个方法不行,导致断点下去之后,无法停住,会出现
Program received signal SIGSEGV, Segmentation fault.的错误
7)我们可以在so文件之前,再加上一个简单的库文件,这样就可以借此机会进入so
System.loadLibrary("hello-jni");
Log.e("zcfdebug", "Now we will wait for 5 s");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("zcfdebug", "Now we finish waiting for 5 s");
TextView tv = new TextView(this);
// tv.setText( stringFromJNI() );
//this is ladder to make breakpoint in so library
String xxx= stringFromJNI();
System.loadLibrary("sa");
//add here to debug loadLibrary method
8)重启启动调试:../../ndk-gdb --verbose --launch=com.example.hellojni.HelloJni
9)在因子so库里面下断点,然后打开反汇编开关
10)继续运行,单步运行,之后就能进入我们的libdvm.so库
11)打开IDA Pro,找到我们感兴趣的断点,然后重新再下断点
12)然后重新下断点,然后continue停到感兴趣的断点
13)这样就可以debug下去了。