如何调试 MSBuild Customtask

问题描述 投票:0回答:4

我正在尝试调试我刚刚创建的 MSBuild Customtask,但由于某种原因它永远不会在断点处停止。我什至尝试过这个:

    public override bool Execute()
    {
        System.Diagnostics.Debugger.Break();

并在那一行添加了一个断点...我什至消除了该方法中的所有其他代码,但这没有改变任何东西。

为了能够调试 MSBuild 自定义任务的创建,有什么特殊要求吗?

debugging msbuild
4个回答
39
投票

这有点麻烦,但你总是可以将这行代码放在你想要开始调试的任何地方:

System.Diagnostics.Debugger.Launch();

当您调用它时,CLR 将启动一个对话框,询问您要附加哪个调试器。


10
投票

这就是我所做的...在“调试”选项卡上的“项目属性”对话框中选择“启动外部应用程序” - 将 C:\WINDOWS\Microsoft.NET\Framework 2.0.50727\MSBuild.exe 放入框中..

然后在命令行参数中,输入你的参数 /Target:Whatever test.proj

在您的自定义任务中放置代码停止并启动应用程序..


4
投票

您可以设置环境变量

MSBUILDDEBUGONSTART=1
,使
MSBuild.exe
提示在应用程序启动时启动调试器。

然后,您可以选择用于开发任务的 Visual Studio 实例作为调试器,并在任务代码中设置断点。

这通常比修改任务来调用

Debugger.Launch()
更困难一些,但它可以在发布版本上使用并且无需修改任务,这可能很有用。

这里有一个主要警告:当您使用

-m
进行构建时,MSBuild 将启动多个进程,并且 每个进程 都会提示附加调试器。尝试使用
-m:1
进行构建或在执行此操作时构建单个项目,这样您就不会意外生成数十个想要调试的进程。


0
投票

为了调试自定义任务,您需要将调试器附加到 MSBuild(或 dotnet build)进程。

我发现一篇文章解释了为什么

System.Diagnostics.Debugger.Launch();
不起作用。

您可以采取的解决方法是使用

SpinWait.SpinUntil(() => Debugger.IsAttached);

当您构建使用自定义任务的项目时,只有附加了调试器才会继续构建。此时,您的断点将能够被命中,您可以单步执行任务。

我从这篇文章中找到了这一点:实现和调试自定义 MSBuild 任务

向作者致以崇高的敬意;因为这让我卡住了很长一段时间。

© www.soinside.com 2019 - 2024. All rights reserved.