GDB中如何给变量赋值格式字符串?Fortran调试二维数组美化打印问题
问题1:GDB便利变量赋值格式字符串的正确方法
你遇到的Invalid character '"' in expression报错是因为GDB的便利变量($开头的自定义变量)赋值字符串时,不能使用双引号包裹值,必须改用单引号。
- 正确的赋值命令:
set $format = '%.4f' - 如果是在自定义GDB函数中需要传入格式字符串作为参数,调用函数时也需要用单引号包裹格式参数,比如你写的二维数组打印函数名为
print_fortran_2d,调用方式为:print_fortran_2d your_arr_name '%.6f' - 验证赋值是否正确可以执行:
printf $format, 3.1415926
正常会输出3.1416的结果。
问题2:GDB函数内自动判断变量类型实现自适应格式
可以实现,GDB 7.3及以上版本提供了内置便利函数$_type_of(),可以直接返回传入变量的类型字符串,你只需要在自定义函数中增加类型分支判断,匹配Fortran的变量类型后自动分配对应格式串即可。
针对Fortran二维数组的场景,你可以通过取数组首元素$_type_of($array(1,1))获取数组元素的实际类型,再做分支判断,以下是参考代码片段:
define pfort2d # 入参:$1=二维数组名,$2=可选自定义格式串 set $arr = $arg0 # 获取数组维度边界(Fortran数组默认从1索引,可根据实际情况调整) set $lb1 = lbound($arr, 1) set $ub1 = ubound($arr, 1) set $lb2 = lbound($arr, 2) set $ub2 = ubound($arr, 2) # 无自定义格式时自动匹配类型 if $argc == 1 set $elem_type = $_type_of($arr($lb1, $lb2)) if $elem_type == 'real(kind=4)' || $elem_type == 'real*4' set $fmt = '%.4f ' elif $elem_type == 'real(kind=8)' || $elem_type == 'real*8' set $fmt = '%.8f ' elif $elem_type == 'integer(kind=4)' || $elem_type == 'int*4' set $fmt = '%6d ' elif $elem_type == 'logical(kind=4)' set $fmt = '%s ' else set $fmt = '%s ' end else set $fmt = $arg1 end # 遍历打印数组 do $i = $lb1, $ub1 do $j = $lb2, $ub2 if $elem_type == 'logical(kind=4)' printf $fmt, $arr($i,$j) ? "T" : "F" else printf $fmt, $arr($i,$j) end end printf "\n" end end
如果你的GDB版本较低没有$_type_of()函数,可以通过whatis命令配合临时输出解析实现类型判断,逻辑和上面一致。
内容的提问来源于stack exchange,提问作者k wu
相关产品推荐
相关产品推荐

