崩溃解析
dump文件是一个进程运行时的内存快照, 通常是在进程崩溃时生成的. 各平台的dump文件格式不尽相同,但是一般都包含产生的signal, 寄存器的值, 线程的堆栈信息等. 本文主要讨论如何解析这些信息.
目前存在4大主流平台的crash dump
- windows, *.dmp
- mac/ios, *.crash
- android, crash和ANR是分开存储的
- linux,
core.<name>.<process id>
1. windows平台符号化
msvc + loadsymbols, 不会的话把dmp和.so还有exe放到同目录会自动解析
2. darwin下符号化
darwin下主要是使用atos做解析,.crash文件中包含了应用崩溃时的调用栈、线程状态、寄存器值等信息
崩溃日志的结构通常包括以下几个部分:
- 崩溃信息:包括应用的名称、版本、操作系统版本等。
- 崩溃线程:通常是崩溃时的线程,包含调用栈信息。
- 其他线程:其他线程的状态和调用栈。
- 寄存器信息:崩溃时各个寄存器的状态。
如果你的应用在构建时没有进行符号化(即没有使用 dSYM 文件),你将无法看到函数名和行号。符号化是将地址转换为可读的函数名和行号的过程。以下是符号化崩溃日志的步骤:
- 找到
dSYM
文件 - 使用 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-stack
或addr2line
,这两个都在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 crash和ANR
linux下符号化
coredump如果带-g, 直接拿gdb去调试就好
This post is licensed under CC BY 4.0 by the author.