cratosw

调试提示指南(Prompting Debugging)

调试提示指南(Prompting Debugging)

调试流程、策略、示例提示、排错流程以及深入调试思维案例。

原文出处:https://docs.lovable.dev/prompting/prompting-debugging

使用 AI 构建既快速又有趣——直到出现问题为止。报错、意外行为或"AI 做了奇怪的事"在所难免。本指南帮助你在 Lovable 中驾驭基于 AI 的调试工作流:如何迅速修复小问题、应对棘手 bug、利用 Lovable 的聊天功能进行调试,以及如何用提示配方系统性地消灭问题。与 AI 助手一起调试是项新技能,但只要结构清晰、提示得当,就能高效解决问题,甚至从中获得学习机会。

高阶调试提示(Advanced Debugging Prompts)

有时你需要更"重型"的提示来深入排查问题或检查项目健康状况。下面是一些用于深度调试或优化场景的结构化提示示例。可在聊天模式(Chat Mode)中使用,以获取详尽分析而不直接修改代码。

全面系统审查(Full System Review / Codebase Audit)

当项目规模增长或怀疑存在结构性问题时,可以让 AI 对整个代码库做一次审查。它会检查架构是否干净、模块化,以及是否有放错位置的代码,就像问它:"一切都井井有条吗?"

示例提示 — 代码库审计:

请对整个代码库执行一次全面的架构审计,确认结构是否干净、模块化且优化:

  • 找出放错位置或可以更合理组织的文件、组件或逻辑。是否存在不应该出现在当前文件中的代码(逻辑错位)?
  • 评估是否保持了清晰的关注点分离(例如数据处理 vs. UI vs. 状态管理)。指出任何耦合过深的代码。
  • 标注过度复杂或不符合最佳实践的代码区域。
  • 提供改进结构与可维护性的具体建议报告,暂时不要进行代码修改

请将建议按重要程度排序,整理为一个有序列表,从最紧急到可选优化。

(此次仅限阅读分析,不要在审计过程中修改代码。)

这个提示虽然篇幅较长,但它会让 AI 充当代码审查员或架构师。我们要求它找出逻辑错位、检查模块化程度,甚至按优先级列出修复顺序。AI 可能回复:

  1. 将 API 调用与组件拆分:ProjectList 组件直接发起请求,建议把数据获取移到专用 hook 或 context,保持组件只负责 UI。
  2. 降低任务逻辑耦合:任务完成开关同时更新状态并写入 localStorage,应重构为单一事实来源。
  3. 归置工具函数:App.tsx 中的日期格式化函数应移动到 utils 目录。

这样可以帮助你从更高层次审视项目,尤其在你一直专注某个功能而忽略整体结构时。随后,你可以挑选其中的重构项,逐条提示 AI 实施。

避免使用泛泛而谈的提示:

什么都坏了,帮我修一下!

请让提示更加具体、详尽:

现在屏幕变成空白,我无法继续编辑。 能帮我检查发生了什么吗?

易碎场景的安全策略(Safe Approach for Fragile Updates)

当你知道即将修改的区域十分敏感(例如复杂的认证流程或核心算法),可以在提示开头加上一段警示性的指导语。这并非直接找 bug,而是提醒 AI 格外小心,避免引入新的问题。我们在提示词库中讨论过"锁定文件"的写法,这里给出一个聚焦"不要破坏现有逻辑"的版本。

示例提示 — 脆弱更新的安全提醒:

接下来的改动涉及应用的关键模块,请务必极度谨慎

  • 在修改之前,先仔细检查所有相关代码与依赖。
  • 不要改动任何无关的组件或文件。
  • 如果有任何不确定之处,请先暂停并解释你的想法,再继续操作。
  • 修改完成后务必充分测试,确认不会影响其他部分。

任务: 在现有邮箱/密码登录基础上,添加 Google OAuth 登录,并确保两个流程都能正常工作。

(请在实现过程中格外小心,逐步确认每一步。)

通过斜体、粗体等强调,你实质上在设定 AI 的"心态"——保持谨慎。AI 可能先说明实施步骤,再动手添加 OAuth,同时明确保留了邮箱/密码流程。这个策略适用于认证、支付、数据迁移等容易"一着不慎、满盘皆输"的模块,是一种预防性调试措施。

