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

How do I control c++ DLL debug symbols loading?

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

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

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

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

这是我加载和卸载 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 window 执行此操作。但是,这将阻止您调试 GameAssembly.dll.

所以唯一的选择就是在 rebuild/reload dll 时不进行调试。为此,您必须为应用程序的单个 运行 创建多个调试会话。以下是您的操作方式

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

当您要重建 dll 时:

  1. 卸载 dll
  2. 使用“调试”->“全部分离”分离调试器
  3. 重建 DLL
  4. 使用“调试”->“附加到进程”重新开始调试应用程序
  5. 重新加载 DLL

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