Files
2026-10-19 17:48:03 +08:00

103 lines
2.6 KiB
Bash

#!/bin/bash
TOOLCHAIN_PREFIX="aarch64-linux-gnu-"
ADDR2LINE="${TOOLCHAIN_PREFIX}addr2line"
if [ -z "$1" ]; then
echo "错误: 请指定 dump 文件路径"
echo "用法: $0 <dump文件路径> [QtUI所在目录]"
echo ""
echo "示例:"
echo " $0 ./dumpfile_2026_07_01_11_33_07.txt"
echo " $0 ./dumpfile_2026_07_01_11_33_07.txt /path/to/QtUI_dir"
exit 1
fi
DUMP_FILE="$1"
if [ ! -f "$DUMP_FILE" ]; then
echo "错误: 找不到 dump 文件: $DUMP_FILE"
exit 1
fi
DUMP_DIR="$(dirname "$DUMP_FILE")"
DUMP_BASENAME="$(basename "$DUMP_FILE")"
DUMP_NAME="${DUMP_BASENAME%.*}"
DUMP_EXT="${DUMP_BASENAME##*.}"
RESOLVED_FILE="${DUMP_DIR}/${DUMP_NAME}_resolved.${DUMP_EXT}"
if [ -n "$2" ]; then
QTUI_DIR="$2"
else
QTUI_DIR="$(cd "$(dirname "$0")" && pwd)"
fi
QTUI_PATH="${QTUI_DIR}/QtUI"
QTUI_DBG="${QTUI_DIR}/QtUI.dbg"
if [ ! -f "$QTUI_PATH" ]; then
echo "错误: 找不到 QtUI 文件: $QTUI_PATH"
echo "请确保 QtUI 和 QtUI.dbg 在同一目录下"
exit 1
fi
if [ ! -f "$QTUI_DBG" ]; then
echo "警告: 找不到 QtUI.dbg 文件: $QTUI_DBG"
echo "addr2line 将仅使用 QtUI 中的调试信息(如果有)"
fi
if ! command -v "$ADDR2LINE" &> /dev/null; then
echo "错误: 找不到 $ADDR2LINE"
exit 1
fi
BASE_ADDR=$(grep -oP 'Base address:\s*\K0x[0-9a-fA-F]+' "$DUMP_FILE")
if [ -z "$BASE_ADDR" ]; then
echo "错误: 无法从 dump 文件中解析 Base address"
exit 1
fi
echo "Base address: $BASE_ADDR"
echo "QtUI 路径: $QTUI_PATH"
echo "QtUI.dbg: $QTUI_DBG"
echo "输出文件: $RESOLVED_FILE"
echo ""
echo "正在解析 dump 文件: $DUMP_FILE"
echo "========================================="
echo ""
ADDR_LINE_REGEX='^(.+/QtUI)\(\+0x([0-9a-fA-F]+)\)\s+\[(0x[0-9a-fA-F]+)\]'
{
while IFS= read -r line; do
if [[ "$line" =~ $ADDR_LINE_REGEX ]]; then
OFFSET="0x${BASH_REMATCH[2]}"
RUNTIME_ADDR="${BASH_REMATCH[3]}"
read -r source_line
RESOLVED=$($ADDR2LINE -e "$QTUI_PATH" -f -C -p "$OFFSET" 2>/dev/null)
echo "$line"
if [ -n "$RESOLVED" ] && [ "$RESOLVED" != "?? ??:0" ] && [ "$RESOLVED" != "?? ??:?" ]; then
echo " $RESOLVED"
else
echo " $source_line"
fi
echo ""
elif [[ "$line" =~ ^Base\ address: ]]; then
echo "$line"
echo ""
elif [[ "$line" =~ ^Stack\ trace\ info: ]]; then
echo "$line"
echo ""
else
echo "$line"
fi
done < "$DUMP_FILE"
echo "========================================="
echo "解析完成"
} | tee "$RESOLVED_FILE"