利用NDK崩溃日志查找BUG

发表于:2018-7-13 11:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:知名所以    来源:博客园

分享:
  下面来逐行解读:
  1. ndk crash log以 *** *** *** *** *** 开始.
  2. 第一行 Build fingerprint: 'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys' 指明了运行的Android版本, 如果您有多份crash dump的话这个信息就比较有用了.
  3. 接着一行显示的是当前的线程id(pid)和进程id(tid). 如果当前崩溃的线程是主线程的话, pid和tid会是一样的~
  4. 第四行, 显示的是unix信号. 这里的 signal 11 , 即 SIGSEGV , 表示段错误, 是最常见的信号.( 什么是unix信号 , 什么是 SIGSEGV )
  5. 接下来的部分是系统寄存器的dump信息.
  rX( X=[0~9] ): 代表整数寄存器
  dX( X=[0~31]): 是浮点指针寄存器
  fp (or r11) : 指向当前正在执行的函数的堆栈底.
  ip (or r12) : 一个寄存器, 我也没弄明白是干啥的.
  sp (or r13) : 当前正在执行的函数的堆栈顶.(跟fp相对应)
  lr (or r14) : link register . 简单来说, 当当前指令执行完了, 就会从这个寄存器获取地址, 来知道需要返回到哪里继续执行.
  pc (or r15) : program counter. 存放下一条指令的地址.
  cpsr : Current Program Status Register. 表示当前运行环境和状态的一些字节位.
  Crash dump还包含PC之前和之后的一些内存字段.
  最后, 是崩溃时的调用堆栈. 如果你执行的是debug版本, 还能还原一些c++代码.
  利用ndk-stack定位崩溃代码
  上面的一些信息能简单的帮你定位以下问题. 如果信息量还不够大的话, 那就还有最后一招: 还原历史.
  Android NDK 自从版本R6开始, 提供了一个工具 ndk-stack ( 在目录 {ndk_root}/ 中 ). 这个工具能自动分析dump下来的crash log, 将崩溃时的调用内存地址和c++代码一行一行对应起来.
  我们先看一下用法, 执行命令 ndk-stack --help
  Usage:
  ndk-stack -sym <path> [-dump <path>]
  -sym  Contains full path to the root directory for symbols.
  -dump Contains full path to the file containing the crash dump.
  This is an optional parameter. If ommited, ndk-stack will
  read input data from stdin
  -dump参数很容易理解, 即dump下来的log文本文件. ndk-stack 会分析此文件.
  -sym参数就是你android项目下,编译成功之后, obj 目录下的文件.
  下面我们就来示范一下:
  $ adb logcat | ndk-stack -sym ./obj/local/armeabi
  ********** Crash dump: **********
  Build fingerprint: 'htc_wwe/htc_bravo/bravo:2.3.3/
  GRI40/96875.1:user/release-keys'
  pid: 1723, tid: 1743  >>> com.packtpub.droidblaster <<<
  signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000000c
  Stack frame #00  pc 00010a2c  /data/data/com.packtpub.droidblaster/lib/libdroidblaster.so: Routine update in /home/packt/Project/Chapter11/DroidBlaster_Part11/jni/TimeService.cpp:25
  Stack frame #01  pc 00009fcc  /data/data/com.packtpub.droidblaster/lib/libdroidblaster.so: Routine onStep in /home/packt/Project/Chapter11/DroidBlaster_Part11/jni/DroidBlaster.cpp:53
  Stack frame #02  pc 0000a348  /data/data/com.packtpub.droidblaster/lib/libdroidblaster.so: Routine run in /home/packt/Project/Chapter11/DroidBlaster_Part11/jni/EventLoop.cpp:49
  Stack frame #03  pc 0000f994  /data/data/com.packtpub.droidblaster/lib/libdroidblaster.so: Routine android_main in /home/packt/Project/Chapter11/DroidBlaster_Part11/jni/Main.cpp:31
  ...
  熟悉的代码出现啦~~

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号