如何在gdb脚本中编写循环?

时间:2017-09-27 18:17:38

标签: gdb

在调整了这个answer之后,我编写了以下循环来简单地在一个名为" gdb_script.gs"的脚本中在gdb中打印一个数组。我做错了什么?

**

其中volfrac(:,:,:)是一个fortran数组。我收到了错误:

set $end=64  
while ($i<$end)
   print $i
   print volfrac($i, :, 1)
   set $i=$i+1
end

4 个答案:

答案 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 ,这是我发现的最简单的逻辑之一