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

如何自动中断GDB运行以调试随机启动段错误的程序?

解决GDB自动重复运行并中断程序直至捕获段错误的问题

你之前的GDB命令无效,核心原因是run命令会阻塞GDB,直到程序终止或手动中断,导致shell sleep 3和interrupt都是在程序结束后才执行,根本无法在程序运行时触发中断。

方法一:GDB内部脚本实现

先开启GDB的异步目标模式,让run执行后GDB不阻塞,再用循环实现自动运行、等待、中断的逻辑:

  1. 启动GDB加载程序后,先执行:
set target-async on
  1. 执行以下循环脚本:
while 1
  run
  shell sleep 3
  interrupt
  # 检查是否因段错误停止(SIGSEGV的信号编号是11)
  if $_siginfo.si_signo == 11
    echo "段错误已捕获,停止循环\n"
    quit
  end
  kill
end

关键细节:

  • set target-async on:开启异步模式后,GDB启动程序后会立即返回命令行,允许后续命令执行。
  • $_siginfo.si_signo == 11:GDB内置变量$_siginfo记录程序停止的信号信息,11对应段错误的SIGSEGV信号。
  • kill:每次中断后清理当前进程,确保下一次run能正常启动新实例。

方法二:Shell脚本配合GDB实现

如果GDB内部脚本遇到兼容性问题,可使用Shell脚本自动化流程:

#!/bin/bash
PROGRAM_PATH="./your_program"  # 替换为你的程序路径

while true; do
  # 批量执行GDB命令:启动程序、等待3秒、中断、退出
  gdb -batch -ex "run" -ex "shell sleep 3" -ex "interrupt" -ex "quit" --args $PROGRAM_PATH
  
  # GDB退出码139对应程序因SIGSEGV退出
  if [ $? -eq 139 ]; then
    echo "捕获到段错误,启动GDB进入调试模式"
    gdb --args $PROGRAM_PATH
    break
  fi
done

这个脚本会自动重复启动程序,3秒后中断,直到捕获段错误时,自动启动GDB进入交互式调试。

内容的提问来源于stack exchange,提问作者Marco Montevechi Filho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:12:35