如何控制 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 时不进行调试。为此,您必须为应用程序的单个 运行 创建多个调试会话。以下是您的操作方式
- 像往常一样开始调试应用程序。
当您要重建 dll 时:
- 卸载 dll
- 使用“调试”->“全部分离”分离调试器
- 重建 DLL
- 使用“调试”->“附加到进程”重新开始调试应用程序
- 重新加载 DLL
当然,步骤的顺序可以调换一下。只要你在重建之前分离,并且在构建完成之前不要重新加载 dll,你应该没问题。
我有一个 EXE 应用程序 运行 处于调试模式,它在运行时加载 DLL。
当我加载 dll 时,它会自动为其加载 dll's
调试符号。
但是当我在 dll
上调用 FreeLibrary()
时,符号不会被卸载。
这对我来说是个问题,因为我使用 cl.exe
重建 DLL
而 EXE 是 运行,所以在我重建它之前需要释放和卸载它。
这是我加载和卸载 DLL
'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 时不进行调试。为此,您必须为应用程序的单个 运行 创建多个调试会话。以下是您的操作方式
- 像往常一样开始调试应用程序。
当您要重建 dll 时:
- 卸载 dll
- 使用“调试”->“全部分离”分离调试器
- 重建 DLL
- 使用“调试”->“附加到进程”重新开始调试应用程序
- 重新加载 DLL
当然,步骤的顺序可以调换一下。只要你在重建之前分离,并且在构建完成之前不要重新加载 dll,你应该没问题。