#!/bin/bash TOOLCHAIN_PREFIX="aarch64-linux-gnu-" ADDR2LINE="${TOOLCHAIN_PREFIX}addr2line" if [ -z "$1" ]; then echo "错误: 请指定 dump 文件路径" echo "用法: $0 [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"