【问题标题】:Loading multiple modules with SymLoadModuleExW使用 SymLoadModuleExW 加载多个模块
【发布时间】:2017-10-23 15:43:57
【问题描述】:

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

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 加载多个模块?这样做的正确方法是什么?

【问题讨论】:

    标签: debugging winapi symbols dbghelp


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • BaseOfDll 有什么指导方针吗?我怎么知道要给它哪些值?
    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 2019-10-31
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多