Compartilhar via


Carregando um módulo de símbolo

Se um aplicativo não chamar a função SymInitialize com o parâmetro fInvadeProcess definido como TRUE, ele deverá carregar símbolos para um módulo quando eles forem necessários. Para carregar um módulo de símbolo sob demanda, o aplicativo pode chamar a função SymLoadModuleEx com um caminho completo para um nome de módulo. Quando o módulo é carregado, o manipulador de símbolos carregará os símbolos imediatamente ou adiará a carga, dependendo das opções definidas usando a função SymSetOptions.

O código a seguir carrega um módulo de símbolo. Observe que ele pressupõe que você tenha inicializado o manipulador de símbolos usando o código em Inicializando o manipulador de símbolos.

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);
}

Observe que szImageName pode ser um caminho para qualquer módulo executável que tenha informações de depuração (.exe, .dll, .drv, .sys, .scr, .cpl .com). Além disso, dwBaseAddr é o endereço base do módulo de símbolo a ser carregado. Se esse valor for 0, o manipulador de símbolos obterá o endereço base do módulo de símbolo especificado.

Descarregando um módulo de símbolo