我尝试使用以下代码加载多个符号模块:
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
加载多个模块?这样做的正确方法是什么?
答案 0 :(得分:0)
您正在调试器会话的上下文之外加载这些二进制文件,对吧?在这种情况下,第五个参数BaseOfDll
可能会导致问题:
模块的加载地址。如果值为零,则库从符号文件中获取加载地址。
当加载二进制独立时,它可能只使用10000000 ...在这种情况下,第二个模块加载将与第一个模块加载冲突。所以尝试传递不同的东西。
最后一个错误[...]虽然看似不相关,因为上次错误在第一次成功的函数调用之后也有此值。
如果函数成功,则最后一个错误不适用;它可以包含任何内容,但除非文档明确说明它在成功案例中设置了最后一个错误,否则你应该忽略它。