无法调试使用Process.Start()启动的项目

时间:2013-08-29 09:19:38

标签: c# debugging

我在同一个解决方案中有两个C#WinForm项目,可以将它们称为A和B.项目A通过下面的调用启动进程B

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Task.EXEFilename;
psi.WorkingDirectory = Path.GetDirectoryName(Data.EXEFilename);
Process.Start(psi);

进程B正确启动。我想在调试A的同时调试进程B.我想在B中设置一个断点就足够但是它永远不会被击中。我已经验证了启动的进程是在B的bin / debug文件夹中。在这种情况下我不应该附加到进程来将调试从A切换到B?

5 个答案:

答案 0 :(得分:21)

在第二个项目中检查其命令行参数,如果它看到--debug之类的内容作为第二个程序启动调试器本身的第一个参数传入

private static void Main(string[] args)
{
    //If no debugger is attached and the argument --debug was passed launch the debugger
    if (args.Length == 1 && args[0] == "--debug" && Debugger.IsAttached == false)
        Debugger.Launch();

    //(snip) the rest of your program

}

执行此操作时,您将看到一个对话框窗口,允许您选择打开Visual Studio的新副本或仅使用已打开的副本。

image


您也可以将子流程放在Image File Execution Options registry key

答案 1 :(得分:6)

听起来您希望Visual Studio自动附加到调试期间创建的任何子进程。像windbg这样的其他调试器有这种行为,但不幸的是Visual Studio没有。有一个用户语音项目正在跟踪此请求

短期虽然最好的选择是在生成子进程时简单地中断并手动附加调试器。

var proc = Process.Start(psi);
Debugger.Break();  

答案 2 :(得分:1)

尝试从程序B获取进程ID,例如:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Task.EXEFilename;
psi.WorkingDirectory = Path.GetDirectoryName(Data.EXEFilename);
var proc = Process.Start(psi);

Debug.WriteLine(proc.Id);

然后在另一个Visual Studio实例中加载项目并使用Debug>附加到附加到程序B的进程。

答案 3 :(得分:1)

这是向我展示的解决方案...

  1. 向要调试的项目B项目中添加一个消息框。

    MessageBox.Show(“ pause”);

  2. 在项目B中的上方消息框代码后的某个点添加断点。

  3. 运行代码,直到出现消息框。 message box image

  4. 选择 Debug > 附加以处理

  5. 在出现的窗口中,选择要执行并希望逐步执行的项目的名称,即ProjectB。单击“确定”。

  6. 在由消息框代码创建的消息框上单击“确定”。 message box image

您现在应该位于项目B中消息框代码之后某个时候放置的断点!

答案 4 :(得分:0)

您也可以尝试不直接启动进程B。右键单击解决方案,选择“属性”共同属性|启动。将进程A和进程B都设置为开始。这模拟了由进程A启动的进程B(在A的源代码中注释了由进程A启动的进程B)。现在,您就可以测试A和B之间的进程间通信,就像B是由A启动的一样。