在调整了这个answer之后,我编写了以下循环来简单地在一个名为" gdb_script.gs"的脚本中在gdb中打印一个数组。我做错了什么?
**
其中volfrac(:,:,:)是一个fortran数组。我收到了错误:
set $end=64
while ($i<$end)
print $i
print volfrac($i, :, 1)
set $i=$i+1
end
答案 0 :(得分:0)
由于voltrac()是一个数组,所以我认为它是输出中显示的语法错误 - 它应该是“print volfrac []”。
下面我向您展示了C程序的详细步骤(因为您正在使用gdb,而gdb只能使用ELF文件,所以它在这里是相同的 - 用于C的gdb + ELF文件)强>:
(gdb) run Starting program: /home/tthtlc/a.out Breakpoint 1, main () at main.c:5 5 main(){
首先,我走过几次并注意到我的任务:
(gdb) s 8 for(i=0;i<10;i++) (gdb) 9 for(j=0;j<10;j++) (gdb) 10 for(k=0;k<10;k++) { (gdb) **11 volfrac[i][j][k]=0xdeadbeef;** (gdb)
现在是打印输出(并注意打印阵列的不同方式):
(gdb) print /x volfrac[0][0][0] $5 = 0xdeadbeef (gdb) print /x volfrac[0][0] $6 = {0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x0, 0x0, 0x0, 0x0} (gdb) print /x volfrac[0] $7 = {{0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, (gdb) print /x volfrac $8 = {{{0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, (gdb) print /x volfrac(0,0,0) Invalid data type for function to be called.
答案 1 :(得分:0)
另一个答案完全忽略了这一点。提示是报告的错误:
gdb_script.gs:14: Error in sourced command file:
A syntax error in expression, near `<$end)'.
提示为<$end)
,这意味着while语句中存在语法错误。通过进一步的实验,如果其他人在将来需要它,我会发布我的结果:
set $ipx=0
set $end=32
while ($ipx .lt. 32)
print $ipx
print ro($ipx, 1)
set $ipx=$ipx+1
end
关键是使用fortran语法进行比较($ ipx .lt.32)而不是通常的“c”语法($ ipx&lt; 32)。
答案 2 :(得分:0)
GDB新手(作为我本人)应该知道,除非您删除while
和第一个大括号之间的空格,否则接受的答案将无效。
此外,.lt.
语法可能仅适用于Fortran(https://sourceware.org/gdb/current/onlinedocs/gdb/Fortran.html)。由于问题的标题不是专门针对Fortran开发人员制定的,因此可接受的答案可能会产生误导。
答案 3 :(得分:0)
set $i = 0
p $i++
继续按下 Enter ,这是我发现的最简单的逻辑之一