简体中文
English 简体中文 繁體中文
Methodox 首页

调试

无论工具栏上的开关设置为 Interpreted(解释)还是 Compiled(编译),Routine 或 Events 图的一次运行都可以在任意语句之前停下,供你查看,并逐条语句地向前推进。这适用于逐步运行的图;Flows 或 Function 图本身没有可供在其间停下的步骤,因此 Flows 运行只会在它所调用的 Routine 内部暂停。断点也可以设在文档所使用的 C# 文件的某一行上——请参阅下文的 C# 文件中的断点。

设置断点

选择一条语句——即带有执行引脚的节点,例如 Print Line——然后按 F9。其标题左侧会出现一个红点,状态栏显示 Set breakpoint on Print Line。再按一次 F9 即可清除。节点 Properties 中的 Breakpoint 开关作用相同。断点随文档一起保存,并且与任何编辑一样,设置断点也是撤消历史中的一个步骤。

运行到断点

按 F5。当运行可以被暂停时,画布周围会出现一个红色边框。运行会在带有断点的节点之前停下——该节点尚未运行——并且:

  • 该节点会显示粗的琥珀色边框并标为 paused,同时被移到视图中央并选中;
  • 工具栏上的 Run 变为 Stop,Properties 面板切换到 Debug 视图;
  • 状态栏会给出该节点及其所在的图——Paused at Print Line in Graph - F5 continues, F10 steps over, F11 steps into, Shift+F11 steps out, Shift+F5 stops——并在旁边显示本次运行所处的模式。

如果该语句位于另一个文档中——即本文档所引用的某个文档的 Routine 或 Function——那个文档的标签页会被切换到前台;当你继续时,运行会在你眼前继续进行:无论显示的是哪个标签页,它输出的行都会留在控制台上。

在断点处暂停的运行:画布周围的红色边框、琥珀色的已暂停节点,以及显示调用堆栈、值和数据成员的 Debug 视图

编译运行

当开关设为 Compiled 时,有地方可停的运行会以调试方式构建:程序在运行每条语句之前都会通知编辑器,并保留每个节点产生的结果,因此它可以像解释运行一样停下、单步执行并显示值——同样的红色边框、琥珀色边框、Debug 视图和状态栏,并在状态旁显示 Compiled。当文档本身、在标签页中打开的被引用文档,或其引用的 C# 文件的某一行上设有断点时,这次运行就有地方可停。另一种进入方式是在没有任何运行时按 F11:它会以调试方式构建运行,并在第一条语句之前停下。

没有地方可停的运行会一如既往地为速度而构建:没有什么能暂停它,它与文档导出所得的程序完全相同。以调试方式构建的程序运行紧凑循环时要慢上数倍,这就是为什么只有在运行可以停下时才会以调试方式构建。

保存在未打开的被引用文档中的断点会让解释运行停下,但不会让编译运行停下:请先打开那个文档。

C# 文件中的断点

当文档使用某个 C# 文件时,打开该文件——使用 Ctrl+O 并选择 Code files 类型,或将其拖到窗口上——它的文本标签页在行号左侧有一条窄栏。单击某一行旁边的窄栏,或将光标放在该行上并按 F9:会出现一个红点,状态栏显示 Set breakpoint on line 6。当你在断点上方输入内容时,断点会跟随其所在的行移动;断点会一直保留到编辑器关闭,但不会被保存。

以任意一种方式运行文档。当对该文件的调用到达这一行时,文件的标签页会切换到前台,该行以琥珀色高亮显示,窄栏中出现一个箭头,状态栏显示 Paused at line 6 of MathScript.cs - F5 continues, …。调用堆栈中会有一行表示该文件的方法——MathScript.Twice · line 6 MathScript.cs——位于调用它的图之上;Locals 列出该方法的实参和目前已赋值的变量,例如 [double] value 3 和 [double] doubled 6。F10、F11 和 Shift+F11 可以逐行单步执行该文件,并跳出返回到图中。

在 C# 文件第 6 行暂停的编译运行:该行以琥珀色高亮、旁边有箭头,调用堆栈中该文件的方法位于调用它的图之上,Locals 下显示该方法的两个值

运行使用的是文件已保存的版本,因此如果你的编辑使行号发生了变动,请在调试之前保存。lambda、迭代器和异步方法内部的行,以及由顶级语句组成的文件,会运行但不会停下;对 DLL 的调用会整体运行。

查看当前位置

Debug 视图从上到下依次为:

  • Continue、Pause、Stop、Step over、Step into 和 Step out。
  • Paused,显示节点和图,并提醒你该节点尚未运行。
  • Call stack(调用堆栈)——运行当前所处的每个图各占一行,最内层的排在最前,例如 Graph · Print Line, inside For。单击某一行可查看该图,其中所处的语句会被标出。
  • Locals(局部值)——本轮中已运行的每个节点,每个引脚一行:[In] 表示输入的值,[Out] 表示输出的值——例如 For 节点的 [In] End 2 和 [Out] Current Value 0。值尚未计算出来的引脚显示为 no value yet。单击某一行可查看其完整的值——图像显示为图像,表格显示为表格。
  • Data members(数据成员)——图所能访问到的每个数据成员的当前值,例如 [Number] Total 2。

控制台停靠栏的 Locals 和 Call stack 标签页列出相同的内容,而运行到目前为止打印的内容已显示在其 Console 标签页上。

继续推进

按键 作用
F5 继续运行到下一个断点,或运行到结束
F10 单步跳过(Step over):运行这条语句,并在同一个图中的下一条语句之前停下——对另一个 Routine 或 Function 的调用会整体运行
F11 单步进入(Step into):在任意位置的下一条语句之前停下,会进入该语句所调用的 Routine 或它所到达的 C# 方法。在没有任何运行时,启动一次运行并在其第一条语句之前停下
Shift+F11 单步跳出(Step out):完成当前图,并在返回到调用它的图后停下
Shift+F5 停止运行

Debug 视图上的 Pause 会让正在进行的运行在其下一条语句之前停下——这是在没有断点的情况下进入长循环的方法。暂停时按 F9 可以为本次运行的剩余部分设置或清除断点。

当语句失败时

当运行可调试时——解释运行总是可调试,编译运行在以调试方式构建时可调试——失败的语句(例如文件不存在、截取文本超出其末尾)会让运行在该处暂停,无论那里是否有断点。Debug 视图和状态栏会说明失败的内容:Paused at Print Line in Graph, which failed: … - F5 ends the run。查看导致失败的值,然后按 F5 结束运行——控制台会打开并定位到失败信息(即其最后一行)——或按 Shift+F5 停止运行。为速度而构建的编译运行如果失败,不会暂停:它会结束,控制台会打开并定位到失败信息。