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

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

NDK如何调试系统核心动态库(无系统源码的情况)的更多相关文章

  1. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

  2. Android FrameWork学习(二)Android系统源码调试

    通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android 系统源码,今天 ...

  3. Android系统架构与系统源码目录

    前言 技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是<Android开发艺术探索>的姊妹篇.在这 ...

  4. Android系统源码目录

    Android系统源码目录 我们要先了解Android系统源码目录,为后期源码学习打下基础.关于源码的阅读,你可以访问http://androidxref.com/来阅读系统源码.当然,最好是将源码下 ...

  5. Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战

    想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码. 想要阅读Android的源 ...

  6. Android开发系列之系统源码目录

    相信大家对于Google给出的那副经典Android架构图非常的熟悉,从下往上依次是Linux内核层(主要是负责硬件管理调度),HAL层(主要是硬件抽象层),libs层+Runtime,Framewo ...

  7. 将Android系统源码导入Android studio的方法

    Android源码目录结构如下: |-- Makefile|-- abi (applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件)|-- ...

  8. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

  9. 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程

    原文                   http://blog.csdn.net/zhaoxy_thu/article/details/18883015                 本文主要对从 ...

随机推荐

  1. Sicily-1438

    一.      题意 买二送一.排序之后隔三求和,求折扣的最大值. 二.      代码 // // main.cpp // sicily-1438 // // Created by ashley o ...

  2. DOC下编译和运行带有包的java类文件

    前言: 带有包名的java类在DOC下编译可以成功,但是运行出错  错误: 找不到或无法加载主类 com.soanl.socket.MyServer D盘temp文件下有个Hello.java文件,包 ...

  3. java代码发送JSON格式的httpPOST请求

    package com.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOE ...

  4. Android项目导入时,出现的Could not write file 。。。。。。.classpath错误解决办法

    导入到Eclipse中后选择了相应的API后,红叉的项目错误没有了. 工程列表也无任何错误了.但出现了这样的提示框错误 说明的是.classpath这个环境文件不能写.随后,查看工程文件主目录下的.c ...

  5. 上传图片到文件夹并显示在GridView控件里面

    http://aspsnippets.com/Articles/Upload-images-to-folder-and-display-uploaded-images-in-ASPNet-GridVi ...

  6. ELF文件数据布局探索(1)

    作为一名Linux小白,第一次看到a.out这个名字,感觉实在是奇怪,搜了一下才知道这是编译器输出的默认可执行文件名 然后vi一下,哇,各种乱码,仔细看看,发现了三个清晰的字符ELF.继续搜索, 第一 ...

  7. WebSphere优化

    优化WebSphere WebSphere里的profile刚配完,一般默认的heapsize即Xms与Xmx值只有256mb,而IBM WAS是几个J2EE服务器中最吃内存的机器,在布署一些EAR应 ...

  8. C中的宏

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define  标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和 ...

  9. 文字适应DIV

    今天突然碰到了一个奇怪的问题  那就是对于纯数字和英文字母  文字多了会超出div  且即使是设置了height:auto overflow-y:auto 也不管用 只是在x轴上出现滚动条   不论用 ...

  10. QStringLiteral的两篇外文解释(编译期转换成QString)

    http://blog.qt.io/blog/2014/06/13/qt-weekly-13-qstringliteral/ https://woboq.com/blog/qstringliteral ...