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

时间:2012-12-30 10:56:24

标签: c debugging pointers printing structure

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

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

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

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

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

1 个答案:

答案 0 :(得分: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来观察程序中变量的值,但如果它不是线性的,那么由于函数调用或循环而多次访问的语句将显示所有值可以在执行期间进行。