我正在尝试使用 DbgHelp 为某些模块加载调试符号,而不锁定 PDB 文件,以便我们的客户可以在它们仍由我们加载时删除它们。
我尝试使用FILE_SHARE_DELETE
标志创建一个文件,然后SymLoadModule64
使用该文件调用,但没有成功:
// Please ignore the missing error management
void Init()
{
// Initialize without loading the symbols
SymInitialize(::GetCurrentProcess(), FALSE);
...
// Call EnumerateSymbolsProc64 for every module
EnumerateLoadedModules64(::GetCurrentProcess(), EnumerateSymbolsProc64, NULL);
}
BOOL WINAPI WinDbgHelpImpl::EnumerateSymbolsProc64(PTSTR moduleName, DWORD64 moduleBase, ULONG moduleSize, PVOID userContext)
{
// Load the file with FILE_SHARE_DELETE flag
HANDLE fileHandle = CreateFileA(moduleName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
0,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);
U64 res = s_winDbgHelpImpl.SymLoadModule64(::GetCurrentProcess(), fileHandle, NULL, NULL, moduleBase, moduleSize);
DWORD err = GetLastError();
return !(res == 0 && err != ERROR_SUCCESS);
}
符号已正确加载,但文件仍处于锁定状态。如果我在调用 EnumerateLoadedModules64 之前停止程序,我可以删除 PDB。
您知道是否可以在不锁定文件的情况下加载符号?