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

问题描述 投票:0回答:5

适应此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)'.
fortran gdb
5个回答
13
投票

另一个答案完全没有抓住重点。提示是报告的错误:

    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).


4
投票

GDB 新手(就像我自己一样)应该知道,除非删除

while
和第一个大括号之间的空白,否则接受的答案不起作用。

此外,

.lt.
语法可能仅适用于 Fortran (https://sourceware.org/gdb/current/onlinedocs/gdb/Fortran.html)。由于问题的标题不是专门针对 Fortran 开发人员制定的,因此接受的答案可能会产生误导。


2
投票
set $i = 0
p $i++

继续按Enter这是我发现的最简单的逻辑之一


0
投票

由于 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.

0
投票
set $i = 0
while ($i<5)
  p $i
  //call function
  set $i = $i + 1
end
© www.soinside.com 2019 - 2024. All rights reserved.