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


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

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

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