【问题标题】:How to print allocatable fortran int64 array in GDB如何在 GDB 中打印可分配的 fortran int64 数组
【发布时间】:2020-08-11 10:25:18
【问题描述】:

我知道我可以在 GDB 中将普通整数数组 datan+1-th 元素打印为

print *((integer *)data + n)

但是如果datainteger(INT64) 可分配数组,我如何才能正确打印出元素?

【问题讨论】:

    标签: fortran gdb gfortran


    【解决方案1】:

    注意:某些不幸的操作系统或发行版中使用的一些较旧的 GDB 版本或分支可能无法正确支持可分配数组。在这种情况下,请使用 C 语法。

    如果旧 GDB 无法识别 int64_t,请使用 long 或任何与 64 位整数对应的旧 C 类型。


    你真的可以这样做

     print data(n+1)
    

    使用

     print *((integer *)data + n)
    

    是C模式的GDB语法,但在Fortran模式下真的很简单。

    如果你真的想要复杂的C语法,你甚至可以在Fortran模式下使用它,它是

     print *((int64_t *)(&data) + n)
    

    在C模式下(set langauge c之后),也可以使用

    print *((int64_t *)data + n)
    

    这个在 Fortran 模式下不起作用 (Cannot access memory at address 0x29)。


    例子:

    use iso_fortran_env
    
    integer(int64), allocatable :: data(:)
    
    integer :: n
    
    data = [(i, i=1, 100)]
    
    n = 5
    
    continue
    
    end
    

    gdb:

    GNU gdb (GDB; openSUSE Leap 15.1) 8.3.1
    ...
    (gdb) break int64.f90:9
    Breakpoint 1 at 0x4005ec: file int64.f90, line 9.
    (gdb) run
    Starting program: /home/lada/f/testy/stackoverflow/a.out 
    
    Breakpoint 1, MAIN__ () at int64.f90:9
    9       n = 5
    Missing separate debuginfos, use: zypper install libgcc_s1-gcc10-debuginfo-10.1.1+git68-lp151.27.1.x86_64 libquadmath0-gcc10-debuginfo-10.1.1+git68-lp151.27.1.x86_64
    (gdb) step
    13      end
    (gdb) print data(n+1)
    $1 = 6
    (gdb) print *((int64_t *)(&data) + n)
    $2 = 6
    (gdb) set language c
    Warning: the current language does not match this frame.
    (gdb) print *((int64_t *)data + n)
    $3 = 6
    (gdb) print *((long *)data + n)
    $4 = 6
    

    【讨论】:

    • 不幸的是,`print data(n+1)` 对我不起作用,我在尝试使用 C 指针方法时得到了No symbol "int64_t" in current context.。我在 Mac OS X 上使用gdb (GDB) 8.0.1,不知道是不是版本问题。
    • @KevinPowell 是的,这很可能是版本问题,请参阅我答案底部的注释。如果您的 GDB 太旧以至于它甚至无法理解 int64_t,请使用 long。或者如果long 不对应于您系统中的 64 位,则为其他内容。但它通常应该。
    • 还要确保您处于 Fortran 模式(它应该是自动的,但您可以尝试set language fortran)。或者在 C 模式下尝试我为 C 模式显示的那些命令。
    • @KevinPowell 另请参阅stackoverflow.com/questions/50469327/… Apple 讨厌 GPLv4,并且不会提供任何使用此许可证的新软件版本。如果你想要一个新版本,你必须在别处寻找或从原始源编译。否则你必须继续使用旧方法。
    • @VladimirF GPLv4?
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多