【发布时间】:2012-05-04 08:34:03
【问题描述】:
我正在为使用全局变量的 C 代码创建一个测试环境。我使用该术语来指代在 C 外部函数中声明的任何变量(带有或不带有 static 限定符),以及带有 static 限定符的局部变量。一些全局变量没有显式初始化(因此初始化为 0),其他的被初始化为常量值。
我想要一种方法来将这些全局变量从我的代码重新初始化到它们在 main() 条目时的状态,以便从测试代码的角度模拟重新运行。
到目前为止,我所做的实际上是终止正在测试的代码,并使用调用 system() 的驱动程序立即重新运行它。这很笨拙而且有点慢(我猜是因为检测的可执行文件必须将上下文保存到磁盘/从磁盘恢复)。我正在寻找更好的方法。如果有一些运行时函数可以调用并完成工作,我想知道!
我的环境是MinGW32,我想在Linux32/Linux64下保持与gcc的兼容。
检测代码作为源代码可供我使用(我不想修改甚至检查),并且仅限于 <string.h> 和 <stdlib.h> 的标准 C99 库函数,以及可用于托管实现的那些 ( <float.h>、<iso646.h>、<limits.h>、<stdarg.h>、<stdbool.h>、<stddef.h> 和 <stdint.h>)。
我自己的代码不使用全局变量。如果我的堆/分配变量在重新初始化后仍然存在(我可以将所需的所有内容保存在本地/堆栈/自动变量中),那会很好,但不是绝对必要的。我希望经过检测的代码能够跟踪其所有堆变量(如果未能释放的堆变量导致堆耗尽,它甚至可以被视为一个特性)。
我隐约想到的一件事是在带有测试代码的 C 源文件的开头和结尾添加虚拟变量声明(很容易从包装器编译它),并祈祷所有用于测试的全局变量代码在内存中的连续块中;这样我可以从虚拟变量的位置定位块,并随意恢复它。这能可靠地工作吗?
TIA
【问题讨论】:
-
也许您可以使用 -g 编译并利用调试器符号来定位全局变量?
-
你说“我想在 LInux32/Linux64 下保持与 gcc 的兼容”你适合 linux 系统解决方案吗?
-
@DavidGelhar:好主意,谢谢。那可以自动化。但这适用于具有静态限定符的局部变量吗?如前所述,这些是我的目标的一部分。
-
@PavanManjunath:是的,如果这比在 MinGW 下更容易,我可以使用 Linux,但这是第二选择。
-
尝试在 Linux 中阅读
/proc/PID/maps,第三行是您的全局变量和静态局部变量所在的位置。您可以在main()启动之前将此区域复制到堆中,并在需要时恢复它。