如何用gdb调试函数

问题描述 投票:0回答:1

使用gdb,我可以在调用函数的任何地方设置一个断点,并逐步完成函数的评估。 我也可以用print命令来评估一个函数。 当停止在任何断点处时,我想通过使用不同的参数逐步执行特定的函数来进行调试。然而,当我试图在函数处设置一个断点,并给gdb一个合适的print命令时,gdb的对象是 "正在调试的程序在gdb调用的函数中停止了 "的信息。 包含函数MyClass::mysize(int,int)的表达式的评估将被放弃"。 有什么办法可以在不重启程序的情况下实现这个问题吗?

gdb
1个回答
1
投票

你设法错过了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发出的最后一行信息。When the function is done executing, GDB will silently stop. 所以,GDB仍然在你传递的参数中被调用的函数中。 在回溯中可以看到 <function called from GDB>.

所以你可以继续步入函数,看看它的表现。 你得不到的是函数返回时结果的打印,GDB已经失去了跟踪,这是你想要的,所以相反,当函数返回时,GDB只会把你丢回提示。 这意味着,你应该在函数返回之前检查函数内部的返回值。

© www.soinside.com 2019 - 2024. All rights reserved.