【问题标题】:How do I write a loop in a gdb script?如何在 gdb 脚本中编写循环?
【发布时间】:2017-09-27 18:17:37
【问题描述】:

在修改了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)'.

【问题讨论】:

  • 你不想在比较之前初始化$i 吗?

标签: fortran gdb


【解决方案1】:

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

    gdb_script.gs:14: Error in sourced command file:
    A syntax error in expression, near `<$end)'.

提示为&lt;$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

【讨论】:

    【解决方案2】:

    GDB 新手(我自己)应该知道,除非删除 while 和第一个大括号之间的空白,否则接受的答案不起作用。

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

    【讨论】:

    • 您或许应该提及您使用的 GDB 版本。
    • 不在标题中,但问题的文本确实提到了 Fortran。另外,当我发布问题时,我不知道 gdb 语法取决于被调试的语言。
    • @Armali,我正在使用 GDB 7.7.1。
    【解决方案3】:
    set $i = 0
    p $i++
    

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

    【讨论】:

    • 无关紧要。你没有阅读问题。我正在尝试打印一个大的 Fortran 数组。如果数组是 512x512x4,你愿意按 Enter 262144x4 次吗?查看接受的答案
    【解决方案4】:

    由于 voltrac() 是一个数组,所以我认为这是一个语法错误,如您的输出所示 - 它应该是“print volfrac[]”。

    下面我向您详细展示了 C 程序的详细步骤(因为您使用的是 gdb,而 gdb 仅适用于 ELF 文件,所以这里也是一样的 - gdb + ELF 文件 for C ):

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

    【讨论】:

    • volfrac 是一个 fortran 数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2013-01-22
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多