通过


诊断 MSBuild 任务故障

当 MSBuild 任务 ToolTask(一个派生类)运行工具进程(如果任务未记录更具体的错误,则会返回非零退出代码)时,会发出 MSB6006

确定失败的任务

遇到任务错误时,第一步是标识失败的任务。

错误的文本指定工具名称(任务实现 ToolName 提供的友好名称或可执行文件的名称)和数字退出代码。 例如,error MSB6006: "custom tool" exited with code 1.中的工具名称是custom tool,退出代码是1

若要查找失败的 MSBuild 任务,

  • 在命令行生成中:如果生成配置为包含摘要(默认值),摘要如下所示:

    Build FAILED.
    
    "S:\MSB6006_demo\MSB6006_demo.csproj" (default target) (1) ->
    (InvokeToolTask target) ->
      S:\MSB6006_demo\MSB6006_demo.csproj(19,5): error MSB6006: "custom tool" exited with code 1.
    

    此结果表明错误发生在文件 S:\MSB6006_demo\MSB6006_demo.csproj 第 19 行定义的任务中,该任务位于项目 S:\MSB6006_demo\MSB6006_demo.csproj 中名为 InvokeToolTask 的目标内。

  • Visual Studio UI 中:相同的信息可以在 ProjectFileLine 列的 Visual Studio 错误列表中找到。

查找更多失败信息

当任务未记录特定错误时,将发出错误MSB6006。 未能记录错误通常是因为任务未配置为识别它调用的工具所生成的错误格式。

行为良好的工具通常将其标准输出或错误流发出一些上下文或错误信息,默认情况下任务捕获和记录此信息。 在错误发生之前查找日志条目以获取其他信息。 若要保留此信息,可能需要重新运行具有更高日志级别的生成。 希望日志记录中确定的其他上下文或错误揭示了问题的根本原因。 否则,您可能需要通过检查导致任务失败的输入的属性和项目来缩小可能原因。

注释

MSBuild 可识别特定的诊断输出格式。 此格式的详细信息记录在 与 MSBuild 和 Visual Studio 相关的诊断消息格式

调试任务

调试 MSBuild 任务时,下面是一些常规提示。

  • 尽可能缩小重现案例的范围(例如,通过设置 /p:BuildProjectReferences=false 和启动具有一个特定项目或一个特定目标的 MSBuild),以减少要使用的代码。
  • 使用 MSBuild 命令行选项 /m:1 可以调试单个 MSBuild 进程。
  • 将环境变量 MSBUILDDEBUGONSTART 设置为 1,以在启动时将调试器附加到 MSBuild。
  • 在任务的 Execute 方法处设置断点,以逐步完成任务。

调试自定义任务

如果要为自定义任务编写代码,可以在任务的 Execute 方法中通过添加调用调试器的函数来更轻松地进行调试。 可以使用环境变量检查来隔离该代码,以便在用户设置该环境变量时,任务停止并为用户提供调试的机会。 可以使用 System.Diagnostics.Debugger.LaunchSystem.Diagnostics.Debugger.Break 在调试器中进行启动或中断。

应确保在自定义任务中添加尽可能多的日志记录,以使用户更轻松地调试该任务。 当你最终确定失败的根本情况时,这一点很重要;添加足够的日志记录代码来检测和报告将来的故障模式。

请考虑使用 xUnit 为任务设置测试环境。 请参阅 使用 dotnet test 和 xUnit 在 .NET Core 中测试 C# 的单元测试。 可以将 xUnit 测试配置为使用 MSBuild API 以编程方式调用 MSBuild,并使用包含所需属性、项和目标的模拟项目文件来执行相应的任务。 在某些情况下,创建模拟生成引擎可能很有意义。 您可以在使用 Visual Studio 为自定义 MSBuild 任务编写单元测试时查看一个示例。

在 .NET SDK 项目中,还可以修改 launchSettings.json 以添加一个特殊的调试配置文件,该配置文件使用本文前面提到的命令行参数和环境变量运行 MSBuild.exe

"profiles": {
  "Debug Build": {
    "commandName": "Executable",
    "executablePath": "$(MSBuildBinPath)\\MSBuild.exe",
    "commandLineArgs": "/p:Configuration=$(Configuration) $(ProjectFileName) /m:1",
    "workingDirectory": "$(ProjectDir)"
  }
}

如果要在运行时提示附加自己的调试器,请将环境变量 MSBUILDDEBUGONSTART 设置为 2。 当您使用不同的调试器(例如在 macOS 上无法使用 Visual Studio 时)时,这可能会非常有帮助。