在C中自动打印结构和变量

Utk*_*mar 5 c printing debugging pointers structure

我正在使用4-5 .c文件(每个大约2000到5000行),其中包括几个标题.目前我没有任何调试打印,这将有助于我在执行过程中调试程序.

我的问题是: - 是否有一种方法(或一些现有的工具)来解析.c文件并为.c文件中当前范围内的所有变量添加新的print语句集?就像VC++允许我们看到Locals和globals等一样.我需要在每一步都打印它们.此外,应该取消引用指针.

对于前者 让我们说.c文件中的一个点,有10个全局变量和3个本地变量.我需要生成智能printfs来打印这13个变量.在程序的后面,如果有20个变量,我应该能够打印20个变量等.包含的头文件包含每个
变量的所有相关声明(可以是结构/指针/数组或某些组合等等).我试图通过perl脚本实现这一点.

我做的是,我生成了预处理文件(.i文件),我尝试通过perl解析它,然后生成特定于每个变量的单独打印功能,但经过半天的努力,我意识到它太耗费时间.有没有一个工具已经做到了?如果不是这样,那么接近它的任何东西应该足够好(我可以在其上应用一些perl处理等)我的目标是在程序执行之后,在程序执行期间的每一步,我应该能够看到变量(有效)在那个范围),而不必调用调试器.

我被允许处理.c文件并再次重新编写等等.希望我的问题很清楚,谢谢你的回复.

Pas*_*uoq 3

假设您的 C 程序可以通过 Frama-C 的值分析来解释,这与给定值相去甚远,您可以使用它来获取程序每个点或以下点的所有活动变量值的日志。兴趣。

\n\n

考虑以下程序:

\n\n
int x = 1;\n\nmain(){\n  int l;\n\n  x=2;\n  Frama_C_dump_each();\n  l=3;\n  Frama_C_dump_each();\n  {\n    int blocklocal = l + 1;\n    Frama_C_dump_each();\n    x = blocklocal + 1;\n    Frama_C_dump_each();\n  }\n  Frama_C_dump_each();\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

跑步frama-c -val -slevel 1000000000 -no-results t.c该程序会产生日志:

\n\n
[value] Values of globals at initialization\n        x \xe2\x88\x88 {1}\n[value] DUMPING STATE of file t.c line 7\n        x \xe2\x88\x88 {2}\n        =END OF DUMP==\n[value] DUMPING STATE of file t.c line 9\n        x \xe2\x88\x88 {2}\n        l \xe2\x88\x88 {3}\n        =END OF DUMP==\n[value] DUMPING STATE of file t.c line 12\n        x \xe2\x88\x88 {2}\n        l \xe2\x88\x88 {3}\n        blocklocal \xe2\x88\x88 {4}\n        =END OF DUMP==\n[value] DUMPING STATE of file t.c line 14\n        x \xe2\x88\x88 {5}\n        l \xe2\x88\x88 {3}\n        blocklocal \xe2\x88\x88 {4}\n        =END OF DUMP==\n[value] DUMPING STATE of file t.c line 16\n        x \xe2\x88\x88 {5}\n        l \xe2\x88\x88 {3}\n        =END OF DUMP==\n
Run Code Online (Sandbox Code Playgroud)\n\n

Frama_C_dump_each()语句是我手动插入的,但您也可以轻推解释器,以便它在每个语句处自动转储状态。

\n\n

为了使这种方法发挥作用,您需要程序的整个源代码,包括标准库函数(strlen()memcpy()、 \xe2\x80\xa6),并且必须对开头的输入值进行硬编码。main()。否则,它将表现为静态分析器,而不是 C 解释器。

\n\n

您还可以使用GUI来观察程序中变量的值,但如果它不是线性的,则由于函数调用或循环而多次访问的语句将显示执行期间可以获取的所有值。

\n