【问题标题】:Debug a Managed DLL loaded by Native Application in Visual Studio 2015在 Visual Studio 2015 中调试本机应用程序加载的托管 DLL
【发布时间】:2016-04-12 23:39:04
【问题描述】:

我正在使用支持“扩展”作为托管 C# DLL 的特定应用程序。应用程序本身是一个原生应用程序,我没有它的源代码。

我能够让应用程序加载 DLL,并且我可以验证我的函数是否被调用。我想要的是能够在运行时在 DLL 中调试我的扩展代码。我可以使用 Visual Studio 附加到本机应用程序的进程,但是,我无法设置任何断点,因为我收到“未加载任何符号...”错误。 PDB 文件位于 DLL 旁边。

在我看来,Visual Studio 调试器无法识别我的托管 C# 代码,即使 DLL 显然正在被使用。例如,如果我浏览“模块”视图,我无法在列表中看到我的 DLL。

通读一些 Visual Studio 支持页面,听起来我通常会在正在运行的应用程序的项目上启用“混合模式”。但是,由于我实际上并未构建应用程序,因此无法更改此设置。

有人知道是否有其他方法可以实现这一目标吗?

【问题讨论】:

    标签: c# c++ visual-studio debugging dll


    【解决方案1】:

    Visual Studio 将在列表中包含您的 DLL,如果它已加载,并且程序正在使用正常的 .net 运行时。例如,如果它使用的是经过修改或单声道的东西,那么它可能不存在。

    我不认为您没有非托管程序的来源是这里的问题。 “混合模式”不是您在项目中设置的。这是您为 VS 设置的,以了解从 VS 启动项目时要使用的调试模式。附加到流程时,您可以选择更多选项,这对您来说很重要。

    我用这个项目来测试理论:https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0

    我构建了发布模式并删除了 PDB,并且能够通过在附加到进程时手动选择调试器类型来使用 VS2015 在 CSClassLibrary(static int GetStringLength)中命中断点。

    如果您让它自动选择,并且您遇到时间问题(附加 vs .net 启动 vs dll 加载),那么 .net 可能在您附加时无法启动,并且它不知道附加.net 调试器已启用。所以手动指定它应该会有所帮助。

    此外,解决调试时间问题的一个标准技巧是将 System.Diagnostics.Debugger.Break() 放入您的 c# 代码中——这将确保您有机会在您安装 Visual Studio 的那一刻'确定你的 c# 代码在(希望是正常的).net 运行时中运行。

    【讨论】:

      【解决方案2】:

      当您附加到的进程未加载您的 DLL 时,Visual Studio 将显示该错误。只需忽略错误并像往常一样设置断点。当本机应用程序将您的 DLL 加载到内存中时,断点图标应变为红色并按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 2016-07-19
        • 2018-08-26
        • 2017-10-03
        • 2021-06-28
        相关资源
        最近更新 更多