如何解决我如何控制 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 时不进行调试。为此,您必须为应用程序的单次运行创建多个调试会话。这是你的方法
- 像往常一样开始调试应用程序。
当你想重建dll时:
- 卸载dll
- 使用 Debug -> Detach All 分离调试器
- 重建DLL
- 使用调试 -> 附加到进程重新开始调试应用
- 重新加载 DLL
当然,步骤的顺序可以稍微交换一下。只要你在重建前分离,并且在构建完成后不要重新加载dll,你应该没问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。