性能优化检查(Performance Optimization Check)

如果应用能运行但感觉迟缓或资源消耗大,可以让 AI 帮你分析性能瓶颈。它会查看数据获取模式、渲染效率,提出缓存、memo、懒加载等优化建议,相当于问:"怎样让它更快更顺滑?"

示例提示 — 性能审计:

应用功能正常,但感觉有点卡。请分析整个项目的性能瓶颈并给出优化建议:

  • 检查是否存在不必要的数据库或网络请求(例如重复请求、N+1 查询)。
  • 找出可能频繁重新渲染或在主线程执行繁重任务的组件。
  • 查看资源(图片、脚本)的使用情况:是否有体积过大的文件影响加载速度?
  • 提出改进建议,例如缓存常用数据、在合适位置使用 React.memo 或懒加载,以及其他可提速的方法。

请以列表形式输出分析与建议,暂时不要改动代码,仅指出可改进的方向。

在聊天模式下运行此提示,可以获得诊断报告。AI 可能会建议:

  • 数据获取: ProjectList 每次渲染都会请求数据,建议缓存或提升到更高层的 context,避免重复请求。
  • 重新渲染: TaskItem 未做 memo,当父级状态改变时会全部重新渲染,建议使用 React.memo
  • 资源优化: 有一张 2MB 的 logo 图片,建议压缩或换用低分辨率版本。
  • 打包体积: 页面都打进一个 bundle,考虑用动态 import() 做代码拆分。

接着,你可以挑选其中的优化项,让 Lovable 分步实施,例如:"按照建议实现项目数据的缓存机制"。这样既能提升体验,也可能减少成本(更少请求、更少计算)。

处理顽固错误(Handling Persistent Errors)

有些错误会反复出现,原因是根本问题未被解决。例如你修复了表层症状,但深层逻辑依旧有问题,导致不同形式的报错反复出现。可以尝试以下策略:

  • 询问 AI 已尝试的方案: 多次使用"Try to Fix"或手动调整后,往往不清楚做过哪些变更。可提示:"我们为这个错误尝试过哪些方案?"AI 会列出尝试过的办法,避免重复劳动。
  • 让 AI 用简单语言解释错误: "请用通俗的话解释这个错误为何出现。"这样可以检查你和 AI 是否真正理解问题,也能发现潜在误解。
  • 换一种实现思路: 询问:"既然这个错误总出现,有没有其他实现方式达到目标?"AI 可能提供绕开问题的替代方案。
  • 回滚并重来: 情况极端时,可以回滚到早期版本(Lovable 支持恢复旧版本),再以更小的步骤前进。也可告诉 AI:"我们准备撤销刚才的修改,改为按更小的步伐推进。"这样能重置上下文,摆脱僵局。
  • 隔离"死掉"的组件: 如果某个组件无论如何都不工作,可尝试通过提示新建一个最小版本,验证其独立运行,再逐步合并回项目。这类似"关机重启",但针对代码。

整个过程中,务必保持与 AI 的对话,把它当作协作伙伴:"我们修好了 X,但 Y 又出问题。X 和 Y 有什么关系?前一个修复会影响到后者吗?"AI 往往能发现你未注意到的关联。

示例调试流程(Sample Debugging Flows)

为了更好地理解上述思路,以下以三个常见场景演示调试流程。

"陷入错误循环"

你刚提示了一段复杂改动,如今应用无法构建,且两次"Try to Fix"都失败。

  1. 切换到聊天模式。
  2. 提问:"这次构建错误的根本原因是什么?"
  3. AI 解释是 API 调用的类型不匹配。
  4. 你继续问:"请展示相关代码和期望的类型。"
  5. AI 展示函数期望收到数字 ID,却得到对象。
  6. 你提示:"修改代码,仅传入数字 ID,而不是整个对象。"
  7. 切回默认模式执行该提示,构建成功。
  8. 如果仍失败,则回去继续追问:"还有哪些可能导致这个错误?"

关键在于:明确描述错误、让 AI 确认它的理解,而不是盲目反复点击修复。

