提交原始齿轮泵代码
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user