5

我正在处理 4-5 个 .c 文件(每个文件大约 2000 到 5000 行),其中包括几个标题。目前我没有任何调试打印可以帮助我在执行过程中调试程序。

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

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

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

我被允许处理 .c 文件并重新编写它们等等。希望我的问题很清楚,并感谢您的回复。

4

1 回答 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()语句是由我手动插入的,但您也可以轻推解释器,以便它在每个语句处自动转储一个状态。

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

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

于 2012-12-30T11:26:49.487 回答