适应此answer后,我编写了以下循环,以在名为“gdb_script.gs”的脚本中简单地打印 gdb 中的数组。我做错了什么?
set $end=64
while ($i<$end)
print $i
print volfrac($i, :, 1)
set $i=$i+1
end
其中 volfrac(:,:,:) 是一个 Fortran 数组。我收到错误:
gdb_script.gs:14: Error in sourced command file:
A syntax error in expression, near `<$end)'.
另一个答案完全没有抓住重点。提示是报告的错误:
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 < 32).
GDB 新手(就像我自己一样)应该知道,除非删除
while
和第一个大括号之间的空白,否则接受的答案不起作用。
此外,
.lt.
语法可能仅适用于 Fortran (https://sourceware.org/gdb/current/onlinedocs/gdb/Fortran.html)。由于问题的标题不是专门针对 Fortran 开发人员制定的,因此接受的答案可能会产生误导。
set $i = 0
p $i++
继续按Enter这是我发现的最简单的逻辑之一
由于 voltrac() 是一个数组,那么我认为这是输出中显示的语法错误 - 它应该是“print volfrac[]”。
下面我向您详细展示了 C 程序的详细步骤(因为您使用的是 gdb,而 gdb 只处理 ELF 文件,所以这里是相同的 - gdb + C 的 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.
set $i = 0
while ($i<5)
p $i
//call function
set $i = $i + 1
end