为啥 GDB 认为我的 Fortran 字符串是 ~4GiB

Posted

技术标签:

【中文标题】为啥 GDB 认为我的 Fortran 字符串是 ~4GiB【英文标题】:Why does GDB think my Fortran string is ~4GiB为什么 GDB 认为我的 Fortran 字符串是 ~4GiB 【发布时间】:2019-12-18 09:05:12 【问题描述】:

我有一个 Fortran 程序,我试图将字符串传递给子例程。下面示例中的代码按预期运行,本身没有错误。但是,编译后: f95 -g test.f95

当使用 GDB 跟踪代码时出现问题。

program test

  character(len=4):: my_string="asdf"

  call test_routine(my_string)

  contains

  subroutine test_routine(asdf)
    character(len=*) :: asdf
    print*, len(asdf)

    print*, asdf

    return

  end subroutine test_routine

end program test

在两个 print* 之间的第 12 行设置断点时,我在 GDB 中运行代码时得到以下输出

Starting program: /home/user/folder/a.out 
           4


Breakpoint 1, test_routine (asdf=<error reading variable: value requires 4158328176 bytes, which is more than max-value-size>, _asdf=4) at test.f95:13
13      print*, asdf

从输出中可以看出,Fortran 将字符串的 len() 打印为 '4' 但 GDB 将其视为 ~4GiB

这是什么原因造成的?

GDB 版本: GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git

Fortran (gcc) 版本: gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

【问题讨论】:

GDB 应该理解固定长度和假定长度的字符串吗? 好的,我知道了。固定长度是,但假定长度不是,因为 gdb 仅支持 Fortran77。 【参考方案1】:

最近在此提交中向 GDB 添加了对假定长度字符串的支持:https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=216a7e6b9e5d2b279276f3bd8c11145a7d9b59ac。

这个提交应该是即将发布的 GDB 9 版本的一部分。如果您想提前预览,那么您可以考虑从源代码构建 GDB,说明如下:https://www.gnu.org/software/gdb/。

说明仅支持 F77 的文档有点过时,对 F90 的支持正在改进,但绝不是完整的。错误报告总是受欢迎的,因为这可以帮助指导下一步应该使用哪些功能。

【讨论】:

谢谢。这绝对是我有兴趣尝试的事情。

以上是关于为啥 GDB 认为我的 Fortran 字符串是 ~4GiB的主要内容,如果未能解决你的问题,请参考以下文章

Fortran在gdb中打印可分配数组

为啥我的 FFI 函数的第二次调用无法匹配字符串比较?

GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]

有没有一种方法可以在100到1000个索引的范围内打印长数组到GDB中的txt文件? (调试Fortran代码)

FORTRAN为啥要将数据区分类型

为啥 PHP 的类型提示认为我的类是字符串?