如何使用gdb调试函数

如何使用gdb调试函数,gdb,Gdb,使用gdb,我可以在调用函数的任何地方设置断点,并逐步完成函数求值。我还可以使用print命令计算函数。当在任何断点处停止时,我希望通过使用不同的参数逐步执行特定函数来调试该函数。但是,当我尝试在函数上设置断点并给gdb一个合适的打印命令时,gdb对象会显示消息“正在调试的程序在gdb调用的函数中停止。将放弃对包含函数MyClass::mysize(int,int)的表达式的求值”。有没有办法在不重新启动程序的情况下完成此操作?您设法错过了来自GDB的部分消息。以下是我的示例程序: int fo

使用gdb,我可以在调用函数的任何地方设置断点,并逐步完成函数求值。我还可以使用print命令计算函数。当在任何断点处停止时,我希望通过使用不同的参数逐步执行特定函数来调试该函数。但是,当我尝试在函数上设置断点并给gdb一个合适的打印命令时,gdb对象会显示消息“正在调试的程序在gdb调用的函数中停止。将放弃对包含函数MyClass::mysize(int,int)的表达式的求值”。有没有办法在不重新启动程序的情况下完成此操作?

您设法错过了来自GDB的部分消息。以下是我的示例程序:

int
foo (int arg)
{
  return arg + 3;
}

int
main ()
{
  return foo (-3);
}
下面是我的GDB课程:

(gdb) start
Temporary breakpoint 1 at 0x401119: file eval.c, line 10.
Starting program: eval.x 

Temporary breakpoint 1, main () at eval.c:10
10    return foo (-3);
(gdb) break foo
Breakpoint 2 at 0x40110d: file eval.c, line 4.
(gdb) print foo (2)

Breakpoint 2, foo (arg=2) at eval.c:4
4     return arg + 3;
The program being debugged stopped while in a function called from GDB.
Evaluation of the expression containing the function
(foo) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb) bt
#0  foo (arg=2) at eval.c:4
#1  <function called from gdb>
#2  main () at eval.c:10
(gdb) 
(gdb)启动
0x401119处的临时断点1:文件eval.c,第10行。
启动程序:eval.x
临时断点1,eval.c处的main():10
10返回foo(-3);
(gdb)破福
0x40110d处的断点2:文件eval.c,第4行。
(gdb)印刷食品(2)
在eval.c处的断点2,foo(arg=2):4
4返回arg+3;
正在调试的程序在从GDB调用的函数中停止。
对包含函数的表达式的求值
(foo)将被放弃。
当函数完成执行时,GDB将静默停止。
(gdb)英国电信
#评估c时的0 foo(arg=2):4
#1  
#2主管道()在评估c:10
(gdb)
请注意GDB消息的最后一行:
当函数执行完毕时,GDB将静默停止。
因此GDB仍然在被调用函数中,并带有您传递的参数。可以通过
在回溯中看到


因此,您可以继续单步执行函数以查看其行为。你没有得到的是当函数返回时打印结果,GDB已经忘记了这是你想要的,所以相反,当函数返回时,GDB将把你放回提示符。这意味着您应该在函数返回之前检查它内部的返回值。

它按照您所说的那样工作。我完全被“放弃”这个词引入歧途,但我现在意识到,放弃的是结果的报告,而不是函数本身的执行。