调试:是否可以打印C代码的所有局部变量(带有值)而无需进入每个堆栈帧?

时间:2013-05-14 09:34:58

标签: c debugging gdb coredump

我正在尝试探索gdbobjdumpvalgrindnm工具,以便在linux中进行调试。

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

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

2 个答案:

答案 0 :(得分:1)

正如您所指出的,在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

答案 1 :(得分:-1)

嗯不,因为你必须分析堆栈以找出哪些局部变量甚至存在。

如果你有一个功能:

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

  return ab * bc;
}

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

当然,可能有一个“聪明”的命令从给定的断点框架向上移动堆栈并打印所有遇到的函数的局部变量,但这听起来不像你所追求的那样。