Compartir a través de


Recuperar información de símbolos por dirección

En el código siguiente se muestra cómo llamar a la función SymFromAddr . Esta función rellena una estructura SYMBOL_INFO . Dado que el nombre es variable de longitud, debe proporcionar un búfer lo suficientemente grande como para contener el nombre almacenado al final de la estructura SYMBOL_INFO . Además, el miembro MaxNameLen debe establecerse en el número de bytes reservados para el nombre. En este ejemplo, dwAddress es la dirección que se asignará a un símbolo. La función SymFromAddr almacenará un desplazamiento al principio del símbolo en la dirección de dwDisplacement. En el ejemplo se supone que ha inicializado el controlador de símbolos mediante el código de Inicialización del controlador de símbolos.

DWORD64  dwDisplacement = 0;
DWORD64  dwAddress = SOME_ADDRESS;

char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol))
{
    // SymFromAddr returned success
}
else
{
    // SymFromAddr failed
    DWORD error = GetLastError();
    printf("SymFromAddr returned error : %d\n", error);
}

Para recuperar el número de línea de código fuente de una dirección especificada, una aplicación puede usar SymGetLineFromAddr64. Esta función requiere un puntero a una estructura de IMAGEHLP_LINE64 para recibir el nombre del archivo de origen y el número de línea correspondientes a una dirección de código especificada. Tenga en cuenta que el controlador de símbolos solo puede recuperar información de número de línea cuando SYMOPT_LOAD_LINES se establece mediante la función SymSetOptions . Esta opción debe establecerse antes de cargar el módulo. El parámetro dwAddress contiene la dirección de código para la que se ubicará el nombre del archivo de origen y el número de línea.

DWORD64  dwAddress;
DWORD  dwDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
dwAddress = 0x1000000; // Address you want to check on.

if (SymGetLineFromAddr64(hProcess, dwAddress, &dwDisplacement, &line))
{
    // SymGetLineFromAddr64 returned success
}
else
{
    // SymGetLineFromAddr64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromAddr64 returned error : %d\n"), error);
}