0

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

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 .

当我尝试两次加载相同的模块时,会发生相同的行为。(与函数文档中所写的不同)。

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

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

4

1 回答 1

0

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

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

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

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

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

于 2017-10-23T15:51:30.350 回答