在 Visual Studio 2015 中调试本机应用程序加载的托管 DLL

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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 加载到内存中时,断点图标应变为红色并按预期工作。

【讨论】:

以上是关于在 Visual Studio 2015 中调试本机应用程序加载的托管 DLL的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Visual Studio 2015 现在无法在调试中打断点

在 Visual Studio 2015 中调试时无法解析参数名称类型 ISession

使用 Visual Studio 2015 在 gulp 中检测发布/调试

Visual Studio中的远程调试:远程调试器不支持这个版本的windows

VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法

Visual Studio 2015 调试器崩溃 [重复]