调试器自从RP Fiber Power V7版本,有一个功能强大的调试器,它允许您分步骤执行脚本代码,并在任何步骤之后检查系统的状态。这在搜索复杂仿真脚本中的错误时非常有用。
调试实际上可以通过两种不同的方式进行:
·您可以一个命令一个命令地执行脚本,也就是说,您可以在执行每个命令之后检查系统。这在上文节中有描述。
·您还可以在表达式计算中检查系统状态。如果您正在开发复杂的表达式,由许多细节组成,可能包含控制结构,它将非常有用。
对于这两种方法,下文所述的检查工具用于检查系统状态。
下面的示例代码用于解释两种调试方法之间的差异:
calc
begin
a := 1;
while f(a) < 1 do
a := 1.1 * a;
end
整个过程是一个命令(calc),它导致表达式的计算(这里是一个begin-end块)。在第一个方法中,整个命令将在一个步骤中执行。在调试表达式(第二种方法)时,您可以一步一步地执行while循环,并查看变量a的值在不断变化。注意,赋值(例如a : = 1.1*a)不是命令,而是子表达式(表达式的一部分)。在本例中,可以使用单独的命令执行相同的操作:
a := 1
while f(a) < 1 do
a := 1.1 * a
这可以用第一个方法一步一步地执行。这里,while循环被实现为一个语句,调用赋值命令(a: = 1.1*a)作为其循环体。
1、调试命令在本节中,将演示如何按命令执行脚本命令。(有关调试数学表达式,请参见第下文。)
软件可以处于以下执行模式之一:
·Editing mode:可以编辑脚本或表单内容。软件尚未执行任何操作。
·Running mode:当前执行脚本时,通常只需等待执行完成并显示结果。即使在执行期间,您也会看到当前状态的显示(见下文),除非您正在处理表单。
·Debug mode:在此模式下,软件已中断执行,并等待您决定如何继续执行。它显示执行脚本中的当前位置,您可以在决定下一个操作之前检查系统的状态,例如,执行下一个命令、在运行模式下继续或中止执行。
·Inspectors(放大镜):这将调用检查工具,您可以在其中检查变量的当前值。
通常,当执行脚本或表单内容时,软件将从编辑模式切换到运行模式,执行后将返回编辑模式。但是,有以下方法进入调试模式:
·在开始执行时,可以通过按住Ctrl键(例如,使用Ctrl-F8而不是F8)直接启动调试模式。
·在运行模式下,您可以按 Ctrl-B (为了“break”)或单击主表单上“End execution”按钮下方的“Break”按钮(见下文)。在运行模式下,工具栏中还会出现一个蓝色的中断按钮。
请注意,软件首先需要完成当前命令的执行;因此,对于某些命令,需要一段时间才能进入调试模式。
·当软件在执行的脚本中遇到断点(见下文)时,它也会进入调试模式。
下面的屏幕截图显示主窗口在调试模式下的外观:
在工具栏下面,您能找到显示一些信息的“Execution and debugging”面板:
·状态(执行模式)“debug”
·当前执行的文件(当软件进入或完成一个include文件时,在执行过程中会发生更改)
·当前行号(以及开放循环结构的其他有用信息,如果适用)
·自执行开始以来的总执行时间(不包括调试模式下的等待时间)
还有各种按钮用于确定下一个操作:
·Abort(中止):执行肯定结束,软件返回编辑模式。您将选择这样做,例如,当您在脚本中发现错误时,首先需要修复该错误,然后才能从头开始执行。
·Break(中断):此按钮可在运行模式下用于中断执行并进入调试模式。例如,如果执行似乎进入了一个无止境的命令循环,并且您想要找出发生在哪里,那么您可以这样做。
请注意,软件首先需要完成当前命令的执行;因此,对于某些命令,需要一段时间才能进入调试模式。如果表达式中有一个无休止的循环,则中断将不起作用,因为当前命令的执行无法完成;然后可能必须中止。
·Single command(单命令):只执行下一个命令,然后返回调试模式。
如果下一个命令是include命令,导致执行include文件,则在按下按钮“single command”时按住Shift键,可以一步执行整个文件。
·Resume(继续):继续执行(在运行模式下)直到脚本结束或下一个断点(见下文)。
如果正在执行include文件,则在按下“Resume”按钮时按住SHIFT键,最多只能继续到该文件的末尾。然后,软件将再次进入调试模式,您可以逐步检查调用脚本。
在这些按钮下面,有一个复选框,您可以用它忽略进一步的断点。
在调试模式下,您还可以找到代码的显示,其中要执行的下一行显示为蓝色,绿行表示断点。代码显示在运行模式下是隐藏的,因为它通常变化得太快而无法读取,但您仍然可以在上面的控件中看到当前的行号、执行时间等。
定义断点有两种方法(即软件进入调试模式的点(见上文),而不是继续执行):
·最快的方法是在编辑器中的一行前面单击。该行将显示为绿色,文本左侧的装订线区域将显示一个绿色圆圈。请注意,这样的断点是临时的;如果关闭编辑器,它们将消失。
条件断点可以通过在装订线区域中单击鼠标右键并输入表达式来定义。只有满足条件,即表达式返回非零值时,执行才会在该点停止。
·另一种方法是插入以“@”开头的行(可能在一些空格之后)。在“@”符号之后,括号中可以有一个数值表达式;这会再次给您一个条件断点。这样一个条件断点的示例:@ (E_p() >= 1 nJ)
您不仅可以在编辑器中设置或删除断点,还可以在调试窗口的代码显示中设置或删除断点。
如果脚本执行期间发生错误,则无法返回调试模式;执行肯定已完成。通常,我们会更正错误并再次执行脚本。但是,还有一种可能,如果您可能会损失大量的计算时间,那么您可能需要使用它:您可以生成另一个脚本,只包含来自缺陷代码行的命令,您可以更正这些命令,并且在第一行中使用“keep all”。如果执行该操作,它将把所有变量和数组定义、计算模型详细信息等保存在内存中,然后继续执行。
2、检查工具当脚本执行在调试模式下完成或刚刚中断时,您可以使用检查工具检查系统的状态。您可以通过菜单中的View | Inspectors、F12或调试面板中具有放大镜符号的按钮来获得。
不同方面的检查有不同的选项卡:
·Variables:检查所有定义变量的值。您可以使用表下面的复选框选择是否也要查看预定义的值。
·Arrays:显示所有定义的数组及其索引范围。包含的值(可能有数百万!)不显示;要显示某个数组组件的值,请使用“Expression to evaluate”栏(请参见下文)。
·User-defined functions:显示执行脚本定义的所有函数。
·Fibers:这显示了脚本定义的所有光纤模型,包括它们的详细信息,如相应的光纤信道。
·Beam propagation:显示所有光束传播设备及其光信道。
在下面部分,您可以看到“expression to evaluate”栏。在这里,您可以输入任何表达式(或用逗号分隔的表达式列表),以获得变量或阵列分量值或从中计算出的值、光纤中的光功率或计算出的光脉冲的属性。
您可以在调试脚本时保持该检查窗口处于打开状态。每次遇到断点或脚本执行完成时,都会自动更新检查表单。您可以通过按表单右上角附近的“Update”按钮在其他时间更新内容。
3、调试表达式该软件具有强大的表达式引擎。这样,即使在数学表达式的层次上,也可以做相当复杂的事情,例如,在执行单个命令(例如,将表达式值赋给变量)的过程中。因此,即使在表达式中也常常需要进行调试。
您可以在表达式中设置断点,而不是使用“@”字符,例如命令级别上的断点,而是通过插入对函数debug()的调用来设置断点。该函数只有一个字符串参数。如果它不是空字符串,则表示此时要进入表达式调试模式;传递的字符串将在调试窗口中显示为消息,帮助您了解当前正在查看的代码。如果使用空字符串参数调用函数,则表达式调试模式将结束,即通常在调用后恢复表达式的计算。一旦到达包含debug()调用的块的末尾,调试模式也将结束。
使用debug()函数而不是简单的断点符号(例如“@”)的概念为您提供了更多的灵活性。特别是,只有满足某个条件时才可以调用函数,这样实际上就有了一个条件断点。您还可以使用计算的消息字符串,更好地通知您当前的状态。
具有断点的代码示例:
当计算达到该断点时,软件将显示检查工具,但现在显示选项卡“Debug expression”(在命令级别上调试时该选项卡不可见):
在调试表达式时,检查工具作为一个“模式”窗口工作:您不能将它放在一边并与用户界面的其他部分一起工作,因为软件在那里等待您的反馈以继续执行。
在表单中,您可以看到以下内容:
·用debug()函数传递的消息
·下一行要计算的代码用蓝色背景标记。
·显示上次计算表达式结果的栏
·局部变量(顶部变量是在最高级别表达式中最后声明的一个变量)
·用于计算表达式或表达式列表(可能依赖于全局变量或局部变量)的栏。
·一些按钮:
·Next expression:计算下一个表达式,保持调试模式。
·End debug mode:继续执行,直到到达下一个调试点。
·Abort:中止表达式的计算,然后执行整个脚本。
·用于检查全局变量、数组等的其他选项卡。
上面的屏幕截图不直接显示到达断点后的状态,而是在按下“Next expression”两次后,使当前位置移动到“for”循环的主体中。
还有一些其他有用的特性和技巧:
·检查表单的其他选项卡允许检查全局变量、数组等。
·在代码显示的底部,有一个深灰色的分隔线,您可以抓取并拉动它来重新分配显示代码和局部变量之间的可用屏幕空间。
·当计算单个表达式时,其结果显示在代码区域下方的栏中。
·最后一行代码只包含一个点。虽然在执行另一个步骤时不会再计算其他代码,但它很有用,因为它允许您在最后检查系统的状态。当到达该点时,该点将替换为块的最终结果的显示。
·在按住Ctrl键的同时,可以通过单击调试器窗口中相应的代码行来设置临时断点。然后计算将继续进行,不会中断到该行,除非事先发现了常规断点。这可能非常有用;例如,您可以使用它快速完成一个循环(对循环体执行许多操作),然后继续调试。
·如果在某个循环体中调用debug()函数,例如,通常只会看到该循环体的代码。如果您还希望看到那周围的的代码,请确保在进入循环之前调用debug()函数,即使您使用的是空字符串参数,因此此时还没有打开显示。
·如果显示的代码包含对用户定义函数的调用,则该函数将在一个步骤中执行,除非在其定义中还包含对debug()函数的调用。(可以在不同的表达式中组合调试。)
·如果使用以减号开头的消息字符串调用debug()函数,则只有当用户按下了 Ctrl-Alt-B时,调试模式才会打开。例如,您可以在循环中放置这样的调用,以便在循环执行时间过长,可能是由于无限循环,的情况下,使用Ctrl-Alt-B 开始调试。
请注意,如果不准备调用debug()函数,则在表达式中允许这样的中断是不明智的,因为用户几乎不知道当前对具有复杂计算的脚本的哪些表达式进行了计算。
关于在检查工具中显示局部变量的一些注释:
·只显示属于所显示代码的局部变量。
·不仅可以看到那些已明确声明的局部变量(使用var语句),还可以看到那些由for循环自动生成的局部变量。(上面的屏幕截图包含一个例子。)此外,用户定义函数的参数也作为局部变量列出。
·可能会在列表中多次找到某个变量名。在这种情况下,位于最高位置的(第一列中的最小索引号)与执行相关;它对应于执行代码最内部块中的变量声明。在对应于不同块的变量之间,可以看到一条双分隔线。