我正在尝试探索gdb
、objdump
和用于在 linux 中进行调试的工具valgrind
。nm
我可以info locals
在 GDB 中使用打印局部变量,但我需要进入当前堆栈帧来打印局部变量。
有没有办法打印 C 代码中使用的所有局部和全局变量(带有值)(如果程序崩溃,可能来自 coredump)而不进入特定的堆栈帧?
正如您所指出的,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
不,因为您必须分析堆栈才能找出甚至存在哪些局部变量。
如果你有 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()
正在运行的堆栈帧,否则您不能谈论“的局部变量”。否则,局部变量将不存在:毕竟,它们是在输入函数时在堆栈上分配的。
当然,可能有一个“聪明”的命令可以从给定断点的帧向上走堆栈并打印所有遇到的函数的局部变量,但这听起来不像你想要的。