You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写GDB非交互脚本捕获SIGSEGV并打印错误位置后继续

问题描述

我在非交互模式下用gdb调试C程序,程序本身已经通过signal机制监测段错误,但需要借助gdb定位触发错误的代码位置。

尝试过两种命令:

  1. 执行命令:
gdb -ex "handle SIGSEGV stop print pass" ./script -ex "run"

gdb和程序都会捕获错误,但必须手动输入continue才能继续调试后续代码。

  1. 执行命令:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:42:08