从 C# 代码调试 C++ exe

Posted

技术标签:

【中文标题】从 C# 代码调试 C++ exe【英文标题】:Debuging C++ exe from C# code 【发布时间】:2014-03-11 08:41:02 【问题描述】:

我有一个多线程 C++ 控制台应用程序。我编写了一个 C# 程序来使用我的 C++ 代码的执行文件。

为了通过 C# 运行 C++ 应用程序,我为 C++ 应用程序定义了一个 Process 并使用以下命令执行它:

_process.StandardInput.WriteLine(command);

执行几个小时后,C++ 程序的 CPU 使用率保持在 50%,C++ 程序停止工作!我不知道我应该如何理解问题所在!

我尝试在 Visual Studio 2014 中通过 Debug -> Attach to Process 将 C++ exe 附加到 C# 程序,但它没有显示任何有用的信息!

我已经使用 Visual Studio 的发布模式构建了 C++ exe,我还使用 Visual Studio 的发布模式运行了 C# 代码。

你有什么想法来调试这个问题吗?

【问题讨论】:

在调试模式下构建它们? @nvoigt 如果我在调试模式下构建它们,发生类似情况需要很长时间(可能需要几天)!由于是多线程程序,问题可能与多线程有关,所以在调试模式下可能不会出现类似情况! 你试过了吗?毕竟,明天调试似乎总比今天不调试好。你能自己运行(和调试)C++ exe吗? 在类似的方法中,如果 C# 应用程序不打开 C++ 输出文件,C++ 应用程序会发生什么情况?例如,可能一台计算机同时运行两个应用程序,但 C# 版本故意不打开 C++ 输出文件的任何文件句柄。在单独的测试中,另一台计算机仅运行 C++ 应用程序。我会回顾一下 C++ 线程是如何打开和关闭输出文件的。 @nvoigt 你是对的,但由于它很耗时,我想将它作为最后的手段,我更喜欢找到一种更快的调试方法。因为我的最终应用程序正在使用C# 代码,所以我想对其进行调试,并且我想确保我的最终程序没有任何错误。 【参考方案1】:

这可能不是一个答案,而是一个很好的参考文章,可以使用 Windows API 函数 OutputDebugString() 进行故障排除。 2014 年 3 月 11 日,Mark Nelson 在 Dobb 博士的网站上发表了一篇出色的文章:Blundering into the One Definition Rule。

其中详细介绍了如何利用 Microsoft DebugView utlity 以及已发布的单个头文件的解决方案来解决任何问题。很有可能需要文章第二页上的简短类定义来隔离 C++ exe 中的问题所在。请查看文章以充分了解单行范围和强制 OutputDebugString() 函数调用。使用这个帮助类应该可以减少隔离 50% 使用率停滞和 C++ 线程出现死锁的时间。

【讨论】:

以上是关于从 C# 代码调试 C++ exe的主要内容,如果未能解决你的问题,请参考以下文章

如何附加调试器以从托管(C#)包装器进入本机(C++)代码?

调试从非托管 C++ 调用的托管 .NET 代码

可以从命令行运行 C++ 代码,但不能从 Visual Studio 中的调试模式运行

我如何调试在外部 C# 应用程序中 SWIGed 的 C++ DLL(不能从调试器启动)

如何使用 Microsoft Visual C++ 调试器调试 MinGW EXE?

从 .NET 应用程序调试 C++ 代码时出现问题