【问题标题】:Attaching DLL to managed process doesn't work将 DLL 附加到托管进程不起作用
【发布时间】:2019-01-04 18:02:59
【问题描述】:

我有一个需要调试的 C++ DLL 项目 (x86)。 此 DLL 由 exe 使用。

我可以轻松地将 VS2017 中的 DLL 项目附加到本机 exe (x86)。 当我在 VS2017 的 C++ DLL 项目中设置断点时,这些断点被命中。 这是正常的、理想的行为。

现在我已将 C++ DLL 项目附加到 .NET exe(编译为 x86)。 断点没有命中,我不知道为什么它不像原生 exe 那样工作。

我已取消选中“使用应用程序框架”选项,但这并没有改变任何东西。

我也尝试了“启用本机代码调试”选项,但没有成功。 另外,我尝试将它附加到 NET exe 的 Debug 版本和 NET exe 的 Release 版本。

我可以看到 VS2017 附加到正确的进程,因为当我关闭 NET exe 时,VS2017 退出调试模式。

但是,没有命中断点。

有什么特别需要我注意的吗?

【问题讨论】:

  • 我猜你需要启用本机代码的调试。
  • @PaulMcKenzie 谢谢,但这不会改变任何事情。
  • 然后从DLL端调试。加载 DLL 项目并将 .Net 应用程序作为可执行文件运行。
  • @PaulMcKenzie 是的,这就是我正在做的事情:我启动 NET.exe 项目,然后在 VS2017 中打开 C++ DLL 项目并单击“调试”->“附加到进程” .
  • 不,不要附加。加载 DLL 工程,在 DLL 的调试配置中将要运行的可执行文件更改为 Net 可执行文件。另外,仔细查看控制台输出并检查是否正在加载 DLL 以及是否已加载符号。

标签: c++ debugging dll process visual-studio-2017


【解决方案1】:

很可能托管的 .exe 没有加载本机 DLL。或者它加载了不正确的 DLL 版本,而不是您正在调试的版本。

要进行故障排除,请在您的本机代码中添加 __debugbreak(); 调用。这种断点不太可能被忽略,除非你搞乱了结构异常处理。 Windows 将向您显示一条消息,提供附加调试器,您可以选择现有的 Visual Studio 实例。附加后,“模块”窗口将准确显示它加载的本机 DLL 的版本。

永久解决该问题的最佳方法是在单个 Visual Studio 解决方案中添加两个项目,设置依赖项,并确保 DLL 输出位置是 EXE 查找库的位置。我在 VS2017 中一直这样做,启用本机代码调试后,我可以在托管代码或本机代码中设置断点,这对调试互操作有很大帮助。

【讨论】:

  • 谢谢,明天我需要用新的大脑来测试一下。
  • 我经历了一些非常奇怪和方便的事情:我将 DLL 编译为 debug x86,然后启动了我的 exe。引发异常时,会在 Visual Studio 中自动打开发生错误的 DLL .cpp 文件。
  • @tmighty 我认为您还没有开始,而是按 F5 = 从调试器开始。当您这样做时,__debugbreak 内在函数就像代码中的正常断点一样工作。不同之处在于__debugbreak() 会捕获到调试器,即使它尚未附加。也只会在没有安装调试器的情况下使 PC 上的应用程序崩溃,即确保不在您的发布版本中使用它。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多