Skip to content

调试和诊断

完整的调试和诊断指南,帮助你快速定位和解决源生成器问题

📋 文档信息

难度级别: 中级
预计阅读时间: 15 分钟
前置知识:

  • 源生成器基础
  • C# 调试基础
  • Visual Studio 或 VS Code 使用

🎯 学习目标

学完本章节后,你将能够:

  • 使用多种方法调试源生成器
  • 分析和优化生成器性能
  • 快速诊断和解决常见问题
  • 使用系统化的故障排除方法

📚 快速导航

主题说明难度
调试技巧交互式调试、日志记录、单元测试⭐⭐
性能分析性能测量、优化策略、基准测试⭐⭐⭐
故障排除常见问题、系统化排查、FAQ⭐⭐

💡 核心概念

调试策略

源生成器的调试与普通应用程序不同,需要特殊的技巧:

  1. 交互式调试: 使用 Debugger.Launch() 附加调试器
  2. 文件输出: 启用 EmitCompilerGeneratedFiles 查看生成的代码
  3. 日志记录: 使用文件日志记录执行过程
  4. 单元测试: 在测试环境中调试生成器

性能分析

性能问题是源生成器开发中的常见挑战:

  1. 测量执行时间: 使用 Stopwatch 测量关键操作
  2. 识别瓶颈: 找出耗时最多的操作
  3. 优化策略: 使用增量生成器、缓存、早期过滤
  4. 基准测试: 使用 BenchmarkDotNet 进行性能测试

故障排除

系统化的故障排除方法可以快速定位问题:

  1. 检查配置: 验证项目引用和生成器配置
  2. 查看输出: 检查编译输出和生成的文件
  3. 使用诊断: 报告详细的诊断信息
  4. 参考 FAQ: 查看常见问题的解决方案

🚀 快速开始

基本调试设置

csharp
[Generator]
public class MyGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        #if DEBUG
        // 启动调试器
        if (!System.Diagnostics.Debugger.IsAttached)
        {
            System.Diagnostics.Debugger.Launch();
        }
        #endif
        
        // 生成器逻辑...
    }
}

启用生成文件输出

xml
<PropertyGroup>
  <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
  <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GeneratedFiles</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

添加性能测量

csharp
var sw = Stopwatch.StartNew();
// 执行操作
sw.Stop();
if (sw.ElapsedMilliseconds > 100)
{
    Debug.WriteLine($"Slow operation: {sw.ElapsedMilliseconds}ms");
}

📖 详细内容

调试技巧

学习如何使用各种调试技术:

  • 使用 Debugger.Launch() 进行交互式调试
  • 查看生成的文件
  • 使用日志文件记录执行过程
  • 在单元测试中调试
  • 使用诊断分析器

性能分析

掌握性能分析和优化方法:

  • 测量执行时间
  • 识别性能瓶颈
  • 优化策略和技巧
  • 使用 BenchmarkDotNet 进行基准测试
  • 性能监控和报告

故障排除

系统化的故障排除指南:

  • 常见错误和解决方案
  • 系统化排查方法
  • 诊断命令速查
  • 常见问题 FAQ
  • 调试清单

🔗 相关资源

API 文档

示例

工具

💡 关键要点

  1. 使用 Debugger.Launch() 进行交互式调试
  2. 启用 EmitCompilerGeneratedFiles 查看生成的代码
  3. 使用日志文件 记录执行过程
  4. 编写单元测试 在测试环境中调试
  5. 测量性能 识别和优化瓶颈
  6. 系统化排查 使用清单和 FAQ
  7. 报告诊断 而不是抛出异常
  8. 持续监控 性能和错误

📝 下一步


最后更新: 2025-01-21

基于 MIT 许可发布