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时需要这些符号信息定位崩溃位置



相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
134 3
|
3月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
276 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
3月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
320 8
|
3月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
196 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
3月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
254 6
|
3月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
8月前
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
277 18
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1293 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
11月前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
506 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程

热门文章

最新文章