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

如何在GDB中正确解引用Fortran双精度实型值?

Fortran双精度实型变量GDB地址访问错误问题解决

直接打印Fortran双精度实型变量时GDB工作正常:

(gdb) p t(27,8,1)
$17 = 4816.0976560758863

但通过地址解引用查看时得到错误结果:

(gdb) p &t(27,8,1)
$18 = (PTR TO -> ( real(kind=8) )) 0x7fffef16bcb0
(gdb) p *(real *)0x7fffef16bcb0
$22 = -nan(0x7d1430)

尝试过以下方法均无效:

  • p *(real(kind(0.0d0) *)0x7fffef16bcb0)及类似写法
  • 自定义GDB脚本vpr:
    define vpr
    # print variable in e-format
    p $arg0
    printf "$arg0 %e\n",$arg0
    end
    
  • 自定义GDB脚本fpr:
    define fpr
      p /s *(real *)$arg0
    end
    
  • 使用x命令直接查看

解决方法

  1. 用C类型强制转换
    Fortran的double precision等价于C的double类型,GDB对C类型解析更稳定,执行:
(gdb) p *(double *)0x7fffef16bcb0
  1. 正确使用Fortran类型语法
    确保类型声明的语法正确,GDB中Fortran双精度实型的指针强制转换需要严格写法:
(gdb) p *(real(kind=8) *)0x7fffef16bcb0

注意不要遗漏括号或符号,之前的写法可能存在语法错误导致GDB无法识别类型。

  1. 关闭编译优化并确保调试信息完整
    编译Fortran代码时必须加上-g生成调试信息,同时用-O0关闭优化(默认优化级别可能导致变量被寄存器存储或优化,地址无效):
gfortran -g -O0 your_code.f90 -o your_program
  1. 用x命令指定格式查看
    使用x命令时明确指定双精度浮点数格式(g表示8字节,f表示浮点数):
(gdb) x/gf 0x7fffef16bcb0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:30:04