如何通过bash或python脚本实现core dump分析日志自动导出
该需求完全可以实现,以下分别提供Bash、Python两种可直接使用的实现方案:
Bash 实现方案
利用gdb原生支持的批处理模式即可跳过交互式操作,直接执行预设的分析命令并输出日志:
#!/bin/bash # 用法:./analyze_core.sh <目标二进制文件> <core dump文件> if [ $# -ne 2 ];then echo "用法错误:$0 <目标二进制文件> <core dump文件>" exit 1 fi BIN_FILE=$1 CORE_FILE=$2 gdb --batch "${BIN_FILE}" "${CORE_FILE}" \ -ex "set logging file gdb.txt" \ -ex "set logging on" \ -ex "bt full" \ -ex "info threads" \ -ex "thread apply all bt full" \ -ex "quit" echo "分析完成,结果已写入gdb.txt"
脚本说明:--batch参数指定gdb运行在批处理模式,执行完所有-ex指定的命令后自动退出,不会进入交互界面。你可以根据自己的分析需求增减-ex后的gdb命令。
Python 实现方案
基于Python标准库subprocess调用gdb批处理能力,无需安装第三方依赖:
import subprocess import sys def analyze_core(bin_path: str, core_path: str, log_path: str = "gdb.txt") -> None: # 自定义需要执行的gdb命令列表,可按需增减 gdb_commands = [ f"set logging file {log_path}", "set logging on", "bt full", "info threads", "thread apply all bt full", "quit" ] # 构造完整执行命令 run_cmd = ["gdb", "--batch", bin_path, core_path] for cmd in gdb_commands: run_cmd.extend(["-ex", cmd]) try: subprocess.run( run_cmd, check=True, capture_output=True, text=True ) print(f"分析完成,日志已写入:{log_path}") except subprocess.CalledProcessError as e: print(f"gdb执行失败,错误信息:{e.stderr}") if __name__ == "__main__": if len(sys.argv) != 3: print(f"用法:python3 {sys.argv[0]} <目标二进制文件> <core dump文件>") sys.exit(1) analyze_core(sys.argv[1], sys.argv[2])
注意事项
- 使用前请确保目标二进制文件与生成core dump时的程序版本完全一致,且编译时添加了
-g参数保留调试符号,否则会出现调用栈解析失败、地址无法翻译的问题 - 脚本中的gdb命令可根据分析需求自行调整,比如需要查看寄存器信息可添加命令
info registers,需要查看指定内存内容可添加x <内存地址>相关命令 - 若不需要全线程调用栈,可删除
thread apply all bt full对应行,减少日志体积
内容的提问来源于stack exchange,提问作者Zmoey
相关产品推荐
相关产品推荐