"功能无法正常工作"

你添加了通知功能,但邮件没有发出。

  1. 没有报错,于是你在聊天模式提问:"邮件通知没有生效——任务逾期时我没有收到邮件,我们该怎么调试?"
  2. AI 建议检查服务器函数是否触发,以及邮件服务返回了什么响应。
  3. 你从(比如 Supabase)日志里看到权限错误。
  4. 把日志交给 AI:"日志显示发送邮件时出现 'permission denied'。"
  5. AI 推测可能是邮件服务 API 密钥未配置或被阻止。
  6. 你在设置中修正密钥(或提示 AI 调整函数采用其他方案)。

通过描述期望(收到邮件)与实际(没有,附带日志),AI 可以指导排查步骤。

"UI 元素消失"

重构后,一个 UI 区块完全消失("组件死了")。

  1. 告诉 AI:"项目列表区块完全不显示了。它在上次编辑前还好好的。"
  2. AI 检查组件是否仍被渲染,是否缺少 return
  3. 它可能发现重构时,Dashboard 页面不再引用 ProjectList。建议重新引入。
  4. AI 会给出排查思路:"数据还在拉取吗?组件有收到 props 吗?在渲染里加个 console.log 看看。"
  5. 你这么做后发现没有任何日志,说明组件根本没挂载。
  6. 于是提示:"请在 Dashboard 页的 JSX 中恢复 <ProjectList>(之前误删了)。"

在此案例中,关键是描述组件完全不见,AI 协助判断是未渲染还是渲染为空。

利用开发者工具与控制台日志:

我的应用无法运行,屏幕一片空白。 以下是开发者工具控制台的输出,请帮我排查:

Error occurred: TypeError: Q9() is undefined at https://example.lovable.app/assets/index-DWQbrtrQQj.js:435:39117 index-DWQbrtrQQj.js:435:35112 onerror https://example.lovable.app/assets/index-DWQbrtrQQj.js:435

根因分析、回滚与渐进增强(Root Cause Analysis, Rollback, and Progressive Enhancement)

以下是一些收尾建议:

关注根因,而非症状

每次都问:"为什么会发生?"而不仅是"现在怎么办?"。AI 可以帮助你找到根因,从而彻底解决问题。例如它可能通过快速修补消除 Null 指针错误,但没有处理真正导致 Null 的逻辑。若你怀疑这一点,可以追问:

我看到你通过增加判空避免了 Null 指针,但它为什么会是 Null?能否解决根本原因?

这样才能得到更稳固的解决方案。

明智回滚

Lovable 支持恢复到旧版本。如果一连串修复把代码改得面目全非,不妨回到之前,再换个策略。从头来过时,可提醒 AI:

我已经把项目回滚到添加通知功能之前。现在让我们更谨慎地重新实现它。

这样 AI 会明白代码突然变化的原因,重新调整方案。

渐进增强(Progressive Enhancement)

尤其在引入复杂新功能时,尽量拆成小步实施。这样如果出问题,就能迅速定位是哪一步造成的。若发现自己准备写一个涵盖多个功能的大段提示,不妨拆分成多条。将问题切成小块也让调试更轻松。

  • 添加失败的测试用例。
  • 隔离问题,分析依赖关系。
  • 在修复前记录发现的线索。

这是失败的控制台日志。请分析对应的测试用例,调查认证流程中的错误,并在了解依赖关系后提出解决方案。

及时记录

调试结束后做个总结,对未来很有帮助。可提示 AI:

请总结这次问题的原因,以及我们是如何修复的。

把它保存到 README 或调试日志里,便于未来回顾。

需要时求助真人

即使尽了全力,也可能遇到 Lovable 平台的 bug 或超出控制范围的问题。这时可以向官方 Discord 或论坛求助。最好先让 AI 帮忙整理信息(错误日志、重现步骤),再向社区请教。

社区调试手册(Community Debugging Guidebook)

以下手册来自社区 Discord,对调试项目很有帮助:

错误修复(Error Fixing)

修复错误时,仅聚焦相关代码,避免修改那些已经运作良好的部分。分析错误信息,追踪到源头。实施针对性的修复,确保解决问题同时不破坏现有代码库的兼容性。在确认解决方案前,验证它既修复了原始问题,又没有引入新 bug。始终保留正常功能,避免重写与错误无关的代码。

