#!/bin/bash
#1. AWK_SCRIPT:在awk命令中被用作文本匹配的文件,并提供了对应的Action。
# 当匹配的文本被发现时,对应的Action会被执行。
#2. SH_SCRIPT:当前脚本会对传入的crash report文件用awk进行修改,结果就
# 存储在SH_SCRIPT中,将来会再次被include到当前的脚本中来执行。
#
#Note:$$是脚本所在进程的PID。
AWK_SCRIPT=/tmp/symbolizecrashlog_$$.awk
SH_SCRIPT=/tmp/symbolizecrashlog_$$.sh
if [[ $# < 2 ]]
then
echo "Usage: $0 [ -arch <arch> ] symbol-file [ crash.log, … ]"
exit 1
fi
if [[ "${1}" == ‘-arch’ ]]
then
ARCH_PARAMS="-arch ${2}"
#Note:从参数列表中删除2个参数。
shift 2
fi
shift
#多行文本将会被重定向到AWK_SCRIPT所指定的文件中。说白了就是生成awk匹配文件。
cat > "${AWK_SCRIPT}" << _END
/^[0-9]+ +[-._a-zA-Z0-9]+ *\t0x[0-9a-fA-F]+ / {
addr_index = index(\$0,\$3);
end_index = addr_index+length(\$3);
line_legnth = length;
printf("echo ‘%s’\"\$(symbolize %s ‘%s’)\"\n",substr(\$0,1,end_index),
\$3,substr(\$0,end_index+1,line_legnth-end_index));
next;
}
{ gsub(/’/,"’\\\\”"); printf("echo ‘%s’\n",\$0); }
_END
{
# Translate the address using atos
#有意思的是另外一种容易混淆的写法:
#">/dev/null 2>&1" also can write as "1>/dev/null 2>&1"
#stdout redirect to /dev/null (no stdout),
#and redirect stderr to stdout (stderr gone as well).
#End up it turns both stderr and stdout off.
# If successful, output the translated symbol. If atos returns an address, output the original symbol
#个人觉得这个写法有问题。双引号中禁用了通配符,而且搜索了一下,没发现##的用法。
#可能的写法应该是$SYMBOL =~ "0x[0-9a-fA-F]*"。
if [[ "${SYMBOL##0x[0-9a-fA-F]*}" ]]
then
echo -n "${SYMBOL}"
else
echo -n "${2}"
fi
}
awk -f "${AWK_SCRIPT}" $* > "${SH_SCRIPT}"
. "${SH_SCRIPT}"