13

我在同一个解决方案中有两个 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 吗?

4

5 回答 5

32

在第二个项目中检查它的命令行参数,如果它看到像--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 File Execution Options 注册表项中。

于 2013-08-29T21:03:56.743 回答
7

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

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

var proc = Process.Start(psi);
Debugger.Break();  
于 2013-08-29T20:07:37.720 回答
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 > Attach to process 以附加到 Program B。

于 2013-08-29T09:24:24.990 回答
1

这是我看到的一个解决方案......

  1. 将消息框添加到您要调试的项目,项目 B。

    MessageBox.Show("暂停");

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

  3. 运行代码,直到出现消息框。 消息框图片

  4. 选择调试>附加到进程

  5. 在出现的窗口中,选择您正在执行并希望逐步执行的项目的名称,项目 B。单击确定。

  6. 在由消息框代码创建的消息框上单击确定。 消息框图片

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

于 2019-03-29T00:10:01.097 回答
0

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

于 2018-11-24T04:55:06.683 回答