GDB:如何在调试期间调用具有修改参数的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDB:如何在调试期间调用具有修改参数的函数相关的知识,希望对你有一定的参考价值。

考虑以下简单的Fortran程序,它通过子例程添加两个整数并打印结果:

      PROGRAM MAIN

      INTEGER I, J, SUM

      I = 1
      J = 1

      CALL ADD(I, J, SUM)

      WRITE(*,*) SUM

      END

      SUBROUTINE ADD(I, J, SUM)

      INTEGER I, J, SUM

      SUM = I + J

      END

通过gfortran -g -O0 gdb-mwe.f -o gdb-mwe编译并在GNU调试器中运行,我想在调试输出之前使用修改后的输入参数从调试器调用ADD。这是发生的事情:

Reading symbols from gdb-mwe...done.
(gdb) break 10
Breakpoint 1 at 0x4007dd: file gdb-mwe.f, line 10.
(gdb) r
Starting program: /home/username/Documents/Fortran/gdb-mwe 

Breakpoint 1, MAIN__ () at gdb-mwe.f:10
10        WRITE(*,*) SUM
(gdb) p j = j+1
$2 = 2
(gdb) call add(i,j,sum)

Program received signal SIGSEGV, Segmentation fault.
0x000000000040079a in add (
i=<error reading variable: Cannot access memory at address 0x1>, 
j=<error reading variable: Cannot access memory at address 0x2>, 
sum=<error reading variable: Cannot access memory at address 0x2>)
at gdb-mwe.f:18
18        SUM = I + J
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(add) will be abandoned.
When the function is done executing, GDB will silently stop.

我怎么做到这一点?

答案

正如评论中指出的那样,gdb中的open bugs目前无法做到这一点。

一种可能的解决方法是调试32位版本的代码。这导致一些差异,但对于简单的调试任务,它可能就足够了。

对于intel fortran编译器,这只需要添加-m32标志(如果已经安装了32位库)。

对于gfortran来说,似乎首先需要安装multilib包,如this questions所示。

以上是关于GDB:如何在调试期间调用具有修改参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

GDB:将参数转储到特定函数的所有调用

如何获取 gdb 调用堆栈跟踪?

Golang源码学习:使用gdb调试探究Golang函数调用栈结构

Linux系统下GDB调试

gdb 使用啥机制来知道在哪里“完成”函数调用?

如何在调试期间取消引用指针