代码修改方式(Code Modification Approach)

修改现有代码时,要像外科手术般精准,只改必要部分。保留既有的变量命名、编码模式与架构决策。变更前分析依赖,确保不会破坏已有功能。以最小化 diff 呈现改动,而非整块重写。若发现超出任务范围的改进点,可单独提出建议,但不要擅自实施。

数据库集成(Database Integration)

在提出新的数据库结构前,先彻底审视现有 schema,了解已有的表、关系、字段。尽量复用既有表结构,避免重复建模。若必须调整 schema,要确保与现有查询和访问模式兼容,并考虑迁移策略以保留既有数据。提交方案前务必确认外键关系与数据完整性。

全面问题分析(Thorough Issue Analysis)

处理问题时,请执行完整的诊断流程。仔细检查错误消息、日志与系统行为,收集所有相关信息。先提出多种假设,再逐一验证,直到找出根因。记录分析过程与发现,并考虑潜在边界情况对系统的影响。

解决方案验证(Solution Verification)

在确认任何解决方案之前,务必进行严格验证:针对原始问题测试解决方案,确保没有副作用;检查相关功能是否仍正常工作;确认性能不受负面影响;在不同环境与配置下运行测试;覆盖各种边界情况。只有在完成这些验证后,才能宣布问题解决。

代码一致性(Code Consistency)

保持与现有代码库一致的风格、模式和做法。了解项目的命名规范、格式偏好与架构模式,并在实现新功能或修复时遵循这些规则。沿用既有的错误处理策略、日志方式与测试方法,保持可读性与可维护性,降低其他开发者的理解成本。

渐进式增强(Progressive Enhancement)

添加新功能时,应在现有架构上逐步扩展,而非引入完全不同的范式。识别当前设计中的扩展点并利用它们。保持向后兼容,确保现有功能不受影响。记录新功能如何与既有系统整合,以便后续维护。

文档与说明(Documentation and Explanation)

提供清晰、简洁的变更说明。不仅说明做了什么,更要解释为什么以及它如何运作。记录解决方案依赖的前提与假设,处理复杂逻辑或不直观实现时在代码中加入注释。若建议架构调整,最好配合图示或高阶说明帮助理解影响范围。

技术债意识(Technical Debt Awareness)

识别可能引入技术债的解决方案,并如实说明权衡。如果时间紧迫只能采用权宜之计,要明确指出哪些部分未来应重构。区分"临时补丁"与"长期方案",根据场景推荐合适路径。无法避免技术债时,请做好记录,方便后续修正。

学习与适应(Learning and Adaptation)

持续适应项目的特定模式与偏好。关注以往建议收到的反馈,将经验融入后续提案。逐步建立对应用架构的心智模型,记住过去的问题与解决办法,避免重蹈覆辙。努力理解驱动技术决策的业务需求。

避免重复组件(Preventing Duplicate Components)

在创建新页面、组件或流程前,先全面盘点代码库现有元素。通过关键词与文件模式查找类似功能。优先复用或扩展已有组件,而非重复造轮子。若确需类似功能,可考虑抽象成可复用组件,通过不同数据或配置实现差异,贯彻 DRY 原则。

清理死代码(Dead Code Elimination)

主动识别并移除未使用的代码,避免堆积。替换功能时要彻底删除旧实现,而非简单注释或与新代码并存。删除前检查引用,确认不再被使用。必要时利用依赖分析工具确保代码确实无用。重构过程中跟踪弃用方法,确保彻底移除。定期扫描孤立组件、未使用的 import、注释块与不可达分支。删除时说明理由,并确认不存在隐含依赖。保持代码库整洁,优先清除不再执行的路径。

保护已运行功能(Preserving Working Features)

把已正常运行的功能视作"锁定系统",需要明确许可才修改。在提出改动前,先界定其边界与依赖。没有明确指示,切勿移除或大幅调整现有功能。一个区域出错时,不要"顺便"改动无关但运行良好的部分。清楚区分稳定区域与开发中区域。改动共享组件时,确保所有依赖的功能仍正常。通过详尽记录跨功能依赖,为可能影响它们的改动建立防护。在建议更改稳定功能前,务必再次确认需求。

