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.
Tópicos relacionados