加载调试符号而不锁定文件

时间:2016-11-23 08:56:08

标签: c++ windows winapi pdb-files dbghelp

我正在尝试使用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。

您是否知道在不锁定文件的情况下是否可以加载符号?

0 个答案:

没有答案