C:获取当前作用域中定义的所有变量


C: Get all variables defined in current scope

对于其他语言:python、php和javascript,以前曾问过这个问题。

我想知道在C中是否可以这样做。我正在尝试在执行过程中的某个时间点获取函数中所有变量的快照,然后在稍后的时间点将其与另一个快照进行比较。

编辑快照可以是作用域中所有变量及其当前值的列表。我可以手工编码,但我想知道是否有更快的方法。


是与否

有语言功能吗?不。

它能以独立于系统的方式完成吗?不。

有简单的方法吗?不。

是否可以通过某种特定于系统的方式来完成?对。

总之,没有好的方法,也没有简单的方法,但如果你真的想这样做,可以做到。一般来说,程序是为调试而编译的,然后在运行时打开图像文件,找出存在哪些变量以及它们存储在哪里。最有可能的是,实现这一点的实际方法是编写一个类似gdb的调试器脚本,并让它完成低级工作。

如果您的系统已经有了一个运行时回溯功能,那么您可以利用它。

另一种可能性是:一些操作系统支持读取符号表的库函数。历史悠久的Unix和Mac OS X有nlist(3)。Linux和Solaris的某些版本具有dlinfo(3)。一个名为NM(1)的CLI工具(您可以弹出(1)它)通常是可用的。


不简单。您需要在二进制级别做这样的事情,并且知道编译器在硬件中的基指针上把数据结构放在哪里。您还需要调试符号。

简短的回答是"不",不需要付出很大的努力。


根据您感兴趣的C程序,您可以使用FRAMA-C,特别是完全展开的值分析来模拟执行,然后插入对Frama_C_dump_each()的调用,以在程序的特定点获取变量值的转储。

您可以期望一个完全展开的分析模拟执行速度比实际速度慢10000到100000倍,但是现在我们有了快速的计算机。这仍然只适用于相对较小的程序。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int x,a;
int y=2;

void f(void)
{
  int lf = 5;
  a = y + 2;
  Frama_C_dump_each();
  return;
}

main(){
  int lmain = 3;
  f();
  return 0;
}

$ frama-c -val -slevel 50000 t.c
....
[value] DUMPING STATE of file t.c line 8
    x ∈ {0; }
    a ∈ {4; }
    y ∈ {2; }
    lf ∈ {5; }
    lmain ∈ {3; }
    =END OF DUMP==
....

你不能用一种低级的(已编译的)语言来实现这一点。当编译器+链接器完成代码时,几乎没有"变量"的痕迹,只有原始的机器代码。