使用Process.Start()通过外部程序启动代码时进行调试

时间:2014-04-28 06:17:58

标签: c# debugging process.start external-process

假设我有一个C#WinForms应用程序,只需使用Process.Start(MyModule.exe)即可由外部程序启动。

我尝试使用我的项目属性 - &gt; 调试 - &gt; 启动操作 - &gt; <来调试我的代码strong>启动外部程序(当然设置正确的工作目录)。

我的另一个尝试是调试 - &gt; 附加到流程

更新:我的模块和外部程序都使用一个资源。所以外部程序释放它,然后调用Process.Start(),等待我的进程退出ans然后再次捕获资源。所以当你的程序已经运行时我无法附加。

两个都失败了 - Program.cs 中的断点从未被击中。

那么,在这种情况下如何调试我的代码呢?

2 个答案:

答案 0 :(得分:7)

我知道有两种方法可以轻松解决这个问题。第一种方法是让你的程序请求一个调试器附加到它,这是它通过Debugger.Launch()

在Main中做的第一件事
public static void Main(string[] args)
{
    Debugger.Launch();

    //Rest of your code here
}

这将显示如下所示的对话框 enter image description here

这将允许您附加到正在运行的Visual Studio或启动新实例。

当你不能使用前面的方法(例如我不认为它在服务中工作)时解决这个问题的另一种方法是在你的代码的开头放一个循环,它将永远循环,直到附加一个调试器,这使您有足够的时间来执行您之前尝试过的“附加到进程”方法,而不会让程序进展。

public static void Main(string[] args)
{
    while(!Debugger.IsAttached)
    {
        Thread.Sleep(1000); //Sleep 1 second and then check again.
    }

    //Rest of your code here
}

答案 1 :(得分:0)

您可以使用两种不同的方法System.Diagnostics.Debugger.Launch()System.Diagnostics.Debugger.Break()第一种方法会附加调试器(让您选择哪种方式),然后不执行任何操作。在已经连接一个的情况下,什么都不会发生。 在未附加调试器的情况下,后者将完全与Launch完全相同,并且如果连接了调试器,则将作为断点。

所以,只需将System.Diagnostics.Debugger.Break();写在您想要断点的位置即可。

这将导致出现一个对话框,询问您希望如何调试程序(这当然也意味着您应该在完成调试时删除该行)

在对话框中选择适当的VS实例(或创建一个新的),然后像往常一样继续调试