Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 打印C中所有局部变量的地址_Debugging_Pointers_Gcc_Gdb_Memory Address - Fatal编程技术网

Debugging 打印C中所有局部变量的地址

Debugging 打印C中所有局部变量的地址,debugging,pointers,gcc,gdb,memory-address,Debugging,Pointers,Gcc,Gdb,Memory Address,我想在程序的不同执行点打印函数中使用的所有局部变量和全局变量的地址,并将它们存储在文件中 我正在尝试使用gdb实现同样的功能 “info local”命令打印所有局部变量的值。我需要用类似的方式打印地址。它有内置的命令吗 编辑1 我正在开发一个gcc插件,它在编译时生成一个指向图形的点 我想验证生成的图是否正确,即指针是否确实指向变量,插件告诉它们应该指向变量 我们希望通过包含数千行代码的大型程序的信息来验证这一点。我们将使用程序验证此信息,而不是手动验证。每个函数中都有几个局部和全局变量,因此

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

我正在尝试使用gdb实现同样的功能

“info local”命令打印所有局部变量的值。我需要用类似的方式打印地址。它有内置的命令吗

编辑1

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

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

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

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

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

另外,这个问题已经通过编程(在C/C++中)得到了回答(不仅如此)

,您可以使用
&
操作符获取变量的地址(假设它不是指针):

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


另外,这个问题已经得到了回答(不仅如此)

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

这可以通过一点gdb脚本来完成。最简单的方法是使用Python迭代选定的
帧的
。然后在每个这样的
块中
,您可以迭代所有变量,并对变量调用
info addr

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

这些想法可能不同的一个简单方式是,如果编译器决定将变量放入寄存器中。还有更复杂的情况,例如编译器可以在函数中的不同点将变量放入不同的位置;或者可以将本地
结构
拆分为其组成部分并四处移动


默认情况下,
info addr
尝试打印一些模糊的人类可读内容。如果需要这种详细程度,您也可以要求它只转储DWARF位置表达式。

没有内置命令来完成此操作。gdb bugzilla中有一个开放的特性请求,要求能够显示当前堆栈帧中所有已知插槽的含义,但是从来没有人实现过这一点

这可以通过一点gdb脚本来完成。最简单的方法是使用Python迭代选定的
帧的
。然后在每个这样的
块中
,您可以迭代所有变量,并对变量调用
info addr

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

这些想法可能不同的一个简单方式是,如果编译器决定将变量放入寄存器中。还有更复杂的情况,例如编译器可以在函数中的不同点将变量放入不同的位置;或者可以将本地
结构
拆分为其组成部分并四处移动


默认情况下,
info addr
尝试打印一些模糊的人类可读内容。如果需要这种详细程度,您也可以要求它转储DWARF位置表达式。

打印局部变量地址的目的是什么。或许我们可以提出更好的解决方案或替代方案。gdb用于调试问题。我想知道在程序的不同执行点,哪些指针指向哪些变量。打印局部变量地址的目的是什么。或许我们可以提出更好的解决方案或替代方案。gdb用于调试问题。我想知道在程序的不同执行点,哪些指针指向哪些变量。
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)