【问题标题】:Can not debug a Project started using Process.Start()无法调试使用 Process.Start() 启动的项目
【发布时间】:2013-08-29 09:19:37
【问题描述】:

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

【问题讨论】:

  • 您的调试器已附加到进程 A,因此无法调试进程 B。您需要将单独的调试器附加到进程 B 以进行调试。
  • 要做到这一点,请使用调试->附加到进程
  • 如果是winform,不能直接作为新表单打开而不是进程调用吗?
  • 您正在将进程 B 作为已编译的 Exe 运行我不确定您是否能够在尝试时调试它

标签: c# debugging breakpoints


【解决方案1】:

在第二个项目中检查它的命令行参数,如果它看到像 --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 registry key中。

【讨论】:

  • 只看这个,您可能还可以使用预处理器指令,例如:#if DEBUG Debugger.Launch(); #endif
【解决方案2】:

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

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

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

【讨论】:

  • 不错的答案!注意:Scott's answer 还可以处理需要从头开始调试进程的情况(这是我需要的)。
【解决方案3】:

尝试从程序 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 的另一个实例中加载您的项目并使用“调试”>“附加到进程”以附加到程序 B。

【讨论】:

  • 该项目很可能在同一个解决方案上,因此可以从同一个 Visual Studio 附加到。 (并不是说这不会令人困惑......)
【解决方案4】:

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

  1. 在要调试的项目Project B中添加消息框。

    MessageBox.Show("暂停");

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

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

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

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

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2016-10-03
      • 2013-07-16
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2017-04-14
      相关资源
      最近更新 更多