4

我正在尝试探索gdbobjdump和用于在 linux 中进行调试的工具valgrindnm

我可以info locals在 GDB 中使用打印局部变量,但我需要进入当前堆栈帧来打印局部变量。

有没有办法打印 C 代码中使用的所有局部和全局变量(带有值)(如果程序崩溃,可能来自 coredump)而不进入特定的堆栈帧?

4

2 回答 2

2

正如您所指出的,gdb您可以在其中显示当前帧的局部变量info locals。如果您的限制是您不想手动进入每一帧,那么您可以使用一个简单的gdb脚本来为您执行此操作。例如:

define locals-up
  set $n    = ($arg0)
  set $upto = $n
  while $upto > 0
    info locals
    up-silently 1                                                                
    set $upto = $upto - 1
  end
  down-silently $n
end
document locals-up
  locals-up <n>: Lists local variables of n frames
end
于 2014-04-01T09:56:42.550 回答
-1

不,因为您必须分析堆栈才能找出甚至存在哪些局部变量。

如果你有 aa 函数:

static int foo(int a, int b, int c)
{
  const int ab = a + b;
  const int bc = b + c;

  return ab * bc;
}

foo()除非您有一个表明foo()正在运行的堆栈帧,否则您不能谈论“的局部变量”。否则,局部变量将不存在:毕竟,它们是在输入函数时在堆栈上分配的。

当然,可能有一个“聪明”的命令可以从给定断点的帧向上走堆栈并打印所有遇到的函数的局部变量,但这听起来不像你想要的。

于 2013-05-14T09:38:57.377 回答