实习笔记二----Mac一些处理崩溃的相关工具

实习笔记二—-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等。