【问题标题】:How to debug a C# command-line program如何调试 C# 命令行程序
【发布时间】:2010-09-04 22:38:08
【问题描述】:

我正在尝试使用 VS2010 用 C# 构建一个命令行工具。

我的问题是:我该如何调试它,就像我调试 winforms 一样。
使用 winforms,我可以单步执行代码,查看每个单独步骤的值,等等...

然而,程序只有在我从命令行与其交谈时才会响应。我无法启动调试会话,因为这将首先完全启动程序。而且由于程序的性质,它会因为没有命令行参数而自行关闭。

因此无法进行调试。

我需要在这里做什么?

编辑:一个例子,因为有人发表的评论让我觉得需要这个解释。

C:\Path\To\File\file.exe -帮助

这是如何处理该程序的示例。命令 -help 在程序启动的同一行中给出。换句话说,我不能先启动程序,然后在它运行时给它一个命令……因为它不会再运行了。它会启动,看到它在启动时没有参数,因此关闭。这就是命令行工具的工作原理。

  1. 激活
  2. 处理可能的参数
  3. 输出结果
  4. 自动关机

它不会一直运行,直到您单击右上角的小 x。

【问题讨论】:

标签: c# debugging command-line


【解决方案1】:

在项目属性的调试下,可以输入任何你想要的命令行参数,然后按F5运行应用程序,调试器将自动附加。

【讨论】:

  • 如果您已经在调试,它们会灰显。如果下拉 Debug 菜单,是否启用了“Stop Debugging”?如果是的话,选择它,然后你就可以正常设置命令行参数了。
【解决方案2】:

您可以在您的启动代码中添加对Debugger.Launch 的调用。然后您可以编译并从命令行启动您的应用程序。您将收到一个提示,询问您要附加哪个调试器(通常这将是您已安装的不同版本的 Visual Studio 的列表),然后您就可以离开了。

(但实际上,在大多数情况下,在项目属性 > 调试选项卡中设置命令行参数是更好的方法。如果这对您不起作用,您应该找出原因。)

【讨论】:

  • System.Diagnostics.Debugger.Break() 也有类似的效果。
  • 不,它没有。 Debugger.Break() 仅向附加调试器发出断点信号,而 Debugger.Launch() 启动并附加调试器到进程。
【解决方案3】:

一旦使用正确的参数,您可以使用 Visual Studio 将调试器附加到命令行应用程序。我不确定您的应用程序是否会快速终止或给您任何附加调试器的机会,但如果可以,这应该可以。

我正在使用 VS2008,但我敢打赌这个过程在 2010 年是相似的:

  1. 在 VS 中,转到 Tools 并单击 Attach to Process
  2. 从列表中选择您的应用程序并按Attach

现在 VS 应该能够进入您的应用程序并在出现错误时中断。

【讨论】:

  • 在这种情况下不太可能。命令行应用程序将启动和关闭如此之快,以至于他没有机会以这种方式附加到它。上面的建议要好得多。
  • 是的。我只是希望可能会有一个阻塞输入,这将使他们有机会附加调试器。但是,由于它接受命令行参数,我认为这不太可能。
  • 如果他有源代码,他可以很容易地插入Console.Readline 来暂停程序足够长的时间以便他附加调试器。然后按一个键,就开始比赛了。在我看来,这不值得一票否决,只需进行微不足道的单行更改即可完美运行。
【解决方案4】:

您只需要在主函数的第一行添加一个断点(您可以通过在 Visual Studio 编辑器中单击该行并按 F9 来执行此操作)并按 F5 启动调试会话。

【讨论】:

  • 或者你可以直接进入程序,不需要显式设置断点。
  • 这就是我最初所做的。我再说一遍:这是一个需要命令行参数的程序。我不能给它输入多次。它在 1 次运行后关闭。命令的发出和程序的启动是同时进行的,这是命令行程序的本质所固有的。我会在主帖中举个例子
【解决方案5】:

要么在{Main 的开头添加断点,要么进入程序(调试菜单)。此时,通过选择它并右键单击/添加观察或将参数拖动到观察窗口(如果它已经打开)来设置主要参数(命令行参数)的观察。双击 Watch 窗口中的 Value 列并将其设置为您想要的任何值。

注意:添加的值必须是有效代码——也就是说,要向字符串 [] 添加 -help,您必须根据版本键入 new string[] {"-help"}new [] {"-help"}你正在使用。

这比在“属性”窗口的“调试”选项卡中设置参数的优势在于,每次运行都允许使用不同的参数,而无需返回“属性”窗口。

【讨论】:

    【解决方案6】:

    当您有命令行参数时,您需要按照不同的路线进行调试。转到项目,然后选择属性。在那里您将看到调试部分,然后提供所需的参数。这样它将负责将参数传递给程序。如果您有多个参数,请用空格分隔它们。之后如果你调试它会直接到达断点。欲了解更多信息,请点击此处how to debug c# through command line arguments in visual studio

    【讨论】:

    • 请先阅读其他答案。这已经回答了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2011-06-27
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多