2012-12-30 30 views
5

我正在使用4-5个.c文件(每个2000到5000行左右),其中包括几个 头文件。目前我没有任何调试打印,它可以帮助我调试程序 在执行过程中。自动打印C中的结构和变量

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

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

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

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

+1

..你也可以得到答案。 BTW听到段落? –

+0

如何挑选最佳答案? –

+2

单击它旁边的复选标记,它应该将颜色从灰色更改为绿色 – Fingolfin

回答

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

+0

谢谢。我会试试这个。 –