How to debug Fortran programs using gdb

Previously, I thought the debugging functionality provided by gdb for Fortran program was quite limited due to experiences of a couple of failed attempts to print allocatable arrays. However, having given several another tries today, I discovered that gdb does support printing values of allocatable arrays, although it may be a little inconvenient. Now, let‘s see the details:

We have the test code as follows, in which a derived type cmp, an allocatable array a and a static array b are defined.

 program test
   implicit none

   type cmp
      integer a
      integer b
      integer, dimension(:), allocatable :: c
      integer, dimension(5) :: d
   end type cmp

   integer, dimension(:), allocatable :: a
   integer, dimension(5) :: b = (/1,2,3,4,5/)
   type(cmp) x

   allocate(a(5))
   allocate(x%c(5))

   a = (/1,2,3,4,5/)
   x%a = 5
   x%b = 10
   x%c = a
   x%d = a

   write(STDOUT,*), a
   write(STDOUT,*), b
   write(STDOUT,*), x%c

   deallocate(a)
   deallocate(x%c)
 end program test

For the static array b, there is no need to mention it because gdb has a good support whether or not it is defined inside a derived type. However, if we want to directly print the allocatable array in gdb, a null value 0 will be printed:

(gdb) p a
$1 = (0)

If we treat the allocatable array as a C pointer,

(gdb) p *a
Attempt to take contents of a non-pointer value.
(gdb) p a(1)
$2 = 0 # Note: this is a wrong value
(gdb) p a[1]
A syntax error in expression, near `[1]‘. # Note: square brackets are invalid

The correct form is:

(gdb) p *((integer *)a)
$3 = 1
(gdb) p *((integer *)a+1)
$4 = 2
# ... and so on.

The whole array can also be printed out all at once:

(gdb) p *((integer *)a)@5
$5 = (1, 2, 3, 4, 5)

For the allocatable array in the derived type cmp, we should note that the member variable along with its parent should be wrapped in brackets:

(gdb) p *((integer *)x%c)
Attempt to extract a component of a value that is not a structure. # wrong
(gdb) p *((integer *)(x%c))
$1 = 1 # right
(gdb) p *((integer *)(x%c)+1)
$2 = 2
(gdb) p *((integer *)(x%c))@5
$3 = (1, 2, 3, 4, 5)

OK, up to now, our Fortran program can be debugged efficiently, without having to insert debugging print or write subroutine any more!

How to debug Fortran programs using gdb,布布扣,bubuko.com

时间: 2024-10-12 16:45:28

How to debug Fortran programs using gdb的相关文章

用Eclipse和GDB构建ARM交叉编译和在线调试环境

我们在 Linux 主机中搭建我们的开发环境,使用 Ubuntu 10.04 LTS 为例. 搭建应用开发环境 安装 JRE Eclipse 依赖于Java 环境,所以必须先安装 JRE 或 JDK. 安装 Eclipse 和 CDT 去Eclipse官网下载最新的Eclipse IDE. 我们一般选择 C/C++ 版本(Eclipse IDE for C/C++ Developers),这个版本自带了CDT,不用另行安装CDT插件.下载时选择 Linux 的版本,如:eclipse-cpp-j

Debug with jdb

原文地址: http://www.javaworld.com/article/2077445/testing-debugging/debug-with-jdb.html Q: How do you use jdb (included in the JDK 1.2 package) effectively to debug Java programs? I've tried many times, but I am successful only in loading a class file t

[转] linux下的c/c++调试器gdb

http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLinux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: * 设置断点:* 监视程序变量的值:* 程序的单步执行:* 修改变量的值.       gdb支持下列语言C, C+

C++ gdb调试

cmake和gdb调试程序 由于出发点是想要在cmake后使用gdb,因此先写一下cmake和gdb的简单的一个流程,此部分转自:WELEN 1.  cmake支持gdb的实现,首先在CMakeLists.txt下加入SET(CMAKE_BUILD_TYPE "Debug") 在下面加入:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")SET(CMAKE_CXX_FLAGS_RELEASE

gdb插件使用方法

0x00 peda https://github.com/longld/peda 安装: git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda.py" >> ~/.gdbinit echo "DONE! debug your program with gdb and enjoy" 使用:例如 echo "source ~/.GdbPlugins/

gdb 调试程序步骤

在程序a.c编译过程中加入调试信息: g++ -g -o a.debug a.c 启动gdb,在终端下输入:gdb 此时启动了gdb,在gdb中加载需要调试的程序,在终端输入命令: file a.debug 在gdb中查看代码,在用g++加入了-g命令以后,编译后的a.debug程序中自动加入了断点,可以利用list命令查看源代码和断点,在终端输入命令 : list 1,这时候gdb会显示第一个断点以前的代码. 按住“Enter”键,显示下一个断点以前的代码,以此类推,可以查看断点程序. 在对应

vscode+WSL+Debug+Cmake+OpenGL

WSL安装 参考:https://www.cnblogs.com/Jay-CFD/p/6067274.html vscode安装 下载链接:https://code.visualstudio.com/download直接下载安装即可. 插件安装 为了在win10下较好的调试linux程序,需要安装Remote - WSL这个插件,安装以后,左下角就会出现绿色的按钮,用来重新在WSL中打开vscode. CMake配置 安装完CMake Tools以后,就可以直接通过点击按键实现configure

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因为一行简单的配置之后, 你就可以像使用本机文件一样使用远程的任何文件. 无论是想编辑, 查看还是删除重命名, 都和本机文件一样的用. 这么神奇的功能到底如何

批处理基本知识以及进阶 V2.0

批处理基本知识以及进阶 将以要执行的程序指令 , 像在 dos 模式下一下写入记事本 , 保存成 bat 文件 , 就可以执行了 一 . 简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数, echo 命令将显示当前回显设置. 语法 : echo [{on │ off}] [message] Sample : @echo off / echo hello world 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用 > >>