如何在使用 "dotnet run" 时调试 .NET Core 控制台应用程序

9

我正在开发一个自定义的dotnet cli工具,如此处所述。我已经开始使用它,并可以使用 dotnet run 运行我的控制台应用程序,但在尝试调试时,它会直接跳过我的断点。从VS运行时它是有效的,但我想能够尝试通过传递各种参数来玩耍,而从应用程序参数框中进行操作并不实用。您有什么想法?


你应该能够附加调试器到现有的.NET进程上,或者如果时间紧迫,可以使用 Debugger.Launch https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.debugger.launch?view=netcore-3.1。 - Matthew
你的工具仍然是一个控制台应用程序。你可以像调试其他控制台应用程序一样,直接从你的IDE(无论是VS、VS Code还是Rider)进行调试。你可以在“Debug”项目属性页面中传递任何想要的参数。 - Panagiotis Kanavos
1
通过调试器(例如 Visual Studio)启动应用程序进行调试仍然是最好的方法。是的,通过项目属性更改参数有点烦人,但这仍然是正确的做法。如果您觉得这更容易使用,请查看通过项目属性修改的 launchSettings.json 并在其中直接更改参数。 - poke
2个回答

6
您有多种选择:
  1. Debugger.Launch 这是一个函数,它将弹出一个窗口,您可以在其中附加 Visual Studio 调试器。请参阅:Debugger.Launch。这有一个理论上的缺点(不适用于您),即它只能在 Visual Studio 中使用,例如在 Rider 中无法使用,因为 API 不开放。(但是,在此窗口弹出时,您可以将 Rider 附加到进程中)

  2. 在程序的前几秒钟等待。您可以向 cli 传递一个参数,指示它应该等待 x 秒钟,以便您可以附加调试器。

public static void Main(string[] args)
{
    if(args[0] == "waitfordebugger")
    {
        Thread.Sleep(10000); // Wait 10 Seconds
    }

    // Do stuff here

然后,您可以这样调用程序:dotnet run -- waitfordebugger


1
这两者都意味着更改正在调试的应用程序,但这可能会产生不必要的副作用。 - poke
这个问题不仅适用于控制台项目,还适用于其他项目吗?我正在运行一个API,但在断点处没有任何反应。我在 Startup.cs 中添加了 Debugger.Launch() 并使用标志 dotnet run --waitfordebugger 执行。然而,没有触发断点。日志告诉我已经通过了该位置,但是VS没有任何橙色闪烁的提示。连接到进程是唯一的解决方法吗?不确定如何做到这一点... - Konrad Viltersten
以上内容有误。我知道如何附加到进程,这是显而易见的。我的意思是,我想在不像疯狂地浏览所有进程列表一样的情况下完成操作。我想要附加到“正确”的进程。 - Konrad Viltersten

3

就我所知,不幸的是最好的方法是将它们作为参数传递。

您可以通过在Visual Studio中单击Run按钮旁边的箭头并选择“项目调试属性”来执行此操作。从那里,您可以转到“应用程序参数”并输入要传递的参数。例如,像--list all这样的内容会传递一个长度为两个的数组,其中索引0是--list,索引1是all

如果有人想出一种更少侵入性的方法,请告诉我!

编辑:您也可以使用dotnet run从命令提示符/ PowerShell执行,并在VS中附加到相关进程(调试>附加到进程)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接