深度问题解决思维(Deep Problem-Solving Approach)

面对复杂错误时,不要急于套用老办法。退一步,从多个角度审视问题,考虑截然不同的解决路径。在推荐方案前,至少列出三种备选方案,并写明各自优缺点。质疑最初对问题根因的假设,尤其是标准修复无效时。不要忽视非常规原因,例如环境配置、外部依赖或竞态条件。尝试反向思考:与其问"为什么不工作?",不如问"在什么情况下它会这样工作?"把复杂问题拆成可单独验证的模块。使用日志、断点、状态追踪等手段收集更多信息。面对特别棘手的问题时,可以把尝试性修复当作学习手段,而非终极方案。

数据库查询验证(Database Query Verification)

在提出任何查询或 schema 调整前,先确认当前数据库状态。检查现有表、字段与关系,避免重复创建已有元素。建议查询前先找找是否已有类似查询可复用。审阅既有数据模型、迁移文件与 schema 定义,确保对数据库结构理解准确。若建议新建表,需明确说明为何不能复用旧表,并确认确实不存在同名表。添加字段时,确保没有功能相同但命名不同的字段。考虑查询性能并提供优化方案。始终在现有数据库架构的语境下提出建议,而非孤立地给出 SQL。

UI 一致性与主题(UI Consistency and Theming)

严格遵循既定设计系统与配色。在创建新 UI 组件前,先研究现有组件的视觉语言、间距模式、交互模型与主题风格。优先复用既有组件模式,而非创造新的视觉变体。颜色、字体、间距等设计 Token 应从现有代码中提取,避免随意引入新值。确保在 hover、active、disabled、error 等状态下表现一致。实现新布局时,遵循既定的响应式模式。提出 UI 改进时,应在不破坏整体协调性的前提下增强视觉效果。全程保持可访问性标准,包括色彩对比、键盘导航与屏幕阅读器支持。记录组件变体及其使用场景,确保一致运用。引入新视觉元素时,需说明它如何与现有设计系统协同,而非独立存在。

系统化调试方法(Systematic Debugging Approach)

遇到错误时,采取科学的调试方法,而非随机修改。先在可控环境下复现问题,收集完整数据:控制台日志、网络请求、组件状态、错误消息。提出多种假设并逐一验证。缩小问题范围,定位受影响组件与触发条件。记录调试过程与发现,便于日后参考。善用浏览器开发者工具、React DevTools 及代码级调试技术。在确认解决方案前,确保它完全解决问题且不会引入新的故障。

类型安全与数据校验(Type Safety and Data Validation)

在实现功能前,充分了解数据库 schema 与 TypeScript 接口的类型定义。始终保持严格的类型检查,避免使用 any 作为退路。数据转换过程中,每一步都要验证类型安全。关注常见类型错配,例如数据库数字以字符串形式返回、日期解析需求、可空字段处理。保持数据库字段与 TypeScript 接口的一致命名。记录复杂类型关系与特殊处理要求。使用真实数据形态测试,验证边界情况,尤其是 null/undefined。出现错误时,沿着数据转换链追踪类型偏差位置,并提出保持类型安全的修复方式。

数据流管理(Data Flow Management)

把数据流想象成从数据库到 API、状态,再到 UI 的完整管道。实现功能时,仔细跟踪数据在各阶段的转换。合理设置查询失效策略,保持 UI 与数据库状态同步。在关键节点加入日志,监控数据传递。建立数据应如何随操作更新的清晰心智模型。关注缓存策略与潜在的陈旧数据问题。排查数据流问题时,按顺序追踪数据从源到目的地的旅程,检查时序、竞态与转换错误。确认最终传给组件的数据形态符合预期。实现稳健的错误边界与加载状态管理,保持 UI 稳定。

性能优化(Performance Optimization)

