C:获取当前范围中定义的所有变量

时间:2011-04-18 16:58:47

标签: c

此问题之前已被问过其他语言:PythonPHPJavaScript

我想知道是否可以在C中执行此操作。我试图在执行期间的某个时刻获取我的函数中的所有变量的快照,然后将其与稍后的另一个快照进行比较。时间。

修改
快照可以是范围内所有变量及其当前值的列表。我可以手工编写代码,但我想知道是否有更快的方法。

4 个答案:

答案 0 :(得分:10)

是和否

是否有语言功能?

可以以独立于系统的方式完成吗?

有简单的方法吗?

可以通过一些努力以特定于系统的方式完成吗?

总之,没有好的方法也没有简单的方法,但如果你真的想要它就可以做到。从广义上讲,程序是为了调试而编译的,然后在运行时打开图像文件,找出存在哪些变量以及它们的存储位置。最有可能的是,实现这一目标的实际方法是编写像gdb这样的调试器,并让它进行低级工作。

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

另一种可能性:某些操作系统支持读取符号表的库函数。历史悠久的Unix和Mac OS X有nlist(3).某些版本的Linux和Solaris有dlinfo(3). CLI工具called nm(1)(你可以popen(1))通常可用。

答案 1 :(得分:0)

你根本不能用如此低级的(编译)语言来做到这一点。当编译器+链接器完成您的代码时,几乎没有“变量”的痕迹,只有原始机器代码。

答案 2 :(得分:0)

根据您感兴趣的C程序,您可以使用Frama-C,特别是完全展开的value analysis来模拟执行,然后插入对{{1}的调用获取程序特定点的变量值的转储。

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

示例:

Frama_C_dump_each()

答案 3 :(得分:0)

不简单。您需要在二进制级别执行此类操作,并了解编译器将数据结构放在硬件中的基指针的位置。您还需要调试符号。

简短的回答是否定的,并非没有相当大的努力。