Поделиться через


Загрузка модуля символов

Если приложение не вызывает функцию SymInitialize с параметром fInvadeProcess с значением TRUE, то при необходимости он должен загружать символы для модуля. Чтобы загрузить модуль символов по запросу, приложение может вызвать функцию 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, обработчик символов получит базовый адрес из указанного модуля символов.

Выгрузка модуля символов