有啥方法可以调试从 C# DllImport 调用的 c++ dll?

Posted

技术标签:

【中文标题】有啥方法可以调试从 C# DllImport 调用的 c++ dll?【英文标题】:Is there any way to debug c++ dll called from C# DllImport?有什么方法可以调试从 C# DllImport 调用的 c++ dll? 【发布时间】:2012-09-20 16:38:12 【问题描述】:

我想知道是否有任何方法可以调试从 VS 2010 中的 C# PInvoke 调用的 c++ dll。我试图将项目附加到 c# 应用程序中,但它没有工作 - 没有在断点处停止。

我还尝试在 C++ 项目中使用 OutputDebugString 记录任何内容,但没有使用 PInvoke 调用打印任何内容。尽管存在这些问题,但实际功能运行良好。

我们将不胜感激。

【问题讨论】:

这可能会有所帮助,但看起来您需要 .pdb 文件来做任何有意义的事情:social.msdn.microsoft.com/Forums/en-US/vsx/thread/… @JeffE 当然,该项目有 .pdb 文件,但没关系。见汉斯的回答。 顺便说一句,您可以在 DLL 中打印出消息。但为了能够在控制台中看到这些消息,您必须在调试模式下构建 DLL。 【参考方案1】:

两者都需要打开相同的选项:项目 > 属性 > 调试选项卡 > 勾选“启用非托管代码调试”选项。

您现在可以在本机 DLL 代码中设置断点,一旦 C# 项目加载 DLL,它就会从空心变为实心。由于使用了非托管调试引擎,OutputDebugString() 输出将进入输出窗口。

【讨论】:

您还必须在启动项目的属性中设置此选项,而不仅仅是在使用非托管代码的项目上。【参考方案2】:

如果您在程序运行时运行 C++ 调试器,然后转到调试->附加到进程->找到您的进程并附加到它。你应该可以调试它。

确保您已使用调试器符号编译 DLL。 (.pdb) 文件,并且它们位于您从中运行的目录中。

【讨论】:

【参考方案3】:

附加时,将“附加到”值更改为“本机”。该进程不应在托管代码调试器下运行 - 而不是“调试”,而是使用“运行”命令启动。

此外,DLL 需要使用调试信息进行编译,以便进行任何合理的调试。确保您没有 P/Invoking Release 构建。

但是,无论调试模式如何,OutputDebugString() 都应该工作。

【讨论】:

以上是关于有啥方法可以调试从 C# DllImport 调用的 c++ dll?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将 DLLImport 与结构一起用作参数?

c# dllimport怎么弱引用

C# 中dllimport 调用不同文件夹终极方法

C# 中dllimport 调用不同文件夹终极方法

从 C++ 调用 C DLL 会导致访问冲突,但 C# 项目与 DllImport 工作

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