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

调试步骤

编写用于调试的程序

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

编译并将其下载到Android系统

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

运行查看崩溃日志

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 00000000
            r4 bebcc894  r5 bebcc89c  r6 00000001  r7 b6f5730c
            r8 00000000  r9 00000000  sl 00000000  fp bebcc85c
            ip b6f3264c  sp bebcc850  lr b6eed39f  pc b6f57328  cpsr 60070010
            d0  0000000000000000  d1  0000000000000000
            d2  0000000000000fff  d3  0000b30a0000b30a
            d4  000000000000b30a  d5  0000000000000000
            d6  0000000000000000  d7  0000000000000000
            d8  0000000000000000  d9  0000000000000000
            d10 0000000000000000  d11 0000000000000000
            d12 0000000000000000  d13 0000000000000000
            d14 0000000000000000  d15 0000000000000000
            d16 0000000000000000  d17 0000000000000fff
            d18 0000000000000000  d19 0000000000000000
            d20 0000000000000000  d21 0000000000000000
            d22 0000000000000000  d23 0000000000000000
            d24 0000000000000000  d25 0000000000000000
            d26 0000000000000000  d27 0000000000000000
            d28 0000000000000000  d29 0000000000000000
            d30 0000000000000000  d31 0000000000000000
            scr 00000000        backtrace:
            #00 pc 00000328  /data/coredump/coredump (main+28)
            #01 pc 0001239d  /system/lib/libc.so (__libc_init+44)**

根据崩溃日志定位崩溃位置

崩溃日志中提供了程序崩溃时的函数调用栈,其详细记录了程序运行时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,触发段错误

总结

上面展示了一个完成的Native程序崩溃日志的调试步骤,其中有几点需要注意的地方
1. 编译应用程序时需要制定-g选项,该选项会在应用程序中添加符号信息,而在使用addr2line时需要这些符号信息定位崩溃位置

Android系统调试-程序崩溃调试相关推荐

  1. windows程序崩溃调试终极武器

    windows程序崩溃调试终极武器---dump文件 一.前言 前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑框,如果 ...

  2. android系统应用程序,Android系统应用程序基本概念解读

    经常关注我们51CTO的朋友们应该知道,在以前的文章中我们对Android这一手机系统有一个详细的跟踪介绍,方便大家学习应用这一新的功能强大的开源手机系统,比如对Android源码的编译的解析的解析等 ...

  3. Android* 操作系统应用程序远程调试

    Android* Debug Bridge Android Debug Bridge (ADB) 是一种命令行工具,可处理主机上的调试程序(通常为 GDB* 或 DDMS*(Dalvik* 调试监测程 ...

  4. android处理crash程序崩溃异常

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  5. 关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题

    在win7 64位系统安装VC2015的编译器, 并安装了 Qt 5.6 -5.7 VC2015 64位版本测试, 均出现 debug 构建的程序崩溃,然而 profile 和release却没有问题 ...

  6. android如何不用系统签名,更新Android系统应用程序,带/不带平台签名

    让我们首先澄清所有类型的应用程序之间的差异. 系统应用程序是位于/ system / app文件夹中的应用程序.这些应用程序具有一个标志ApplicationInfo.FLAG_SYSTEM集.在普通 ...

  7. android 内存占用工具,Android系统检测程序内存占用各种方法

    1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal:         840868 kB MemFree:          457 ...

  8. android系统应用程序,Android调用系统应用程序

    Android调用系统应用程序: 1.直接拨打电话: Intent callIntent = new Intent(Intent.ACTION_CALL, Uri .parse("tel:1 ...

  9. Android系统中固件崩溃后使用uevent机制重新加载固件 流程分析

    [前言] Android系统为了保证各商业公司的利益,允许在系统中使用不开源的固件.因此我们可以看到比如用于音频处理的.用于键盘支持的等等大量固件.既然这么多模块要用到固件,那么我们也有必要来了解一下 ...

最新文章

  1. 用IIS怎样在局域网内建网站
  2. ITK:重新缩放图像
  3. VB讲课笔记05:数据输入输出
  4. C#中的深度学习:Keras.NET中的硬币识别,第二部分
  5. mysql分段统计ceil
  6. WebLogic 之安全配置
  7. vue-drag-resize + html2canvas合成图片并下载
  8. 3 微信开发本地代理环境的搭建--实现将内网ip映射到外网
  9. php 英文转中文,php 中英文语言转换的方法
  10. ArcGIS:如何对要素类进行查询要素属性、更改符号、标记?
  11. 如何下载旧版本android NDK
  12. 12种常见贴片焊接工具
  13. u盘中病毒解决方法 (文件夹变成exe文件)
  14. android 雪球红包脚本,利用adb shell和node.js实现抖音自动抢红包功能(推荐)
  15. Hive集成Tez让大象飞起来
  16. 一图看懂Python生态圈图像格式转换
  17. 爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用
  18. 采访优秀学长学姐后的感悟与体会
  19. jQuery参考手册
  20. 计算机网络校园局域网课题,毕业论文基于VLAN技术的校园局域网建设word文档_全文免费在线阅读(推荐阅读)...

热门文章

  1. php composer failed to open file: phar://composer.phar/bin........问题解决
  2. 《机器学习——数学公式推导合集》1. 线性模型之最小二乘法(least square method)求解线性模型
  3. 生产无线充线圈要选好设备
  4. 【学习笔记】MATLAB与数学建模——粒子群算法(未完成)
  5. 【U盘专题】U盘的购买、使用、量产
  6. 认识Json本质 一个较复杂Json串的解析实例
  7. Python:结合列表和字典,编写一个简单的学生成绩管理系统
  8. 深圳公安局计算机招聘信息中心,深圳市公安局2021年招聘大学毕业生
  9. html listview遍历,list-view.html
  10. 真正的ps切图方法(前端必看)