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

2,没有源码,如何调试

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

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

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

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

结果

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

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

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

结果

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

我们关心的内容在

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

 

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

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

 

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

 

 

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

IDA显示的内容是

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


可见,是一致的。

 

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如何调试系统核心动态库(无系统源码的情况)_so库_10

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

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

 

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

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

 

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

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

 

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

 


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