如何调试C#命令行程序
我正试图用VS2010在C#中构建一个命令行工具 我的问题是:如何像调试winforms一样调试它。如何调试C#命令行程序,c#,debugging,command-line,C#,Debugging,Command Line,我正试图用VS2010在C#中构建一个命令行工具 我的问题是:如何像调试winforms一样调试它。 使用winforms,我可以逐步完成代码,查看每个步骤的值,等等 然而,在这里,程序只有在我从命令行与它对话时才会响应。我无法启动调试会话,因为这将首先完全启动程序。由于程序的性质,它会自动关闭,因为没有命令行参数 因此,无法进行调试 我需要在这里做什么 编辑:一个例子,因为有人做了一个评论,让我觉得这个解释是必要的 C:\Path\To\File\File.exe-帮助 这是一个如何处理这个程
使用winforms,我可以逐步完成代码,查看每个步骤的值,等等 然而,在这里,程序只有在我从命令行与它对话时才会响应。我无法启动调试会话,因为这将首先完全启动程序。由于程序的性质,它会自动关闭,因为没有命令行参数 因此,无法进行调试 我需要在这里做什么 编辑:一个例子,因为有人做了一个评论,让我觉得这个解释是必要的 C:\Path\To\File\File.exe-帮助 这是一个如何处理这个程序的例子。命令-help在程序启动的同一行中给出。换句话说,我不能先启动程序,然后在它运行时给它一个命令。。。因为它不会再运行了。它将启动,确保启动时没有参数,因此关闭。这就是命令行工具的工作原理
在您单击右上角的小x之前,它不会一直运行。您可以使用Visual Studio将调试器附加到命令行应用程序,只要调试器使用了正确的参数。我不确定您的应用程序是否会很快终止,或者是否会给您任何附加调试器的机会,但如果会,这应该是可行的 我使用的是VS2008,但我敢打赌2010年的过程与之类似:
工具
并单击附加到流程
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()则发送断点信号启动调试器并将其附加到进程。可能的重复项请先阅读其他答案。此问题已得到回答。