如何在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命令直接查看
解决方法
- 用C类型强制转换
Fortran的double precision等价于C的double类型,GDB对C类型解析更稳定,执行:
(gdb) p *(double *)0x7fffef16bcb0
- 正确使用Fortran类型语法
确保类型声明的语法正确,GDB中Fortran双精度实型的指针强制转换需要严格写法:
(gdb) p *(real(kind=8) *)0x7fffef16bcb0
注意不要遗漏括号或符号,之前的写法可能存在语法错误导致GDB无法识别类型。
- 关闭编译优化并确保调试信息完整
编译Fortran代码时必须加上-g生成调试信息,同时用-O0关闭优化(默认优化级别可能导致变量被寄存器存储或优化,地址无效):
gfortran -g -O0 your_code.f90 -o your_program
- 用
x命令指定格式查看
使用x命令时明确指定双精度浮点数格式(g表示8字节,f表示浮点数):
(gdb) x/gf 0x7fffef16bcb0
内容的提问来源于stack exchange,提问作者hjm_els
相关产品推荐
相关产品推荐

