打印C中所有局部变量的地址
Print addresses of all local variables in C
我想在程序的不同执行点打印函数中使用的所有局部变量和全局变量的地址,并将它们存储在文件中。
我正在尝试为此使用 gdb。
"info local" 命令打印所有局部变量的值。我需要一些东西以类似的方式打印地址。是否有任何内置命令?
编辑 1
我正在开发一个在编译时生成指向图的 gcc 插件。
我想验证生成的图形是否正确,即指针是否确实指向变量,插件告诉它们应该指向的变量。
我们想在超过数千行代码的大型程序上验证此指向信息。我们将使用程序而非手动验证此信息。每个函数中都有几个局部变量和全局变量,因此不可能在每一行代码之后都添加 printf 语句。
以编程方式(在 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(不仅如此)
没有内置命令可以执行此操作。 gdb bugzilla 中有一个开放的功能请求,要求有一种方法来显示当前堆栈帧中所有已知槽的含义,但没有人实现过这个。
这可以通过一些 gdb 脚本来完成。最简单的方法是使用 Python 遍历所选 Frame
的 Blocks
。然后在每个这样的 Block
中,您可以遍历所有变量,并对变量调用 info addr
。
请注意,使用 print &var
打印地址并不总是有效。变量并不总是有地址——但是,如果变量存在,它将有一个位置,这就是 info addr
将显示的内容。
如果编译器决定将变量放入寄存器,则这些想法可能有所不同的一个简单方式。但是,还有更复杂的情况,例如,编译器可以将变量放在函数中不同点的不同位置;或者可以将本地 struct
拆分为其组成部分并四处移动。
默认情况下info addr
尝试打印一些模糊的人类可读内容。如果您需要该级别的详细信息,您也可以要求它仅转储 DWARF 位置表达式。
我想在程序的不同执行点打印函数中使用的所有局部变量和全局变量的地址,并将它们存储在文件中。
我正在尝试为此使用 gdb。
"info local" 命令打印所有局部变量的值。我需要一些东西以类似的方式打印地址。是否有任何内置命令?
编辑 1
我正在开发一个在编译时生成指向图的 gcc 插件。
我想验证生成的图形是否正确,即指针是否确实指向变量,插件告诉它们应该指向的变量。
我们想在超过数千行代码的大型程序上验证此指向信息。我们将使用程序而非手动验证此信息。每个函数中都有几个局部变量和全局变量,因此不可能在每一行代码之后都添加 printf 语句。
以编程方式(在 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(不仅如此)
没有内置命令可以执行此操作。 gdb bugzilla 中有一个开放的功能请求,要求有一种方法来显示当前堆栈帧中所有已知槽的含义,但没有人实现过这个。
这可以通过一些 gdb 脚本来完成。最简单的方法是使用 Python 遍历所选 Frame
的 Blocks
。然后在每个这样的 Block
中,您可以遍历所有变量,并对变量调用 info addr
。
请注意,使用 print &var
打印地址并不总是有效。变量并不总是有地址——但是,如果变量存在,它将有一个位置,这就是 info addr
将显示的内容。
如果编译器决定将变量放入寄存器,则这些想法可能有所不同的一个简单方式。但是,还有更复杂的情况,例如,编译器可以将变量放在函数中不同点的不同位置;或者可以将本地 struct
拆分为其组成部分并四处移动。
默认情况下info addr
尝试打印一些模糊的人类可读内容。如果您需要该级别的详细信息,您也可以要求它仅转储 DWARF 位置表达式。