我正在研究一个大型C项目(C99),它大量使用全局变量(我知道,我知道)。该程序运行良好,但最初设计为运行一次并退出。
因此,它依赖于它的全局/静态内存来初始化为0(或者声明它的任何值),并且在运行时它会修改这些变量(就像大多数程序那样)。
但是,我想要再次运行该程序,而不是在完成时退出。我想制作一个对这个大型程序具有控制和可见性的父程序。完全了解正在运行的程序非常重要。
该解决方案需要在macOS,Linux和Windows上运行。
我考虑过:
制作一个小包装程序,用作" shell",并根据需要执行大程序。
仔细阅读源代码,多次运行程序,等待程序在完整性检查或内存访问不良时爆炸。
将所有全局变量收集到memset
的单个结构中,为使用值初始化的变量创建初始值设定项。根据具体情况处理静态。
告诉操作系统重新初始化全局/静态内存。如果我需要保存一个值,我会在本地存储它,然后在完成后重写它。
我现在正在使用选项2,只是通过代码,依靠程序崩溃并指出我正确的方向。
我说这种方法让我大约80%的方式。我已经识别并重新初始化了足够多的东西,程序或多或少可以重新运行。它没有我想象的那么广泛,它给了我很大的希望。
偶尔会发生奇怪的事情,或者它没有按预期运行,但它也不会崩溃。这使得跟踪它变得更加困难。
我只需要一些能让我获得最后20%的东西。也许某种静态分析工具,或者某些东西可以帮助我查看源代码并查看全局变量的触摸位置。
答案 0 :(得分:1)
要轻松检测全局变量和静态变量,可以尝试CppDepend并执行像这样的cqlinq查询
from f in Fields where f.IsGlobal || f.IsStatic
select f
如果您想要特定函数或特定文件中使用的变量,也可以修改查询。