suffer 发表于 2006-10-23 09:50

其它常用的调试工具和方法

除了断点和探针这两种最常用的调试工具外,我们还经常要借助一些其它的工具和方法来寻找程序所存在的问题。

1. 性能和内存查看工具(Profile Performance and Memory)
    调试的目的并非仅局限于找出功能性错误,有时是需要寻找到程序效率低下的原因,或者诸如内存泄漏等的潜在危险。这时,就要用到 LabVIEW 的性能和内存查看工具了。参见:LabVIEW 的运行效率 1 - 找到程序运行速度的瓶颈。

2.显示缓存分配工具(Show Buffer Allocation)
    显示缓存分配工具是另一个检查 LabVIEW 代码内存分配情况的强大工具。参见:LabVIEW 程序的内存优化。

3. 程序框图禁用结构(Diagram Disable Structure)
    调试程序,首先要找到问题发生的部位。有时候,我们可以使用探针一路跟踪数据在程序执行过程中的变化。如果数据在某个节点的输出与预期的不一致,这个节点很可能就是问题所在。还有些情况,不是靠这种简单方法就可以找出来的。比如,程序中出现的数组越界的错误,在错误发生后,程序可能还会正常运行一段不确定的时间,然后才崩溃,或报错。这种程序报错、或者崩溃的地点有可能在每次调试时都不同;或虽然找到了最终出错的代码,但发现它是个最基本的 LabVIEW 节点,不能再跟进去单步调试了,而这个节点出错的可能性基本为零,错误肯定是其他地方引起的。
    调试时遇到这种现象,一般可以先把一部分代码禁止掉,看看程序运行是否还有问题。如果没有问题了,说明有毛病的代码已被禁止运行,则可以把禁止代码的范围再缩小;如果问题又出现了,说明是刚刚被放出来的代码有毛病,则对这部分代码再禁掉一部份,继续调试。如此反复调试,直到找出引起问题的一个或几个节点,再改正它们。在这一种调试代码的方法中,使用程序框图禁用结构是最为方便的了。它就如同是 C 语言中用来做注释的关键符号“/*   */”或者“//”,使用它可以方便地把一部分代码框住,禁用,如图1。


图1:程序框图禁用结构

    使用程序框图禁用结构,有一点是需要注意的:这个结构可以有多个 Disable 的页面,同时会有一个 Enable 的页面。调试人员可能还要在 Enable 的页面作一些改动,比如为输出数据添加一些虚拟值,以使后续程序可以正确地运行下去。例如图2,为了让后续的程序继续正确运行,需要把 reverence 和 error 数据线连接上。


图2:修改 Enable 页面

4. 条件禁用结构(Conditional Disable Diagram)
    LabVIEW 中还有一个类似于 C 语言中 #if,#ifdef 的结构,这就是条件禁用结构。使用条件禁用结构,可以让某些代码在特定的条件下不再运行。它与条件结构(Case Structrue)的区别是:条件结构是在运行中决定执行哪一个页面中的代码;而条件禁用结构是在编译时就已决定好执行哪一个页面的代码了,不被执行的页面的代码在运行时是不会被装入内存的。
    利用条件禁用结构的这一特性,可以把分别需要在调试时和发布后的代码放在不同的条件禁用结构页面内。这样,既可以在不同条件下运行不同的代码,又不会使程序的代码留有冗余。图3是一个条件禁用结构应用的典型例子:用户希望在开发调试过程中,一旦错误数据线上出现错误,则弹出错误信息的对话框;而在发布之后,即使有错误发生,也不允许弹出对话框。


图3:使用条件禁用结构控制调试时和发布后程序的不同行为

    点击条件禁用结构右键,选择弹出菜单中的 Edit Condition For This Subdiagram... 条目,则又弹出条件配置窗口,在这个窗口可以改变本页运行的条件。LabVIEW 有一些预定义的符号(Symbol)可供条件禁用结构使用。比如 TARGET_TYPE 表示目标代码在什么系统下运行。如果条件是“TARGET_TYPE == Mac”表示目标代码运行在苹果机上。
    如果你有工程文件“*.lvproj”,那么还可以在工程文件的属性->条件禁用符号栏下配置自己需要的符号。如图3中的例子,就是我自己在工程的属性对话框中添加了一个“DEBUG”符号,这样我就可以通过更改 DEBUG 符号的值来控制是否弹出程序的错误对话框。

5. 使用消息对话框和文件
    还有一些错误只有在去掉程序的调试信息后才出现,或者出错的代码部分不允许使用 LabVIEW 的调试功能。举两个例子:比如你的程序在 LabVIEW 里直接运行时,也许没有任何问题,可是一旦生成为可执行的 EXE 文件,程序就会出错;再有,在 LabVIEW 7.1 或更早的版本里 Reentrant VI(如何使用 VI 的 Reentrant 重入属性) 如果出了错,是不能进入 VI 内进行单步调试的。
    这时就要使用类似 C 语言中 printf() 的功能了。具体实现方法就是把可疑的数据在程序中用 messagebox 显示出来,这样就可以跟踪察看程序是在哪一部分出错的。还可以把所有相关的数据都保存在一个状态记录文件中,察看这个记录文件,就可以找出可以的错误。
    还可以把状态记录文件与第4节提到的条件禁用结构联合起来使用,设置为一个调试开关:在调试运行方式下记录所有状态信息;在正式发布后就不再记录这些信息,以提高程序的运行效率。

转自http://ruanqizhen.spaces.live.com/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry
版权归原作者所有
页: [1]
查看完整版本: 其它常用的调试工具和方法