Gandi 3.0文档
官网 打开编辑器
文档/调试工作台

断点与单步

在一块积木上设断点,作品运行到那里就会停住,然后可以查看调用栈和变量、一块一块往下走。 用法与代码调试器一致,区别只在于这里的「一行」是一块积木。

命中断点时的面板

怎么下断点#

两种方式,效果相同:

  • 按住 Shift 点一块积木。再点一次取消。
  • 右键积木,菜单里有「设断点」;已经有断点时这一项是「取消断点」。
积木右键菜单里的设断点

断点用 Shift 而不是 Alt 或 Ctrl,因为后两个键在积木上已有别的用途:内置插件 「选择特定积木」用 Alt 拖动复制、用 Ctrl 框选。

设好之后积木左边缘会多一枚圆点:

积木上的断点圆点

圆点画在积木自身的图形里,拖动、滚动、缩放时都跟着积木走,不会错位。切换角色会重建 工作区,圆点在半秒内自动补齐。

删除积木时断点一并删除。 如果作品正停在被删掉的那块积木上,运行会自动继续,否则 作品会一直停在一块不存在的积木上。

命中断点时#

作品停住,画面继续绘制,脚本不再推进。工具条上的「暂停」变成绿色的「继续」,右边亮起 「已暂停」。命中时如果停在「概览」或「日志」页,会自动切到「断点」页。默认还会切到对应 角色、把工作区滚到那块积木并闪一下,这一行为由「暂停时跳到积木」勾选框控制。

暂停现场

标题一行写明停下的原因:断点、变量被改、事件还是手动暂停;第几次命中;哪个角色。

调用栈从上往下是从里到外,最上面那条标着「停在这」,就是当前块。遇到自制积木会写成 「调用 过程名」。点任意一层跳到那块积木。

变量·直接改列出这个角色能看到的变量:它自己的,加上舞台的(全局的会标出来)。输入框 里的值可以直接改,回车或点别处生效,不必改脚本再重跑一遍。列表只显示前几项,不在这里改, 要改去「监视」页。超过 2000 字的值只能查看,不能修改。

工作区里那块积木也有标记:

工作区里停下的那块积木

粉红色的圆点是断点,左边那枚小箭头表示线程当前执行到这里。停下的那块,箭头换成「停下的 积木」的颜色,并左右小幅摆动,积木本身也描一圈同色的边。两个颜色都能在「外观」页改。

单步执行#

单步、跳过、跳出各走到哪
按钮 快捷键 走到哪
继续 F8 恢复所有线程,运行到下一个断点
单步 F9 走一块。当前块是自制积木调用时,进入过程内部
跳过 F10 走一块,但自制积木整段执行完,停在它后面那块
跳出 Shift + F9 执行完当前过程,回到调用它的地方

暂停的语义是停在这块积木之前,该块尚未执行。所以停在「将 得分 增加 1」上时,变量表里 的得分还是旧值,按一次「单步」才会变。

单步期间其它线程全部挂起,包括单步途中新建的线程,否则单步时别的脚本会继续往下跑。

「继续」之后不会在原地再停一次:停下的那块被放过一次,执行到别的块再恢复。所以循环里的 断点每圈停一次,不会反复停在同一块上。

快捷键在输入框里不响应,因此在条件框里打字不会误触发。

不设断点也能停:按 F8(或点「暂停」)会停在第一条正在运行的线程上,同样可以查看调用栈、 改变量、继续单步;一条线程都没有时,只是把作品冻住。

断点的附加设置#

「断点」页每条断点下面有三个小框:

条件、每 N 次、日志点

条件#

只在条件成立时才停。写法是把变量名用大括号括起来:

{得分} > 100000
{血量} < 10 and {关卡} = 3
not {暂停中}
  • {名字} 取变量的值,先找当前角色的,找不到再找舞台的。
  • and or not 就是「与」「或」「不成立」,也能直接写 && || !。
  • 单个 = 会当成相等来判断,== 也行。
  • 看起来是数字的值会按数字比较。

写错了会在「日志」页留一条「条件写法不对」;条件在运行时抛错会留一条「断点条件出错」, 然后当作不成立继续跑。

每 N 次停#

填 500 就是每命中 500 次停一次。计数是这块积木被经过的次数,标题右边的「命中 N 次」 就是这个计数。循环里的断点不填这一项通常无法使用。

日志#

填了就只打印不停:作品照常运行,每次经过这块积木往「日志」页写一条。模板里的 {变量名} 会换成当时的值,列表会写成 [N 项]:

血量掉到 {血量},得分 {得分}

它相当于 Scratch 版的 console.log。与用「说」积木打印相比,它不占舞台、不改作品, 关掉面板就清除。日志点在循环里一帧能打几千条,「日志」页会把连续相同的合并成「×N」。

停用而不删#

每条断点右边有三个按钮:「跳到积木」、启用 / 停用(实心圈是启用,空心圈是停用)、删除。 停用的断点仍留在表里,那一行变暗,积木上的圆点则收起。适合临时关掉某个断点,又不想重新 找那块积木。

断点列表

不在积木上的断点#

面板最下面一排是另外三种:

断点页底部的设置

变量被改时停#

下拉里选一个变量,点「加」。此后任何对这个变量的写入都会停下来,不论出自哪段脚本。 排查某个变量被谁改动时,这一条最快。

变量断点命中

标题里会写明改前改后:得分:825400 → 825401。

「监视」页每个变量右边也有一颗同样作用的按钮(◉),不必回到这一页来加。

列表不支持这种断点,下拉里也不会列出来。

广播时停#

填一个广播名,点「加」。这条广播发出的那一刻停在发出它的那块积木上,而不是接收方。 用它来确认广播是谁发的。

广播断点命中

克隆时停#

勾上之后,每次有克隆体被创建就停在那块「克隆 …」积木上。

变量断点和这两种事件断点,都是在积木执行到一半时停的:广播已经发出去了、变量已经改 完了。所以「继续」时这块积木不会重跑一遍,直接从下一块开始,否则会再发一次广播、再改一次 变量。

「全部清除」把这三类连同积木上的断点一起清掉。

查看当前线程#

「线程」页最上面那行是实时的,点「展开」列出此刻每一条线程:

线程页里的现场列表

每行是角色、正在运行的那段脚本、状态(运行中 / 等待 Promise / 让出 / 等下一帧 / 已结束; 被单步挂起的写「按住」),后面两颗按钮:⌖ 跳到它当前那块积木,⏸ 把这条线程停下来。 最多列 60 条。

暂停中的行是橙色的。

工作区上的「运行到哪」#

面板开着的时候,每条线程当前停的那块积木旁边会有一个小箭头,整块还会描一圈蓝边。两帧之间 线程会停在等待、循环末尾或让出的地方,箭头指的就是那里。最多同时画 40 个。

不需要时可以在「外观」页把「运行到哪」关掉。

细节#

  • 断点只在解释模式下有效。 编译模式把脚本编译成了 JavaScript,里面看不到积木。 面板设第一个断点时会自动切成解释模式,并在「日志」页留一条提示;断点全部清空后自动 切回去。工具条右边的「解释」/「编译」胶囊显示当前是哪种。
  • 「暂停」定住的是整个作品(画面还在绘制),不是只停一条线程。只停一条线程用「线程」页 那颗 ⏸。
  • 停在断点上时,那段脚本仍带着「脚本正在运行」的黄光。那是运行状态的常规提示,不是调试器 画的,停下的那块要靠圆点和箭头辨认。
  • 断点、条件、日志点都不会写进作品文件,关掉编辑器后即清除。

相关#