加载符号模块

如果应用程序未在 fInvadeProcess 参数设置为 TRUE 的情况下调用 SymInitialize 函数,则必须在需要时加载模块的符号。 若要按需加载符号模块,应用程序可以使用模块名称的完整路径调用 SymLoadModuleEx 函数。 加载模块时,符号处理程序将立即加载符号或延迟加载,具体取决于使用 SymSetOptions 函数设置的选项。

以下代码加载符号模块。 请注意,它假定你已使用初始化符号处理程序中的代码初始化了符号处理程序。

TCHAR  szImageName[MAX_PATH] = TEXT("foo.dll");
DWORD64 dwBaseAddr = 0;

if (SymLoadModuleEx(hProcess,    // target process 
                    NULL,        // handle to image - not used
                    szImageName, // name of image file
                    NULL,        // name of module - not required
                    dwBaseAddr,  // base address - not required
                    0,           // size of image - not required
                    NULL,        // MODLOAD_DATA used for special cases 
                    0))          // flags - not required
{
    // SymLoadModuleEx returned success
}
else
{
    // SymLoadModuleEx failed
    DWORD error = GetLastError();
    printf("SymLoadModuleEx returned error : %d\n", error);
}

请注意,szImageName 可以是任何具有调试信息(.exe、.dll、.drv、.sys、.scr、.cpl、.com)的可执行模块的路径。 此外,dwBaseAddr 是要加载的符号模块的基址。 如果此值为 0,则符号处理程序将从指定的符号模块获取此基址。

卸载符号模块