Post

崩溃解析

dump文件是一个进程运行时的内存快照, 通常是在进程崩溃时生成的. 各平台的dump文件格式不尽相同,但是一般都包含产生的signal, 寄存器的值, 线程的堆栈信息等. 本文主要讨论如何解析这些信息.

目前存在4大主流平台的crash dump

  1. windows, *.dmp
  2. mac/ios, *.crash
  3. android, crash和ANR是分开存储的
  4. linux,core.<name>.<process id>

1. windows平台符号化

msvc + loadsymbols, 不会的话把dmp和.so还有exe放到同目录会自动解析

2. darwin下符号化

darwin下主要是使用atos做解析,.crash文件中包含了应用崩溃时的调用栈、线程状态、寄存器值等信息

崩溃日志的结构通常包括以下几个部分:

  • 崩溃信息:包括应用的名称、版本、操作系统版本等。
  • 崩溃线程:通常是崩溃时的线程,包含调用栈信息。
  • 其他线程:其他线程的状态和调用栈。
  • 寄存器信息:崩溃时各个寄存器的状态。

如果你的应用在构建时没有进行符号化(即没有使用 dSYM 文件),你将无法看到函数名和行号。符号化是将地址转换为可读的函数名和行号的过程。以下是符号化崩溃日志的步骤:

  1. 找到dSYM文件
  2. 使用 atos 命令

具体来讲, 找到崩溃日志中对应的地址

1
atos -o /path/to/YourApp.app/YourApp -arch arm64 -l <load_address> <address>

其中

  • -o指定你的应用可执行文件的路径。
  • -arch指定架构(例如 arm64 或 x86_64)。
  • -l是加载地址(在崩溃日志中通常会提到)。
  • <address>是在崩溃日志中找到的地址。

3. android下符号化

3.1 准备工作

  • 获取符号文件:确保你有应用程序的符号文件(如 .so 文件),这些文件通常在构建时生成,并且包含调试信息。
  • 安装调试工具:你需要一些工具来分析 .dmp 文件,比如ndk-stackaddr2line,这两个都在android-ndk目录下提供

3.2 使用ndk-stack

1
ndk-stack -sym <path_to_your_symbols> -dump <path_to_your_dump_file>
  • -sym选项后面跟的是包含符号信息的目录(通常是你的 .so 文件所在的目录)。
  • -dump选项后面跟的是你的.dmp文件的路径。

运行之后,会显示对应的堆栈跟踪信息。

3.3 使用addr2line工具

1
addr2line -f -e <path_to_your_so_file> <address>
  • -f 选项用于输出函数名。
  • -e 选项后面跟的是你的 .so 文件的路径。
  • 是你在 .dmp 文件中找到的地址。

另外如果你是c++的话,你可以额外的加上-Cf, 其中-C代表c++

详细内容的了解可以看android crashANR

linux下符号化

coredump如果带-g, 直接拿gdb去调试就好

This post is licensed under CC BY 4.0 by the author.

Trending Tags