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

bai*_*rog 3 c# debugging external-process process.start

假设我有一个C#WinForms应用程序,它只是通过使用外部程序启动Process.Start(MyModule.exe).

我试图通过使用我的项目属性调试我的代码- > 调试 - > 启动操作 - > 启动外部程序(当然设置正确的工作目录).

我的另一个尝试是Debug - > Attach to process

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

它们都失败了 - Program.cs中的断点从未被击中.

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

Sco*_*ain 9

我知道有两种方法可以轻松解决这个问题.第一种方法是让你的程序请求一个调试器附加到它作为它在Main via中做的第一件事Debugger.Launch()

public static void Main(string[] args)
{
    Debugger.Launch();

    //Rest of your code here
}
Run Code Online (Sandbox Code Playgroud)

这将显示如下所示的对话框
在此输入图像描述

这将允许您附加到正在运行的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
}
Run Code Online (Sandbox Code Playgroud)

  • @this.myself 这两个方法在发布模式下都是活动的,它是 [`Debug`](http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.debug 中的一些函数(v=vs.110).aspx) 不是在发布期间不会编译的“调试器”。这是通过 [`Conditional`](http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.conditionalattribute) 属性完成的,如果右键单击该方法并执行“导航到->”元数据`您可以查看您想知道的方法是否具有`[Conditional("DEBUG")]`属性。 (2认同)