Android系统调试-程序崩溃调试

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Android系统调试-程序崩溃调试

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 coredump
  0x00000328
  /home/lhl/test/coredump.c:4


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


总结


上面展示了一个完成的Native程序崩溃日志的调试步骤,其中有几点需要注意的地方


编译应用程序时需要制定-g选项,该选项会在应用程序中添加符号信息,而在使用addr2line时需要这些符号信息定位崩溃位置



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
1月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
22天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
24天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
1月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
70 16
|
1月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
52 8
|
29天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
1月前
|
算法 JavaScript Android开发
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
110 2
|
1月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。