NDK如何调试系统核心动态库(无系统源码的情况)

版权归薛定諤耗子所有,转载请表明出处。

1,有源码,需要导入符号表

2,没有源码,如何调试

1)运行ndk-gdb:../../ndk-gdb --verbose --launch=com.example.test.MainActivity

NDK如何调试系统核心动态库(无系统源码的情况)

2)(gdb) shell adb shell ps:超找出当前apk所在的线程

NDK如何调试系统核心动态库(无系统源码的情况)

结果

NDK如何调试系统核心动态库(无系统源码的情况)

3)(gdb) shell adb shell cat /proc/2362/maps

NDK如何调试系统核心动态库(无系统源码的情况)

结果

NDK如何调试系统核心动态库(无系统源码的情况)

我们关心的内容在

NDK如何调试系统核心动态库(无系统源码的情况)

4)由上面可以看出,我们需要调试库的加载地址是40a16000,使用IDA Pro打开该库文件,找到我们感兴趣的地址

NDK如何调试系统核心动态库(无系统源码的情况)

5)所以,其所在便宜地址应该是0x40a16000+0x59d98=0x40A6FD98,我们去反汇编该内存地方的内容看看,是不是确实是这几条指令

NDK如何调试系统核心动态库(无系统源码的情况)

IDA显示的内容是

NDK如何调试系统核心动态库(无系统源码的情况)

可见,是一致的。

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库里面下断点,然后打开反汇编开关

NDK如何调试系统核心动态库(无系统源码的情况)

10)继续运行,单步运行,之后就能进入我们的libdvm.so库

NDK如何调试系统核心动态库(无系统源码的情况)

11)打开IDA Pro,找到我们感兴趣的断点,然后重新再下断点

NDK如何调试系统核心动态库(无系统源码的情况)

12)然后重新下断点,然后continue停到感兴趣的断点

NDK如何调试系统核心动态库(无系统源码的情况)

13)这样就可以debug下去了。

上一篇:监控mysql执行的sql语句


下一篇:LC3专场之阿里云弹性人工智能服务-极致加速人工智能应用性能