1,背景和准备
最近的mac项目集成了breakpad收集dmp文件,但是每次解析都要一行一行命令执行,太麻烦了,所以项目完成后,自己整了个下面的parse_crash.sh脚本,方便崩溃问题的快速解决。
当然,这里默认你已经集成了breakpad。我这边本地已经下载了breakpad的源码,Mac上编译过了,所以dump_syms、minidump_stackwalk都是有的。
使用准备:
1,需要提前确认目前文件夹下有以下文件:dump_syms、minidump_stackwalk、APPNAME.app.dSYM(这个要和崩溃发生的应用对应,编译时生成,每次发版本需要保存下来),
2,然后将dmp文件(可以是多个dmp文件)放入该文件夹,
3,执行./parse_crash.sh,
4,最终会在该文件夹下创建与dmp文件一一对应的txt文件,解析堆栈信息存放在对应文件里。
2,脚本
parse_crash.sh文件内容如下:
#!/bin/bash
function checkFileIfNotExit(){
if [ ! -e $1 ];then
echo $1"不存在,请确认该文件存在后再试!"
exit
fi
}
#替换成你自己的应用名字
APP_NAME="Langke"
APP_DYSM_FILE=$APP_NAME".app.dSYM"
APP_SYM_FILE=$APP_NAME".sym"
checkFileIfNotExit $APP_DYSM_FILE
# if [ ! -e $APP_DYSM_FILE ];then
# echo $APP_DYSM_FILE"不存在,请确认该文件存在后再试!"
# exit
# fi
CMD_DUMP_SYM_FILE="./dump_syms"
CMD_DUMP_STACK_FILE="./minidump_stackwalk"
PARSE_RESULT_SUFFIX="_parseresult.txt"
checkFileIfNotExit $CMD_DUMP_SYM_FILE
checkFileIfNotExit $CMD_DUMP_STACK_FILE
echo “/*********** dSYM文件转sym文件开始执行,可能需要等待几十秒到几分钟..... ************/”
trans=`$CMD_DUMP_SYM_FILE $APP_DYSM_FILE > $APP_SYM_FILE`
# echo "result=$?"
result=$?
echo "result=$result"
if [ $result -ne 0 ];then
# echo $trans
echo "执行"$CMD_DUMP_SYM_FILE"报错:dSYM文件转sym文件失败,具体信息请看上面的错误信息,请根据错误信息解决问题后再试!"
exit
fi
echo “/*********** dSYM文件转sym文件结束 ************/”
head1=`head -n1 $APP_SYM_FILE`
#取head1中被空格分割的第四个参数
symbol_num=`echo $head1 | awk '{print $4}'`
echo $symbol_num
symbols_dir="./symbols/"$APP_NAME"/"$symbol_num
mkdir -p $symbols_dir
mv $APP_SYM_FILE $symbols_dir
for file in `ls`
do
if echo "$file" | grep -q -E '\.dmp$'
then
fileName=${file/.dmp/}
$CMD_DUMP_STACK_FILE $file ./symbols > $fileName$PARSE_RESULT_SUFFIX
fi
done
echo "/******* dmp文档崩溃信息解析结果保存在下面文件中:*******/"
for file in `ls`
do
if echo "$file" | grep -q -E '\.dmp$'
then
fileName=${file/.dmp/}
echo $fileName$PARSE_RESULT_SUFFIX
fi
done
3,脚本使用
我的工作文件夹如图:
我这边在文件夹里丢入dmp文件,终端执行脚本(./parse_crash.sh)后最后几行如下:
/******* dmp文档崩溃信息解析结果保存在下面文件中:*******/
180BFDD1-EE67-4571-97B7-859BC3B8566B_parseresult.txt
所以,我这边的180BFDD1-EE67-4571-97B7-859BC3B8566B.dmp文件解析后结果保存在文件180BFDD1-EE67-4571-97B7-859BC3B8566B_parseresult.txt里,打开如下:
Operating system: Mac OS X
11.5.2 20G95
CPU: amd64
family 6 model 142 stepping 9
4 CPUs
GPU: UNKNOWN
Crash reason: EXC_BAD_INSTRUCTION / EXC_I386_INVOP
Crash address: 0x109040111
Process uptime: 1 seconds
Thread 0 (crashed)
0 Langke!main [main.cpp : 161 + 0x0]
rax = 0x00007fd1935b8b80 rdx = 0x0000000000000a56
rcx = 0x00007fd1935b8b80 rbx = 0x000000010b59bc38
rsi = 0x0000000000000ffe rdi = 0x0000000080000000
rbp = 0x00007ffee6c6a610 rsp = 0x00007ffee6c6a540
r8 = 0x0000000000009264 r9 = 0x000000000000fa13
r10 = 0x00000000ff7fffff r11 = 0x000000011b28a2f0
r12 = 0x00007ffee6c6a5c0 r13 = 0x0000000000000000
r14 = 0x00007ffee6c6a5d8 r15 = 0x0000000000000000
rip = 0x0000000109040111
Found by: given as instruction pointer in context
1 libdyld.dylib + 0x15f3d
rbp = 0x00007ffee6c6a628 rsp = 0x00007ffee6c6a620
main.cpp 161行是我故意定义使用空指针抛出的异常。