如何单步执行动态加载的 DLL 的源代码?

Posted

技术标签:

【中文标题】如何单步执行动态加载的 DLL 的源代码?【英文标题】:How do I step through the source code of a DLL that is loaded on the fly? 【发布时间】:2011-02-16 06:49:35 【问题描述】:

如何单步调试动态加载的 DLL 的源代码? 我有一个 SLN,它是通过将 BIN 文件加载到 Visual Studio 2008 中自动创建的。它使用命令行界面功能,在这个命令行上,我可以发出命令来加载 DLL。我加载的 DLL 是从源代码构建的。所以我应该能够单步调试这个源代码。

我是否需要以某种方式加载 mdb 或以某种方式告诉集成开发环境如何处理源代码?目前,我无法在源代码中放置任何断点。

【问题讨论】:

【参考方案1】:

如果你构建了这个 dll,那么你应该能够构建调试符号,并将调试器指向这些文件

您必须确保 pdb 文件是针对加载的完全相同的二进制文件构建的,否则将找不到符号,因为它们不匹配。

【讨论】:

如果你想调试两个进程,一个进程调用另一个进程怎么办?换句话说,我如何同时使用两个 Visual Studio 会话?我认为我遇到的问题是因为我从命令行界面加载了一个可执行文件,而 dll 是一个可执行文件加载的进程。【参考方案2】:

如果动态加载 DLL(例如通过 C++ 中的 LoadLibrary),则在加载 DLL 之前不会加载符号。在加载 DLL 的调用之后中断,然后加载 DLL 源并在其中设置断点。加载 DLL 的符号时,您将在 Visual Studio 的 Output 窗格中看到一条消息。

您还可以通过在调试器选项中指定将加载 DLL 的 EXE 来调试 DLL 解决方案。然后Visual Studio就会知道EXE很可能会加载DLL并提前加载符号。

【讨论】:

【参考方案3】:

您可能需要告诉 MSVC 在哪里可以找到这些 DLL 的 PDB 文件。 PDB 允许调试器查找哪一行源代码与哪个汇编字节匹配。

在 Tools->Options->Debugging->Symbols 下查看,然后尝试将 PDB 所在的目录添加到那里的对话框中。

【讨论】:

【参考方案4】:

如果 DLL 已经在 GAC 中,那么您的断点可能不起作用。您可能必须从 GAC 中删除删除引用并尝试。

你检查了吗? http://msdn.microsoft.com/en-us/library/c91k1xcf%28v=vs.80%29.aspx

【讨论】:

【参考方案5】:

删除引用的dll并重新添加。

希望对你有帮助。

【讨论】:

以上是关于如何单步执行动态加载的 DLL 的源代码?的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何动态加载和卸载DLL

[转载] 动态链接库dll的 静态加载 与 动态加载

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

C# 动态加载dll插件并执行

vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)