自动打印C语言中的结构和变量

5
我正在处理4-5个.c文件(每个文件大约有2000到5000行),其中包含多个头文件。目前我没有任何调试打印信息,这些信息可以帮助我在程序执行过程中进行调试。
我的问题是: 是否有一种方法(或现有工具)来解析.c文件并为当前作用域中的所有变量添加新的打印语句?就像VC ++允许我们查看本地和全局变量等一样。我需要在每个步骤中打印它们。此外,应解除指针引用。
例如,在.c文件的某一点上,假设有10个全局变量和3个本地变量。我需要生成智能printf以在该点打印这13个变量。稍后在程序中如果有20个变量,我应该能够打印这20个变量等等。包含的头文件包含所有相关声明的变量(这些变量可以是结构/指针/数组或某些组合等等)。我试图通过perl脚本实现此目标。
我所做的是,我生成了预处理文件(.i文件),然后尝试通过perl解析它,然后针对每个变量生成单独的打印函数,但经过半天的努力,我意识到这需要太长时间了。 是否有已经完成此任务的工具?如果没有,任何接近它的东西都足够好(我可以对其应用一些perl处理等) 我的目标是,在程序执行期间的每个步骤中,我应该能够看到在该作用域内有效的变量,并且无需调用调试器即可实现。
我允许处理.c文件并重新编写它们等等。 希望我的问题清楚,并感谢您的回复。

1
另外,你可能会得到一个答案。顺便问一下,你听说过段落吗? - Ed Heal
如何选择最佳答案? - Utkarsh Kumar
2
点击旁边的复选标记,它应该从灰色变成绿色。 - Fingolfin
3
不在代码中添加调试打印信息是一件好事情。添加它们只会使调试变得更加困难。使用调试器,这就是它们的作用。 - William Pursell
因为这不是人们通常调试程序的方式,所以很难找到很多工具来实现这一点。 把所有这些麻烦花在获取调试上远不如投资于单元测试,这将验证变量应该是什么。 - Keith Nicholas
你为什么要避免使用调试器? - thejh
1个回答

3
假设您的C程序可以被 Frama-C 的值分析器解释,这个前提并不一定成立。如果可以,您可以使用它来获取程序的每个点或感兴趣的点上所有活动变量的值的日志。
考虑以下程序:
int x = 1;

main(){
  int l;

  x=2;
  Frama_C_dump_each();
  l=3;
  Frama_C_dump_each();
  {
    int blocklocal = l + 1;
    Frama_C_dump_each();
    x = blocklocal + 1;
    Frama_C_dump_each();
  }
  Frama_C_dump_each();
  return 0;
}

在此程序上运行frama-c -val -slevel 1000000000 -no-results t.c会生成以下日志:

[value] Values of globals at initialization
        x ∈ {1}
[value] DUMPING STATE of file t.c line 7
        x ∈ {2}
        =END OF DUMP==
[value] DUMPING STATE of file t.c line 9
        x ∈ {2}
        l ∈ {3}
        =END OF DUMP==
[value] DUMPING STATE of file t.c line 12
        x ∈ {2}
        l ∈ {3}
        blocklocal ∈ {4}
        =END OF DUMP==
[value] DUMPING STATE of file t.c line 14
        x ∈ {5}
        l ∈ {3}
        blocklocal ∈ {4}
        =END OF DUMP==
[value] DUMPING STATE of file t.c line 16
        x ∈ {5}
        l ∈ {3}
        =END OF DUMP==
Frama_C_dump_each()语句由我手动插入,但您也可以调整解释器,使其在每个语句处自动转储状态以实现此方法。为使其作为C解释器而不是静态分析器运行,您需要包括程序的整个源代码(包括标准库函数strlen()memcpy()等)并在main()函数开头硬编码输入的值。或者,您也可以使用GUI观察程序中变量的值,但如果程序不是线性的,由于函数调用或循环而访问了多次的语句将显示在执行期间可以采取的所有值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接