实习笔记二—-Mac一些处理崩溃的相关小工具的用法介绍。
google的breakpad和crashpad项目下有一些实用的小工具。
dump_syms
可以用于分离二进制文件的符号,包括可执行文件的和动态库的符号,分离得到的文件为文本格式。如果有对应的dSYM文件,可以加上-c的命令行选项指定附加的dSYM文件。
minidump_stackwalk
处理dump文件,给出各个线程中的函数调用的trace_back.如果提供了符号路径,可以根据地址得到正在调用的符号。加上-s
选项会在trace_back输出中得到栈内存的内容。
minidump_dump
解析dump文件中的信息,包括线程信息,模块信息,栈内存内容,系统信息,其他信息等。MDRawHeader的头部信息可以看到minidumnp的时间戳(应该是UTC+0时间)
加上选项-x
可以得到更为可读的栈内存内容,格式如下:
000003f0 00 00 00 00 00 00 00 00 65 78 65 63 75 74 61 62 |........executab|
00000400 6c 65 5f 70 61 74 68 3d 2f 55 73 65 72 73 2f 65 |le_path=/Users/a|
00000410 66 61 6e 2f 2e 6c 61 72 6b 64 72 69 76 65 2f 53 |bcd/.larkdrive/S|
00000420 79 6e 63 44 69 73 6b 00 2f 55 73 65 72 73 2f 65 |yncDisk./Users/a|
00000430 66 61 6e 2f 2e 6c 61 72 6b 64 72 69 76 65 2f 53 |bcd/.larkdrive/S|
00000440 79 6e 63 44 69 73 6b 00 2d 2d 68 65 61 72 74 2d |yncDisk.--heart-|
exception_port_tool
可以用来查看与修改进程的Mach异常端口。需要超级用户权限。例如,如果需要知道同步盘的Mach异常监听端口,假设同步盘的PID为36200,命令如下
sudo ./exception_port_tool --pid=36200 --show-task
输出的结果为
task exception port 0, mask 0x4e (BAD_ACCESS|BAD_INSTRUCTION|ARITHMETIC|BREAKPOINT), port 0x1103, behavior 0x1 (DEFAULT), flavor 13 (NONE)
task exception port 1, mask 0x1c00 (CRASH|RESOURCE|GUARD), port 0xa03, behavior 0x80000003 (STATE_IDENTITY|MACH), flavor 7 (THREAD)
task exception port 2, mask 0x2000 (CORPSE_NOTIFY), port 0x903, behavior 0x80000003 (STATE_IDENTITY|MACH), flavor 7 (THREAD)
generate_dump
可以为一个正在运行中的进程生成dump文件。需要超级用户权限。生成的dump经过minidump_stackwalk解析可以知道各个线程的工作情况。 不过由于同步盘自带崩溃的处理句柄,因此想生成dump可以直接发个kill -6的信号触发崩溃就能够生成dump了。
kill -6 $PID
附:windbg
实习期间也学习了windbg对崩溃进行分析,主要命令包括:
!symnoise on
, reload -f xxx
, .excr;kb
, !analyze -v
等。