Blazor WebAssembly 调试依赖 Mono 运行时就绪事件 mono_wasm_runtime_ready 启动 DevToolsProxy 与 Chrome 的 WebSocket 连接,断点需 PDB 符号支持,变量求值通过 Roslyn 动态编译执行,排查需检查 script 标签、本地协议、WebSocket 连接及 C# 扩展配置。
Blazor WebAssembly 可以像普通前端应用一样在浏览器中调试,但因为运行在 Mono WebAssembly 运行时上,它需要额外的调试代理支持。关键在于让浏览器 DevTools 能和 .NET 运行时通信——这靠的是 DevToolsProxy 和 MonoProxy 协同工作。
Blazor WebAssembly 调试依赖 Mono 运行时完成初始化后才可启动。调试器会监听一个特殊事件:
MonoConstants.RUNTIME_IS_READY 的值,表示 WASM 运行时已加载完毕、JIT/AOT 准备就绪DevToolsProxy 才会建立与 Chrome DevTools 的 WebSocket 连接(ideSocket)并开始转发调试消息undefined,优先检查控制台是否输出了 mono_wasm_runtime_ready 日志断点实际分两层解析:
.razor 或 .cs 文件中点击左侧设的断点,会被映射到源码对应的 序列点(Sequence Point)
DebugStore 模块负责维护所有源文件、方法符号和作用域信息;TryResolve() 方法会尝试匹配断点位置是否落在某个已知序列点上dotnet build 未启用调试信息(检查项目是否含 portable )、或代码被修剪(trimmer 移除了调试元数据)变量监视和“控制台中执行 C# 表达式”功能由 EvaluateExpression 模块实现,流程如下:
user.Name 或 DateTime.Now.ToString())后,调试器用 Roslyn 解析语法树user.Name = "test"),也不支持 await —— 因为是同步求值,且无上下文捕获如果 F5 启动没反应、断点不命中、调用栈为空,可按顺序检查:
index.html 中的 Blazor 标签没有加 autostart="false"(除非你手动调用 Blazor.start())https://localhost:xxx 或 http://localhost:xxx —— HTTP/HTTPS 非本地回环地址可能被安全策略阻止调试连接ws,看是否有两个 WebSocket 连接成功:一个连向 devtools(前端),一个连向 mono(后端).vscode/launch.json 配置指向 browser 类型启动器基本上就这些。Blazor WebAssembly 调试不是黑盒,而是基于标准协议(CDP)+ Mono 调试接口的一套透明链路,理清代理、作用域、表达式三者的协作关系,大
