如何编写GDB非交互脚本捕获SIGSEGV并打印错误位置后继续
问题描述
我在非交互模式下用gdb调试C程序,程序本身已经通过signal机制监测段错误,但需要借助gdb定位触发错误的代码位置。
尝试过两种命令:
- 执行命令:
gdb -ex "handle SIGSEGV stop print pass" ./script -ex "run"
gdb和程序都会捕获错误,但必须手动输入continue才能继续调试后续代码。
- 执行命令:
gdb -ex "handle SIGSEGV nostop print pass" ./script -ex "run"
gdb仅输出Thread 86241 "server-ev" received signal SIGSEGV, Segmentation fault.,不会打印触发错误的代码行。
另外还尝试在配置文件中添加:
define handle_sigsegv bt continue end
但没有生效。
请问如何编写无交互的gdb脚本,实现捕获SIGSEGV时打印错误信息(含错误代码行)并自动继续程序执行?
解决方案
要实现目标,需结合gdb的信号处理规则与内置钩子脚本,具体步骤如下:
1. 编写gdb脚本文件
创建名为segv_handler.gdb的脚本,内容如下:
# 配置SIGSEGV信号处理:触发时停止程序、打印信号信息、允许程序接收信号 handle SIGSEGV stop print pass # 定义程序停止后的自动执行逻辑 define hook-stop # 判断当前停止是否由SIGSEGV触发 if $_signal == SIGSEGV # 打印完整调用栈(含代码行与局部变量) bt full # 显示错误位置附近的代码上下文 list # 自动继续执行程序 continue end end # 启动目标程序 run
2. 非交互模式运行gdb
执行以下命令,让gdb加载脚本并启动程序:
gdb -x segv_handler.gdb ./script
关键说明
hook-stop是gdb内置钩子,程序每次停止时都会触发,通过$_signal变量可判断触发停止的信号类型。bt full输出完整调用栈,若只需简化栈信息,可替换为bt。list命令会显示错误行附近的代码片段,需确保程序编译时添加了调试参数-g,否则gdb无法解析代码行信息。
内容的提问来源于stack exchange,提问作者Googlebot
相关产品推荐
相关产品推荐

