如何单步执行动态加载的 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#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序