打印C

时间:2015-06-17 09:17:44

标签: debugging pointers gcc gdb memory-address

我想在程序的不同执行点打印函数中使用的所有本地和全局变量的地址,并将它们存储在文件中。

我正在尝试使用gdb。

“info local”命令打印所有局部变量的值。我需要以类似的方式打印地址。是否有任何内置命令?

编辑1

我正在开发一个gcc插件,它在编译时生成一个指向图。

我想验证生成的图表是否正确,即指针是否确实指向了插件告诉他们应该指向的变量。

我们希望验证这一点 - 有关超过数千行代码的大型程序的信息。我们将使用程序验证此信息,而不是手动验证。每个函数中都有几个局部变量和全局变量,因此无法在每行代码后添加printf语句。

2 个答案:

答案 0 :(得分:1)

以编程方式(在C / C ++中)使用&运算符来获取变量的地址(假设它不是指针):

int a; //variable declaration
print("%d", a); //print the value of the variable (as an integer)
print("0x%x", &a); //print the address of the variable (as hex)

同样适用于(gdb),只需使用&

此问题已经回答here(而不仅仅是)

答案 1 :(得分:1)

没有内置命令来执行此操作。在gdb bugzilla中有一个开放的功能请求,可以显示当前堆栈帧中所有已知槽的含义,但是没有人实现过这个。

这可以通过一些gdb脚本来完成。最简单的方法是使用Python迭代所选Blocks的{​​{1}}。然后在每个这样的Frame中,您可以迭代所有变量,并在变量上调用Block

请注意,使用info addr打印地址并不总是有效。变量并不总是有地址 - 但是,如果变量存在,它将有一个位置,这是print &var将显示的位置。

这些想法可能有所不同的一个简单方法是编译器是否决定将变量放入寄存器中。但是,也有更复杂的情况,例如编译器可以将变量放入函数中不同点的不同位置;或者可以将本地info addr拆分成其组成部分并移动它们。

默认情况下,struct会尝试打印一些模糊的人类可读内容。如果您需要该级别的详细信息,也可以要求它只转储DWARF位置表达式。