微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何控制 C++ DLL 调试符号加载?

如何解决我如何控制 C++ DLL 调试符号加载?

我有一个在调试模式下运行的 EXE 应用程序,它在运行时加载一个 DLL。

当我加载 dll 时,它会自动加载 dll's 调试符号。

但是当我在 FreeLibrary()调用 dll 时,符号不会被卸载。

这对我来说是个问题,因为我在 EXE 运行时使用 cl.exe 重建 DLL,因此在重建之前需要释放和卸载它。

这是我加载和卸载 DLL 时的 Visual Studio 运行时调试控制台输出

'Editor.exe' (Win32): Loaded GameAssembly.dll'. Symbols loaded. <--- automatically loads the symbols when I load the dll
'Editor.exe' (Win32): Unloaded GameAssembly.dll' <--- Dosen't unload the symbols (I kNow so because when I try to rebuild the dll I get the error  (LNK1201 error writing to program database 'GameAssembly.pdb'; check for insufficient disk space,invalid path,or insufficient privilege)

以及我用来加载和释放 dll 的函数

m_DLL = LoadLibraryA("GameAssembly.dll");

FreeLibrary((HMODULE)m_DLL);

现在我想要一种在释放 dll 时卸载符号的方法,知道它是如何完成的吗?

解决方法

符号不会在应用程序本身中加载,而是在 Visual Studio 的调试器中加载。好消息是,只要您不调试应用程序,您尝试做的事情就可以正常工作。

不幸的是,没有办法从调试会话中卸载符号(据我所知)。

解决此问题的一种方法是告诉 Visual Studio 首先不要加载这些符号。您可以从 modules 窗口执行此操作。但是,这会阻止您调试 GameAssembly.dll

因此,唯一的选择是在重建/重新加载 dll 时不进行调试。为此,您必须为应用程序的单次运行创建多个调试会话。这是你的方法

  1. 像往常一样开始调试应用程序。

当你想重建dll时:

  1. 卸载dll
  2. 使用 Debug -> Detach All 分离调试器
  3. 重建DLL
  4. 使用调试 -> 附加到进程重新开始调试应用
  5. 重新加载 DLL

当然,步骤的顺序可以稍微交换一下。只要你在重建前分离,并且在构建完成后不要重新加载dll,你应该没问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。