使用SymLoadModuleExW加载多个模块

时间:2017-10-23 15:43:58

标签: debugging winapi symbols dbghelp

我尝试使用以下代码加载多个符号模块:

DWORD64 dwBaseDllSymLocal = 0;
SymInitializeW(GetCurrentProcess(), NULL, FALSE);
SymSetOptions(SYMOPT_DEBUG);

dwBaseDllSymLocal = SymLoadModuleExW(GetCurrentProcess(), NULL, L"C:\\module1.dll", NULL, 0, 0, NULL, 0);
if (0 == dwBaseDllSymLocal)
{
    __debugbreak();
}

dwBaseDllSymLocal现在是10000000。

dwBaseDllSymLocal = SymLoadModuleExW(GetCurrentProcess(), NULL, L"C:\\module2.dll", NULL, 0, 0, NULL, 0);
if (0 == dwBaseDllSymLocal)
{
    __debugbreak();
}

Dbghelp提供以下消息: module1 is already loaded at 10000000

当我尝试加载两次相同的模块时会发生相同的行为。 (与函数documentation中的内容不同)。

上一个错误是ERROR_INVALID_ADDRESS,虽然它看起来并不相关,因为上次错误在第一次成功的函数调用之后也有此值。

是否可以使用SymLoadModuleExW加载多个模块?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您正在调试器会话的上下文之外加载这些二进制文件,对吧?在这种情况下,第五个参数BaseOfDll可能会导致问题:

  

模块的加载地址。如果值为零,则库从符号文件中获取加载地址。

当加载二进制独立时,它可能只使用10000000 ...在这种情况下,第二个模块加载将与第一个模块加载冲突。所以尝试传递不同的东西。

  

最后一个错误[...]虽然看似不相关,因为上次错误在第一次成功的函数调用之后也有此值。

如果函数成功,则最后一个错误不适用;它可以包含任何内容,但除非文档明确说明它在成功案例中设置了最后一个错误,否则你应该忽略它。