【问题标题】:Track all variables for execution of function in gdb跟踪 gdb 中函数执行的所有变量
【发布时间】:2020-07-05 15:16:38
【问题描述】:

我想在 C 中跟踪一个函数中所有变量的状态。

我知道我可以在 gdb 中使用 info 命令来获取当前上下文中的所有变量状态。

我可以使用 gdbinit 来自动化 gdb。

但我想做的是在函数处设置一个断点,然后在执行每一行 print 后执行 info 命令。

基本上,我想设置 2 个断点:一个在函数的开头,一个在同一函数的结尾(我不知道怎么做),并在这两个点之间逐行执行。

我想在我的gdbinit 中添加这样的内容:

b <func_name>
commands
while <inside the function>:
   info locals
   next
end
run

有没有办法让上面显示的while循环?

【问题讨论】:

  • 您在寻找gdb breakpoint commands吗?它允许您配置一个或多个命令以在每次命中断点时运行。
  • @kaylum 是这样的。我已经看过文档了。但我想要的是不同的东西。我编辑了我的问题以反映我在寻找什么。
  • 你试过使用displayundisplay吗?
  • 这不是我想要的。display 会在我做正确的事情时显示变量的状态(例如输入next)。但我想自动化这个,这样我就不会在我的命令中多次写下一次。

标签: c automation scripting gdb gdbinit


【解决方案1】:

基本上,我想设置 2 个断点:一个在函数的开头,一个在同一函数的结尾(我不知道怎么做),并在这两个点之间逐行执行。

您可以在函数here 的末尾找到如何设置断点。但是,这里没有必要。

您可以使用$_caller_is() GDB 便捷函数来完成当前例程的执行,并在它返回后停止。

例子:

int fn()
{
  int sum = 0;
  for (int j = 0; j < 5; j++) {
    sum += j;
  }
  return sum;
}

int main()
{
  return fn() - 10;
}

现在是 GDB 会话:

gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b 4
Breakpoint 1 at 0x1130: file t.c, line 4.
(gdb) run
Starting program: /tmp/a.out

Breakpoint 1, fn () at t.c:4
4     for (int j = 0; j < 5; j++) {
(gdb) while $_caller_is("main")
 >info locals
 >next
 >end
j = 1431654464
sum = 0
5       sum += j;
j = 0
sum = 0
4     for (int j = 0; j < 5; j++) {
j = 0
sum = 0
5       sum += j;
j = 1
sum = 0
4     for (int j = 0; j < 5; j++) {
j = 1
sum = 1
5       sum += j;
j = 2
sum = 1
4     for (int j = 0; j < 5; j++) {
j = 2
sum = 3
5       sum += j;
j = 3
sum = 3
4     for (int j = 0; j < 5; j++) {
j = 3
sum = 6
5       sum += j;
j = 4
sum = 6
4     for (int j = 0; j < 5; j++) {
j = 4
sum = 10
7     return sum;
sum = 10
8   }
sum = 10
main () at t.c:12
12    return fn() - 10;
(gdb) q

附:对于除了玩具问题之外的所有问题,这种调试方法都将非常低效不足(很少有有趣的状态完全由局部变量捕获)。

【讨论】:

  • 嗨,有两件事:1)while true 有语法错误。所以你能不能把它改成while 1 2) 这不会在下一个断点处停止,它会一直持续到程序执行结束。
  • 非常感谢。
猜你喜欢
  • 2020-11-13
  • 2017-03-26
  • 2011-05-10
  • 2013-05-15
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2018-08-29
  • 2012-02-29
相关资源
最近更新 更多