主动监控应用性能,而不是等问题严重再处理。审查查询缓存策略,减少不必要的数据库访问。通过适当的 memo 与依赖管理,消除不必要的组件重新渲染。分析数据获取模式,避免 N+1 查询、串行请求或重复请求。长列表使用虚拟化并分页加载。通过代码拆分与懒加载优化打包体积。压缩与优化包括图片在内的静态资源。使用 React DevTools、Performance 面板、Network 面板、Memory Profiler 等工具定位瓶颈。关注真正影响用户体验的指标,如加载时间、可交互时间、界面响应速度。针对性优化,避免过早优化。

错误管理与韧性(Error Management and Resilience)

建立全面的错误处理策略,既要保证应用稳定,又要提供有意义的反馈。在可能出错的代码段使用恰当的 try/catch。设置分层错误边界,让问题局限在特定组件内,不至于拖垮整站。设计优雅降级方案,即使数据有限也能继续运行。提供清晰、易懂的错误提示,避免过多术语。实现恢复机制,如重试逻辑、回退方案和状态重置。保持强健的错误日志,捕获足够的上下文,同时注意隐私。充分测试错误场景,确保恢复机制有效。提出解决方案时,要解决根因而非掩盖症状,并确认在所有相关环境和边界情况下都有效。

组件架构(Component Architecture)

设计组件时,需明确组件层级与职责。像看家谱一样理解组件的父子关系。适时使用 Context 或状态管理,减少 props 逐层传递。明确区分容器(智能)组件与展示(哑)组件。建立一致的组件通信模式,包括父子、兄弟之间的交互。调试组件问题时,分析完整的组件树、props 传递、状态位置与事件绑定。让组件保持单一职责与清晰接口。记录组件依赖关系,方便维护。必要时使用 memo、懒加载、代码拆分等优化性能。保持组件可复用与专用之间的平衡,避免重复实现或过度抽象。

API 集成与网络管理(API Integration and Network Management)

整合 API 时,应全面考虑请求、响应与错误处理。核对每个请求的认证头、参数、请求体格式。为所有网络操作实现适当的错误处理,并针对不同错误类型提供特定分支。确保请求负载、预期响应与应用状态之间类型一致。正确配置 CORS,并验证在所有环境下生效。为瞬时失败设置智能重试机制(例如指数退避)。考虑速率限制,适当实现节流。通过战略性缓存减少服务器负载、提升性能。监测网络表现,包括请求耗时与载荷体积。针对理想路径与各种失败场景进行测试。维护清晰的 API 文档,记录端点目的、参数与响应格式,方便未来开发与调试。

免责声明

本文由 Codex 自动化翻译与整理,使用的提示词为:“将原文用中文重写,尊重原意的前提下通俗易懂”。

On this page

调试提示指南(Prompting Debugging)高阶调试提示(Advanced Debugging Prompts)全面系统审查(Full System Review / Codebase Audit)易碎场景的安全策略(Safe Approach for Fragile Updates)性能优化检查(Performance Optimization Check)处理顽固错误(Handling Persistent Errors)示例调试流程(Sample Debugging Flows)"陷入错误循环""功能无法正常工作""UI 元素消失"根因分析、回滚与渐进增强(Root Cause Analysis, Rollback, and Progressive Enhancement)关注根因,而非症状明智回滚渐进增强(Progressive Enhancement)及时记录需要时求助真人社区调试手册(Community Debugging Guidebook)错误修复(Error Fixing)代码修改方式(Code Modification Approach)数据库集成(Database Integration)全面问题分析(Thorough Issue Analysis)解决方案验证(Solution Verification)代码一致性(Code Consistency)渐进式增强(Progressive Enhancement)文档与说明(Documentation and Explanation)技术债意识(Technical Debt Awareness)学习与适应(Learning and Adaptation)避免重复组件(Preventing Duplicate Components)清理死代码(Dead Code Elimination)保护已运行功能(Preserving Working Features)深度问题解决思维(Deep Problem-Solving Approach)数据库查询验证(Database Query Verification)UI 一致性与主题(UI Consistency and Theming)系统化调试方法(Systematic Debugging Approach)类型安全与数据校验(Type Safety and Data Validation)数据流管理(Data Flow Management)性能优化(Performance Optimization)错误管理与韧性(Error Management and Resilience)组件架构(Component Architecture)API 集成与网络管理(API Integration and Network Management)免责声明