如何调试 DLL 中的代码

Posted

技术标签:

【中文标题】如何调试 DLL 中的代码【英文标题】:How to debug the code inside the DLL 【发布时间】:2012-02-27 08:48:12 【问题描述】:

我有一个 C# 程序,我从中调用 C++ 中的一些函数/变量。 C++ 程序本身运行良好,并经过检查。但是,当我构建这个 DLL 并将其用于 C# 时,接口代码中存在一些错误,阻止我在 C# 中获得正确的结果。

很可能,导出变量/导出函数给出的结果有一些错误,我想检查一下。

我的主要问题是:我如何调试这个 DLL,比如设置断点等,然后像我们对任何其他程序所做的那样查看结果?

【问题讨论】:

【参考方案1】:

假设您有本机 (C++) DLL 的源代码和调试符号,您可以在托管 (C#) EXE 项目的“调试”选项卡上选中“启用非托管代码调试”选项,然后设置断点,像往常一样检查 C++ 代码中的变量等。您可以将 C++ 项目添加到解决方案中,或者只打开一个 C++ 源代码文件并在其中设置断点。

【讨论】:

我的 C++ 项目在解决方案中,并且设置了所有断点。我在 C# exe 项目的调试选项卡下检查了Enable Unmanaged code debugging option,但是当我开始调试时,C++ 中的断点被禁用(悬停在它们上时,工具提示消息是:The breakpoint will not be hit. No symbols have been loaded for this document【参考方案2】:

如果你想调试DLL,你应该在你的C++环境中工作,在你的c++代码中放置断点,但是使用c#生成的可执行文件。

【讨论】:

【参考方案3】:

调试这种场景的最佳方法是使用 Visual Studio 混合模式调试(通过 devenv /debugexe yourapp.name.exe 命令)或使用 Windbg + SOS 扩展(更深入的学习曲线,但这会显示更多信息,例如您在本机和托管代码中键入大小) 要了解如何使用 Windbg + SOS,请参阅 Mario Hewardt 的 Advanced .NET Debugging

请注意,这类问题通常是由 1) 错误选择了与 C++ API 一起使用的 C# 数据类型 2) 错误指定/未指定的函数调用约定 http://blogs.msdn.com/b/adam_nathan/archive/2003/05/21/56690.aspx

【讨论】:

以上是关于如何调试 DLL 中的代码的主要内容,如果未能解决你的问题,请参考以下文章

VS如何在调试时进入到dll文件

从 python 调试 VS2010 中的 c++ dll

调试包含在 C++/CLI DLL 中的静态库时,调试器不会进入本机代码

VS2013调试时如何加载dll

如何调试用bcb编译出来的dll

如何在 Delphi 中调试从 Java 调用的 DLL?