【问题标题】:Print addresses of all local variables in C打印C中所有局部变量的地址
【发布时间】:2015-06-17 09:17:43
【问题描述】:

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

我正在尝试使用 gdb 来做同样的事情。

“info local”命令打印所有局部变量的值。我需要一些东西以类似的方式打印地址。有内置命令吗?

编辑 1

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

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

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

【问题讨论】:

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

标签: debugging pointers gcc gdb memory-address


【解决方案1】:

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

这可以通过一些 gdb 脚本来完成。最简单的方法是使用 Python 对选中的FrameBlocks 进行迭代。然后在每个这样的Block 中,您可以遍历所有变量,并在变量上调用info addr

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

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

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

【讨论】:

    【解决方案2】:

    以编程方式(在 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(不仅如此)

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多