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下去了。
NDK如何调试系统核心动态库(无系统源码的情况)的更多相关文章
- Android FrameWork 学习之Android 系统源码调试
这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...
- Android FrameWork学习(二)Android系统源码调试
通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android 系统源码,今天 ...
- Android系统架构与系统源码目录
前言 技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是<Android开发艺术探索>的姊妹篇.在这 ...
- Android系统源码目录
Android系统源码目录 我们要先了解Android系统源码目录,为后期源码学习打下基础.关于源码的阅读,你可以访问http://androidxref.com/来阅读系统源码.当然,最好是将源码下 ...
- Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战
想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码. 想要阅读Android的源 ...
- Android开发系列之系统源码目录
相信大家对于Google给出的那副经典Android架构图非常的熟悉,从下往上依次是Linux内核层(主要是负责硬件管理调度),HAL层(主要是硬件抽象层),libs层+Runtime,Framewo ...
- 将Android系统源码导入Android studio的方法
Android源码目录结构如下: |-- Makefile|-- abi (applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件)|-- ...
- 一文读懂Spring动态配置多数据源---源码详细分析
Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...
- 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
原文 http://blog.csdn.net/zhaoxy_thu/article/details/18883015 本文主要对从 ...
随机推荐
- Android JNI开发提高篇
有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...
- DevExpress ASP.NET 使用经验谈(4)-CriteriaOperator的使用
上一节中,我们已经介绍了,使用CriteriaOperator表达式,获取对象数据. CriteriaOperator criteria = CriteriaOperator.Parse(" ...
- Oracle更改数据库文件大小、实时增加文件容量
--查询数据库文件路径.表空间.大小等 select * from dba_data_files ; --EAST.DBF数据库文件自动扩展20M,可无限扩展 alter database dataf ...
- 关于Repeater中使用DorpWownList的问题
关于Repeater中使用DorpWownList的问题 前台: <asp:Repeater ID="Repeater1" runat="server" ...
- Xcode 插件优缺点对比(推荐 20 款插件)
链接地址:http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=402439598&idx=1&sn=e8800cb0aa2 ...
- C++对C语言的非面向对象特性扩充(1)
我将分3篇来介绍C++相对于C在非对象特性上的扩充,今天要讲的是C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较. 1.C++注释除了包括原有C的块注释/* ...
- Python学习之路——socket
一.Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信. socket服务端示例: import socke ...
- Django : Table 'MyDjango.django_admin_log' doesn't exist
原因: 添加admin之后,没有运行 manage.py syncdb 解决方法: 在命令行中运行manage.py syncdb 即可 运行截图:
- 在Github上搭建你的博客
title: blog on github date: 2014-03-24 20:29:47 tags: [blog,github,hexo] --- **用Github写博文** 参考http:/ ...
- 198,House Robber
一.题目 You are a professional robber planning to rob houses along a street. Each house has a certain a ...