调试
集成调试环境
列出编译错误
VI 程序框图窗口上的工具栏中,有多个用于调试程序的按钮,可以帮助编程者找出程序错误所在。
对于某些程序中的错误,如缺少必要的输入、数据类型连接错误等,LabVIEW 可以在编辑 VI 的同时就发现它们。LabVIEW 发现这些错误后,会把“运行”按钮变成断裂箭头模样的“列出错误”按钮:

用户只要点击这一按钮,在弹出的“错误列表”窗口中就会显示出程序中的错误:

错误列表窗口会列出有错误的 VI 和 VI 中具体存在问题的节点。除了显示导致程序不能运行的错误之外,它还可以提供一些警告信息,显示程序可能存在问题的地方。
双击列表中列出的条目,即可弹出出错的 VI,并高亮显示出 VI 中相应的出错位置。
运行时的调试工具
有些错误,是不可能在编辑过程中被 LabVIEW 自动发现的。比如,程序中的逻辑错误等,只有在程序运行过程中,产生了错误或没有返回预期结果时,用户才能意识到程序存在错误。修改这样的错误,首先要对错误进行定位,找到程序中产生错误的具体位置,然后才好对症修改。
最常用的错误定位方法是:让程序在有可能出错的位置前暂停,然后单步执行。每执行一个函数或节点,都观察一下这个函数或节点的输出与预期的正确结果是否相符。若在执行某一步时,开始出现错误,则此处很可能就是症结所在。
VI 程序框图窗口工具栏中的“暂停”、“单步步入”等按钮,是用于帮助程序进行调试的。下图是一个正在运行的 VI 的程序框图。如果有其它编程语言的调试经验,看到工具栏上的按钮的图形,基本上就可以知道它的功能了:

用于停止整个程序的执行。调试到中途,不想让程序继续执行下去了,可以使用这个按钮。
用于暂停或者继续程序的执行。使用这个按钮可以让运行的程序暂停,或让暂停的程序继续执行到终结、或直到下一个断点处再停下来。
用于启动高亮显示执行。在高亮显示执行时,LabVIEW 会放慢代码的执行速度,并且在程序执行到每一个节点时,高亮显示这个正在被执行的节点。高亮显示执行的速度非常慢,所以启用它要非常小心。如果启动高亮显示执行的同时,某个 VI 前面板的设置是 "模态"(modal)的(在 VI 属性框的 "窗口外观" 页,按 "自定义..." 键,进入 "自定义窗口外观" 页,勾选 "模态" 选项),那么再想中途关掉它是不可能的了。只能非常痛苦地等待程序的结束,尝试使用键盘快捷键 Ctrl + . (句号) (Mac 系统下是 Command + .)。这是 LabVIEW 的通用“中止执行”(Abort Execution)快捷键,通常可以强行停止当前的 VI,从而从模态窗口的锁定中解脱出来。
所谓前面板或者一个窗口是 "模态" 的,是指这个前面板被打开后,总是置于同一程序的其它所有窗口之上。用户只能对 "模态" 前面板进行操作,而不能点击或编辑任何其它窗口。只有在 "模态" 前面板关闭后,才能继续点击其它窗口上的控件。一般来说,程序中的对话框就是 "模态" 的。
启用高亮显示时,程序框图的数据线上会显示一个小点在流动,以演示数据在数据线上的流动。这样,可以更形象地观察程序的执行流程。
用于保留 VI 程序框图上数据线中的数据。如果这个按钮被按下,在程序执行过某根数据线之后,在数据线上流过的数据就会被保存下来。用户可以继续使用探针来查看这些数据。
用于单步执行。它们三个分别表示进入、跳过或跳出某个节点、结构以及子 VI。
下拉框表示 VI 的调用关系。如果正在被调试的是一个程序中的子 VI,在这里可以显示出子 VI 的调用关系。打开下拉框,可以看到当前 VI 从低层到高层的逐级被调用关系。选择下拉菜单中的某一项,即可跳到被选中的那个 VI 处。
除了上述这些工具,在进行调试时,通常还需要使用到断点和探针。断点和探针都是设置在程序框图上的。如果是在数据线上设置断点,数据线上会显示出一个红色的圆点:。如果断点设置在某一节点上,这个节点会被一个红色的框包围起来。探针只能加载数据线上,它会在数据线上添加一个标签:
。标签中的数字表明这是哪一个探针。而探针所在处的数据会在如下图所示的悬浮窗口中显示出来:

全局选项
在 LabVIEW 的选项对话框上(点击“工具 -> 选项...”菜单),有一些与调试相关的选项。旧版本 LabVIEW 的选项对话框上有专门的一页“调试”(Debugging)放置这些选项:

较新版本的 LabVIEW 中,这些选项被合并进了“环境”(Environment)页面:

