前言

Android系统对于Native(C/C++)应用程序的调试手段比单纯的linux系统coredump文件与gdb结合调试的手段.但是Android系统的天然不支持这种调试方式,其在内核中就没有启用coredump生成机制,那么Android系统下我们使用什么方式调试Native程序的崩溃问题呢?其实,Android系统将系统应用程序产生的崩溃日志都存储到了/data/tombstones目录下,其详细记录了Native应用程序崩溃时进程上下文,通过该文件我们可以知道进程崩溃的原因,崩溃的地点,崩溃线程的函数调用栈,通过这些信息就可轻松的定位到崩溃的具体位置.下面详细的介绍如何通过/data/tombstones目录下的崩溃日志定位到崩溃的位置和原因。

调试步骤

1.编写用于调试的程序

int main  (void)
{int *null = 0;*null = 0;  return 0;
}

2.编译并将其下载到Android系统

arm-linux-androideabi-gcc coredump.c -o coredump -pie -fPIE -g
adb push coredump /data/coredump
./coredump

3.在terminal运行查看崩溃日志

ls /data/tombstones
root@firefly:/data/tombstones # ls
tombstone_00

上面的代码会触发崩溃,其会在/data/tombstones生成对应的崩溃日志,日志基本信息如下:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** **Build fingerprint: 'Android/rk3288_box/rk3288_box:5.1.1/LMY48W/firefly03111810:userdebug/test-keys'Revision: '0' ABI: 'arm'pid: 2992, tid: 2992, name: coredump  >>> ./coredump <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 r0 00000001  r1 bebcc894  r2 00000000  r3 00000000r4 bebcc894  r5 bebcc89c  r6 00000001  r7 b6f5730cr8 00000000  r9 00000000  sl 00000000  fp bebcc85cip b6f3264c  sp bebcc850  lr b6eed39f  pc b6f57328  cpsr 60070010d0  0000000000000000  d1  0000000000000000d2  0000000000000fff  d3  0000b30a0000b30ad4  000000000000b30a  d5  0000000000000000d6  0000000000000000  d7  0000000000000000d8  0000000000000000  d9  0000000000000000d10 0000000000000000  d11 0000000000000000d12 0000000000000000  d13 0000000000000000d14 0000000000000000  d15 0000000000000000d16 0000000000000000  d17 0000000000000fffd18 0000000000000000  d19 0000000000000000d20 0000000000000000  d21 0000000000000000d22 0000000000000000  d23 0000000000000000d24 0000000000000000  d25 0000000000000000d26 0000000000000000  d27 0000000000000000d28 0000000000000000  d29 0000000000000000d30 0000000000000000  d31 0000000000000000scr 00000000backtrace:#00 pc 00000328  /data/coredump/coredump (main+28)#01 pc 0001239d  /system/lib/libc.so (__libc_init+44)**

4.根据崩溃日志定位崩溃位置
崩溃日志中提供了程序崩溃时的函数调用栈,其详细记录了程序运行时PC(Programer Counter)地址,我么可以根据这些地址,定位程序的崩溃时程序的运行过程.调试崩溃位置,我们需要使用到addr2line函数,该函数将地址信息对应到程序的符号信息,根据符号信息就可以定位到程序代码的具体位置。

lhl@lhl-ubuntu:~/test$ arm-linux-androideabi-addr2line -a 00000328 -e coredump0x00000328/home/lhl/test/coredump.c:4

调试信息显示崩溃位置在coredump.c的第4行,对应一下代码,第4行为*null = 0; //访问非法地址0,触发段错误

注意事项

1. 编译应用程序时需要制定-g选项,该选项会在应用程序中添加符号信息,而在使用addr2line时需要这些符号信息定位崩溃位置
2.如果是第三方SDK中.so出现问题,则需要检测上层应用调用问题。

Android Native层错误调试相关推荐

  1. android transact,Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败分析...

    Q:Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败? 在Android Native层调用Camera.h中的api实现一个 ...

  2. Android Native层

    android native层是 相对于Java 层的底层,一般用c++开发 Java框架层就是常说的Framework,这层里东西很多也很复杂,比如说主要的一些系统服务如ActivityManage ...

  3. android native层进程通信

    我们需要在android native层实现两个进程间的通信,这两个进程一个是native c 进程,一个是apk,两者需要传递一张几百K的图片,natice c 程序写该图片,apk读该图片,而且, ...

  4. Android native 层使用opengl渲染YUV420p和NV12

    <Ndk中使用Mediacode解码> <android mediacodec 编码demo(java)> <NDK中使用mediacodec编码h264> < ...

  5. android 反调试 方案,【木马分析】使用高级反调试与反HOOK的安卓恶意ROOT软件的深度分析(一):NATIVE层的调试...

    预估稿费:180RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 最近,我们发现了一个新的Android rootnik恶意软件,它使用开源的Android root ...

  6. android native java_在Android Native层中创建Java虚拟机实例

    前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...

  7. 在Android Native层中创建Java虚拟机实例

    前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...

  8. Android native层Hander原理分析

    目录 概述 源 自实现 下面简单叙述其原理: 如何使用: 注意问题: 概述 本篇探究 Android framework native层多媒体库中的 AHandler+ALooper+AMessage ...

  9. ffmpeg--把一个eclipse目录结构的Android工程转为Android Studio结构的工程,并调试jni层和native层错误

    我下面介绍的使用CMake的方式编译native的,直接使用Android.mk也可以. 1.建立一个support c++的Android工程 2.MainActivity.java复制过去,把re ...

最新文章

  1. PIL图像处理:读取图像,显示图像,ROI,保存图像
  2. pku 2195 Going Home KM最小权匹配问题
  3. 检测iOS的APP性能的一些方法
  4. python做请求转发_RequestDispatcher实现请求转发
  5. 机器学习里面常用知识
  6. 《Effective Objective-C 2.0》 阅读笔记 2
  7. 组件注册-@Scope-设置组件作用域
  8. 设计模式的七大设计原则:其三:依赖倒转原则
  9. MNIST数据集手写数字识别(一)
  10. out memory 内存溢出总结
  11. struts2的知识
  12. 社交网络影响力最大化基础知识总结
  13. 新版TeamTalk部署教程
  14. 一个vscode自动attach进程的插件开发实例
  15. arcgis for javascript 4.18 添加图片到地图(可用于实现雷达图片上图)
  16. PDF转Word免费的软件有哪些?教给你三种转换方法
  17. plsql免oracle客户端配置,PLSQL DEVELOPER 配置免安装ORACLE客户端
  18. Flask全套知识点从入门到精通,学完可直接做项目
  19. 设计图形抽象类java_Java基础——抽象类
  20. 视觉检测3D相机 平面度检测

热门文章

  1. 鼠标右击菜单,快捷键无法截到菜单栏
  2. js中关于邮箱号、手机号。。等的正则验证模板
  3. 加密保护软件 WinLicense常见问题整理大全(九):在运行时选择WinLicense消息的语言
  4. 解决火狐浏览器下载文件变为乱码
  5. [Pandas] 将某栏位中的值进行替换
  6. android椭圆转盘菜单,Android CircleMenu:旋转转盘选择Menu
  7. Neurons字幕组 | 2分钟带你看懂李飞飞论文:神经网络是怎样给一幅图增加文字描述,实现“看图说话”的?(附论文下载)
  8. 深度解析源码strcpy函数
  9. Microsoft MPI在win10系统下vs2019的配置及调试运行
  10. conda选择channel