zoukankan      html  css  js  c++  java
  • 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下去了。

  • 相关阅读:
    创建100个文件,并对每个文件赋值
    vsftpd服务程序的三种认证模式
    slf4j打印日志必须的三个依赖包
    MySql镜像安装
    java子类调用父类构造器函数
    shell脚本批量调用接口
    go语言生成可执行文件
    linux通过VMware和主机相连连接互联网
    yum源配置
    vmware上安装linux过程记录
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3143107.html
Copyright © 2011-2022 走看看