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

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

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下去了。

原文地址:https://www.cnblogs.com/dyllove98/p/3143107.html