SuperAPI AI 工具集

umbraco-debugging

编程与开发

查看项目

更新于 10-22 05:17

技能介绍

用途

本技能解决 Umbraco 17 网站调试中的两类问题,并提供两种对应方法:

  • 方法 A(Source Link):回答“Umbraco 在这段调用内部做了什么、为什么”。让调试器加载 Umbraco 发布的 PDB,并从 GitHub 下载匹配源码,从而在 Umbraco 代码中设断点、按 F11 从自有代码进入 IContentService 等内部方法。
  • 方法 B(Debug 模式 + MiniProfiler / IProfiler):回答“这个页面为什么慢、慢在哪一步”。在浏览器中查看一次请求在自有代码、Umbraco 代码和 SQL 上的耗时分布,无需附加调试器。

两者常配合使用:用 B 在共享的开发、测试或预发布环境找到慢步骤,再在本地用 A 复现并单步进入。方法 A 在开发者本机 IDE 中运行,方法 B 在任意非生产环境的浏览器中运行。

主要能力

  • 方法 A:通过 Source Link 与 NuGet.org 符号服务器加载 Umbraco 的 PDB 和源码,支持在 Umbraco 自身代码中设断点与单步进入。只需更改 IDE 设置(Source Link、符号服务器、Just My Code、JIT),不修改项目。附带资产 assets/SourceLinkProbe.cs(F11 目标示例)和 assets/vscode-launch.json。
  • 方法 B:在环境配置中设置 Umbraco:CMS:Hosting:Debug,并可选在代码中加入 IProfiler.Step 调用,以分段记录耗时。附带资产 assets/ProfiledController.cs(嵌套 IProfiler 步骤示例)。

采用任一方法前,应先打开对应参考文档(approach-a-sourcelink.md 或 approach-b-debug-mode-profiler.md),并从其中的资产开始,因为各 IDE 的具体设置名称、Source Link 依赖的符号服务器以及性能分析的启用条件只在这些文档中说明。

使用方式

  • 选择方法:若用户想查看 Umbraco 方法内部(在 Umbraco 代码中设断点、从自有代码 F11 进入 IContentService、“符号未加载”、希望阅读真实源码而非反编译代码),使用方法 A;若用户想知道时间花在哪里,或需要在无人能附加调试器的共享开发、测试、预发布站点上取证,使用方法 B。
  • 若需求模糊(如“帮我调试这个 Umbraco 站点”),应先询问用户需要哪一种,再改动任何内容。
  • 若两种都适用,应分别完整给出两部分,说明各自运行位置(A 在开发者机器,B 在非生产环境),并遵循各自参考文档中的回复清单。

版本与兼容性

  • 面向 Umbraco 17(net10.0)。Umbraco 包使用 Source Link 构建,但主 .nupkg 不含 PDB,符号以独立 .snupkg 发布在 NuGet.org,因此调试器除 Source Link 支持外还需 NuGet.org 符号服务器。
  • IComponent 在 17 中已废弃(计划在 18 移除),应改用通知处理器或 IAsyncComponent,探针资产即如此实现。

最佳实践与限制

  • 切勿在生产环境将 Umbraco:CMS:Hosting:Debug 设为 true,包括通过环境变量或应用设置“临时”开启,也不得放入所有环境继承的基础 appsettings.json。启动性能分析没有登录检查,线上站点任何访问者都可能通过 ?umbDebug=true 触发。应放在 appsettings.Development.json 或特定非生产环境配置中,并在那里复现生产问题。
  • 修改 Hosting:Debug 后需重启;该值在启动时读取一次以选择 profiler,运行时更改配置不会开关 MiniProfiler。
  • 不要为了单步进入而把 Umbraco 的 NuGet 包替换为项目引用或克隆 Umbraco 仓库;Source Link 获取的是 PDB 对应的确切提交,本地克隆是不同版本和构建。
  • Just My Code、Source Link 和符号服务器是开发者本机的 IDE 设置,不应写入 .csproj、Directory.Build.props 或提交的配置。
  • IProfiler.Step 调用可以保留在代码中;启动时若调试模式关闭,Umbraco 注册的 NoopProfiler 的 Step 返回共享的空操作 disposable,因此基本无开销。
  • 应如实说明实际执行了什么:配置 IDE 是用户的操作;未真正单步进入 Umbraco、加载符号、看到 MiniProfiler 结果或构建项目时,不得声称已完成,而应说明用户该做什么、应看到什么。

验证

断言位于 evals/evals.json,可用 umbraco-skill-evaluator 运行;evals/README.md 包含夹具、运行说明以及 Haiku 和 Sonnet 在有/无技能情况下的结果。运行时覆盖:方法 A 的 assets/SourceLinkProbe.cs 在 examples/approach-a-sourcelink-probe/ 中有断言(Clean host);assets/vscode-launch.json 属于 IDE 配置,仅作文档说明;方法 B 的 assets/ProfiledController.cs 在 examples/approach-b-profiler/ 中有断言。该门禁只能证明资产在固定版本 Umbraco 上可编译运行,无法证明某用户的 IDE 已加载符号或 MiniProfiler 已渲染,这些仍需人工检查。

适用场景

适用于 Umbraco 17 网站开发过程中的本地深度调试(方法 A)和非生产环境的性能分析与取证(方法 B),尤其适合需要定位框架内部行为或页面性能瓶颈的开发者。不涉及生产环境调试,也不提供自动化修复流程。