在几个常见的选项中:
- “高亮显示执行过程时显示数据流”表示在高亮显示执行的过程中显示数据的流动。
- “高亮显示执行过程时自动探测值”表示在高亮显示执行的过程中,数据从每个接线端流出时,显示数据的数值。
- “默认在错误列表对话框中显示警告”表示在默认情况下,在错误列表的对话框中显示警告信息。
- “启动时提示调查内部错误”表示在 LabVIEW 启动时检查是否存在内部错误。
VI 的属性
某些 VI 的属性设置(譬如某个 VI 被设置为不允许调试),会导致这个 VI 无法调试。禁止 VI 调试可以大大提高 VI 的运行速度,降低 VI 的内存占用。所以,在 VI 发布给用户时,最好把它设为不可调试。对于从别人那里得到的 VI,如果发现它不可以调试,应该首先查看一下它是否被设置为不可调试了。如果是,可以重新设置其为允许调试,然后再进行调试:

在有些情况下,VI 是无论如何都无法被调试的。比如,VI 被设置了密码保护,而你又不知道密码;或者 VI 在保存时被移除了程序框图。
断点和探针
断点和探针是调试 LabVIEW 代码时最常用的两个工具。
断点
LabVIEW 中的断点在使用和功能上都比较简单、直观。使用工具选板(下图)上的断点工具,在想要设置或者取消断点的代码处点击鼠标即可。或者,直接在程序框图的节点、数据线上右击鼠标,选择设置或取消断点的菜单项,也可以添加或删除断点。
断点几乎可以设置在程序的任何部分。当程序运行至断点处,就会暂停,等待调试人员的下一步操作。很多编程语言的调试环境都具有条件断点,在旧版本的 LabVIEW 中,没有类似于文本编程语言中的“条件断点”,必须依靠条件探针来实现。但从 LabVIEW 2019 开始,LabVIEW 引入了原生的条件断点功能。用户只需在设置好的断点上点击鼠标右键,选择“断点属性...”,即可配置断点触发的条件(例如:当循环变量 i > 50 时暂停)。
这样,只有满足特定条件时,程序才会暂停,大大提高了调试循环和频繁执行代码段的效率。
如果某个 VI 不允许设置断点,很可能是这个 VI 被设为不允许调试了。此时,只需在 VI 属性中重新设置为允许调试即可。
断点是可以被保存在 VI 中的。关闭保存了断点的 VI,程序执行至断点处仍会停下来,并且会自动打开这个 VI。所以,在把程序发布给用户前,需要保证程序中没有断点,以免用户的程序在运行时突然停下来。打开“查看 -> 断点管理器”菜单,可以查看到所有存在于内存中的 VI 的断点。并且可以对它们进行统一管理,比如可以直接删除所有的断点:

探针
探针的功能类似于其他语言调试环境中的查看窗口。查看窗口用于显示变量当前状态下的数据。LabVIEW 与其他语言不同之处在于,LabVIEW 是数据流驱动型的图形化编程语言。LabVIEW 中的数据传递并非通过 变量,而主要是通过节点之间的连线完成的。所以,LabVIEW 的探针并不是针对变量的,而是添加在数据线上的。
与设值断点类似,使用工具选板上的探针工具,或者直接在程序框图的数据线上右击鼠标,选择探针菜单项,可以为数据线添加一个探针。LabVIEW 的探针也是图形化显示的,数据被显示在悬浮窗显示区域的显示控件中。探针窗口有左右两部分,左边列出了当前程序中所有的探针,高亮选中其中的一个探针,它的数值会被显示在窗口右边“Probe Display”中的控件中。比如,为一根传递数值类型数据的连线添加探针,默认的探针便是一个数值型显示控件:

错误输入输出数据线上的探针,则看上去就像是个错误簇:

有些时候,为了显示对调试者更加有帮助的信息,探针也可能使用与连线数据类型不同的控件来显示信息。比如上文中用于监视一个引用类型的数据连线的探针,却使用了字符串控件,以显示出引用类型的详细信息和值:

选取其它控件作为探针
如果编程者认为 LabVIEW 为某一条数据线提供的默认的探针不美观或不适用,也可以在该数据线上点击鼠标右键菜单“自定义探针 -> 控件 ->...”,在弹出的控件选板中选取一个控件作为探针:

探针控件的数据类型必须与数据线的数据类型一致,探针才会被成功创建。
条件探针
设置断点后,程序每次执行到断点处都会停下来。但有时候,调试者希望程序只在被监测的数据满足某一条件时,才暂停运行。比如,被监测的数据在正常情况下应大于或等于零,调试者希望一旦数据小于零则暂停。在 LabVIEW 中,可以使用条件探针来实现这样的功能。

以上图中的程序为例,如果希望程序中的循环只有在迭代第 8 次时才停下来,就需要使用条件探针。在记录循环次数的 i 的输出数据线上点击鼠标右键,选择“自定义探针 -> 带条件...”的探针,即可创建出一个条件探针。在探针的条件页上可以设置程序暂停的条件。比如,在这个例子中,当 i=7 时,则对应于循环迭代到第 8 次。满足这一条件时,程序会暂停运行,等待开发人员进一步的调试操作。