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

如何在Fortran中以编程方式设置断点 / 在Fortran中触发SIGINT信号

Fortran实现GDB可编程断点的三种方案

通用提醒:所有方案的触发逻辑仅在GDB调试场景下有效,直接运行程序时触发对应信号会导致程序异常终止,正式发布程序前请删除所有断点相关代码。

方案1:可移植C绑定方案(全编译器通用)

原理和C/C++的实现逻辑完全一致,通过调用C标准库的raise()函数发送SIGTRAP信号,GDB默认会捕获该信号并停止程序运行。
完整代码示例:

! 定义断点工具模块
module gdb_break_utils
  use, intrinsic :: iso_c_binding
  implicit none
  ! 声明C标准库raise函数的绑定接口
  interface
    function c_raise(sig) result(ret) bind(C, name='raise')
      import :: c_int
      integer(c_int), value :: sig
      integer(c_int) :: ret
    end function c_raise
  end interface
contains
  subroutine trigger_gdb_break()
    ! Linux系统下SIGTRAP固定值为5,其他类Unix系统可自行查询对应数值替换
    integer(c_int), parameter :: SIGTRAP = 5
    integer(c_int) :: dummy
    dummy = c_raise(SIGTRAP)
  end subroutine trigger_gdb_break
end module gdb_break_utils

! 调用示例
program demo
  use gdb_break_utils
  implicit none
  integer :: loop_cnt
  do loop_cnt = 1, 100
    ! 你的自定义触发条件,满足时自动触发GDB断点
    if (loop_cnt == 67) then
      call trigger_gdb_break()
    end if
  end do
end program demo

使用说明:

  • 编译程序时必须添加-g参数保留调试信息
  • 直接用GDB启动编译好的可执行文件即可,无需额外配置,触发信号时GDB会自动停止在断点位置

方案2:内置abort调用方案(无额外代码依赖)

如果不想写C绑定代码,可以直接调用Fortran内置的abort()子程序,配合GDB的信号规则配置实现断点效果。
代码示例:

program demo
  implicit none
  integer :: loop_cnt
  do loop_cnt = 1, 100
    if (loop_cnt == 67) then
      call abort()
    end if
  end do
end program demo

使用说明:

  • 编译时同样需要添加-g参数
  • 进入GDB加载程序后,先执行命令 handle SIGABRT stop nopass,配置GDB捕获SIGABRT信号后停止且不把信号传给程序,避免程序直接退出
  • 运行程序后满足条件时就会自动停下

方案3:GNU Fortran专属简化方案

如果使用gfortran编译,可以直接调用内置的__builtin_trap()函数,无需额外定义模块或配置,使用最简单。
代码示例:

program demo
  implicit none
  integer :: loop_cnt
  do loop_cnt = 1, 100
    if (loop_cnt == 67) then
      call __builtin_trap()
    end if
  end do
end program demo

使用说明:该方案仅支持gfortran编译器,可移植性低于方案1。

内容的提问来源于stack exchange,提问作者user2722085

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:27:05