2

有一个程序(用 C# 编写的 WPF 应用程序)调用另一个程序(用 C++ 编写的命令行程序)。他们都在同一个解决方案中。在某些时候,调用者通过使用其他程序通过使用System.Diagnostics.Process. 我想在测试这个项目时调试这两个程序。怎么做?是否有一些简单的方法,例如我们对库执行的“附加”?

--EDIT--
进程A启动进程B。然后A等待直到进程B退出。此外,B非常小的东西,例如dir快速退出的命令提示符。

4

4 回答 4

2
  • 由于已经到了最后期限,因此没有时间按照威尔伯特的建议用托管代码包装 C++。
  • 在单独的 VS 上运行这两个程序也不起作用(通过尝试确认),因为程序B仅在程序A需要时运行,并且每次启动B的命令行参数都不同并在运行时生成。(即使在同一个 VS 中也无法完成,因为调试一个进程似乎会暂停另一个进程的执行)
  • 由于B是本机 C++ 应用程序,因此无法在程序中调用 Debug 。要访问 Visual Studio 扩展,项目需要是托管项目。由于我的 VS 版本存在问题,无法将当前项目转换为托管项目。(安装 Net Framework 4.5 后,VS 2010 需要更新到 SP1 才能使用某些功能)

应用解决方案:

  1. A 的源代码中,在为B生成命令行参数的位置下方放置一个断点(我把它放在proc.Start()调用的位置)。
    例如

    Process otherProcess = new Process();
    ...
    otherProcess.StartInfo.Arguments = "abc" + foo() + "," + bar();// what we need
    ...
    otherProcess.Start(); // break-point is here
    
  2. 在调试模式下运行A直到到达断点。

  3. 读取 的值proc.StartInfo.Arguments并复制该值以供以后使用。
  4. 安全退出调试A(停止调试)。
  5. B的命令行参数设置为复制的值(项目属性 > 调试 > 命令行参数)
  6. 开始调试B(右键单击项目 > 调试 > 启动新实例)。
于 2013-11-16T07:01:54.013 回答
1

如果我理解正确,只需将调试器附加到另一个进程。从 Visual Studio 的一个实例中,您可以附加到多个进程,但不能将两个调试器附加到同一个进程。但是,请确保将正确的调试器附加到每个进程,即本机调试器连接到 C++ 应用程序,托管调试器连接到 WPF 应用程序。

您可以从“进程”工具窗口在调试器进程之间切换(假设它们都在断点处暂停)。调用堆栈和所有其他堆栈都针对当前选定的进程进行更新。

于 2013-11-13T10:22:03.610 回答
0

您还可以编写一个使用 C++/Cli 的小类。在外部,您的类看起来像任何 C# 类,并且可以直接从 C# 中使用。但是在 C++/Cli 内部,你可以自由调用 C++。这样,您可以删除 System.Diagnostics.Process 的使用并直接使用其他程序。

这是一些前期工作,但它允许您像现在处理 C# 代码一样直接进入 C++ 代码。

于 2013-11-13T10:22:40.097 回答
0

运行另一个 VS 实例,打开解决方案并尝试连接到正在运行的进程 http://msdn.microsoft.com/en-us/library/vstudio/3s68z0b3.aspx

于 2013-11-13T10:19:43.213 回答