我正在尝试探索gdb
,objdump
,valgrind
和nm
工具,以便在linux中进行调试。
我可以在GDB中使用info locals
打印局部变量,但我需要进入当前堆栈帧来打印局部变量。
有没有办法打印C代码中使用的所有本地和全局变量(带有值)(如果程序崩溃,可能来自coredump)而不进入特定的堆栈帧?
答案 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()
正在运行的堆栈帧。否则,局部变量将不存在:毕竟,在输入函数时它们被分配在堆栈上。
当然,可能有一个“聪明”的命令从给定的断点框架向上移动堆栈并打印所有遇到的函数的局部变量,但这听起来不像你所追求的那样。