【问题标题】:Automatically printing the structures and variables in C自动打印 C 中的结构和变量
【发布时间】:2012-12-14 22:26:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • .. 你也可能得到答案。顺便说一句,听说过段落吗?
  • 如何选择最佳答案??
  • 点击它旁边的复选标记,它应该会从灰色变为绿色
  • 代码中没有调试 printfs 是件好事。添加它们只会使调试变得更加困难。使用调试器。这就是他们的目的。
  • 因为这并不是人们通常调试程序的方式,所以真的不会有很多工具可以实现这一点。去调试所有这些麻烦会更好地投资于单元测试,以验证变量应该是什么。

标签: c debugging pointers printing structure


【解决方案1】:

假设您的 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 来观察程序中变量的值,但如果它不是线性的,由于函数调用或循环而被多次访问的语句将显示所有可以被访问的值在执行期间拍摄。

【讨论】:

  • 谢谢。我会试试这个。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多