Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调试C#命令行程序_C#_Debugging_Command Line - Fatal编程技术网

如何调试C#命令行程序

如何调试C#命令行程序,c#,debugging,command-line,C#,Debugging,Command Line,我正试图用VS2010在C#中构建一个命令行工具 我的问题是:如何像调试winforms一样调试它。 使用winforms,我可以逐步完成代码,查看每个步骤的值,等等 然而,在这里,程序只有在我从命令行与它对话时才会响应。我无法启动调试会话,因为这将首先完全启动程序。由于程序的性质,它会自动关闭,因为没有命令行参数 因此,无法进行调试 我需要在这里做什么 编辑:一个例子,因为有人做了一个评论,让我觉得这个解释是必要的 C:\Path\To\File\File.exe-帮助 这是一个如何处理这个程

我正试图用VS2010在C#中构建一个命令行工具

我的问题是:如何像调试winforms一样调试它。
使用winforms,我可以逐步完成代码,查看每个步骤的值,等等

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

因此,无法进行调试

我需要在这里做什么

编辑:一个例子,因为有人做了一个评论,让我觉得这个解释是必要的

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

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

  • 激活
  • 处理可能的参数
  • 输出结果
  • 自动关机

  • 在您单击右上角的小x之前,它不会一直运行。

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

    我使用的是VS2008,但我敢打赌2010年的过程与之类似:

  • 在VS中,转到
    工具
    并单击
    附加到流程
  • 从列表中选择您的应用程序,然后按
    Attach

  • 现在VS应该可以在你的应用程序中进行欺骗,并在出现错误时中断。

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

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

    可以向
    Main
    的开头添加断点,或者进入程序(调试菜单)。在该点上,为Main(命令行参数)的参数设置一个监视通过选择该参数,然后右键单击/添加监视,或者如果该参数已打开,则将其拖动到“监视”窗口。双击“监视”窗口中的“值”列,并将其设置为所需的值

    注意:添加的值必须是有效的代码——也就是说,要向字符串[]添加-help,您必须键入
    新字符串[]{“-help”}
    新[]{“-help”}
    ,具体取决于您使用的版本

    与在“属性”窗口的“调试”选项卡中设置参数相比,这种方法的优点是允许每次运行使用不同的参数,而无需返回“属性”窗口。

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


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

    当您有命令行参数时,您需要按照不同的路径进行调试。转到project,然后选择properties。在那里您将看到debug部分,然后给出所需的参数。这样它将负责向程序传递参数。如果您有多个参数,则用空格分隔它们。之后,如果调试它将直接到达断点。有关更多信息,请查看此处

    ,或者您可以直接进入程序,无需显式设置断点。这是我最初所做的。我重复:这是一个需要从命令行输入参数的程序。我不能多次给它输入。它在运行1次后关闭。发出命令和程序的启动是同步的,这是命令行程序固有的特性。我将在主要帖子中举一个例子,在这种情况下不太可能。命令行应用程序启动和关闭的速度太快,以至于他没有机会以这种方式连接到它。上面的建议非常好。是的。我是just希望可能会有一个阻塞输入,这将给他们一个附加调试器的机会。但是,由于它接受命令行参数,我认为这是不可能的。如果他有源代码,他可以很容易地插入一个
    控制台。Readline
    ,使程序暂停足够长的时间,以便他附加调试器。然后按一个键,它就可以开始比赛了。我认为这不值得投否决票,只需一行小小的更改,它就可以很好地工作。如果您已经在调试,它们将变灰。如果您下拉调试菜单,则为“停止调试”已启用?如果是,请选择它,然后您将能够正常设置命令行参数。System.Diagnostics.Debugger.Break()也有类似的效果。否,它没有。Debugger.Break()只向附加的调试器发送断点信号,而Debugger.Launch()则发送断点信号启动调试器并将其附加到进程。可能的重复项请先阅读其他答案。此问题已得到回答。