Compartir a través de


Recuperar información de símbolos por nombre

En el código siguiente se muestra cómo llamar a la función SymFromName . 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 de SYMBOL_INFO . Además, el miembro MaxNameLen debe establecerse en el número de bytes reservados para el nombre. En este ejemplo, szSymbolName es un búfer que almacena el nombre del símbolo solicitado. 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.

TCHAR szSymbolName[MAX_SYM_NAME];
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
    MAX_SYM_NAME * sizeof(TCHAR) +
    sizeof(ULONG64) - 1) /
    sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

_tcscpy_s(szSymbolName, MAX_SYM_NAME, TEXT("WinMain"));
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromName(hProcess, szSymbolName, pSymbol))
{
    // SymFromName returned success
}
else
{
    // SymFromName failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymFromName returned error : %d\n"), error);
}

Si una aplicación tiene un nombre de archivo de origen o módulo, así como información de número de línea, puede usar SymGetLineFromName64 para recuperar una dirección de código virtual. Esta función requiere un puntero a una estructura de IMAGEHLP_LINE64 para recibir la dirección de código virtual. Tenga en cuenta que el controlador de símbolos solo puede recuperar información de número de línea cuando se establece SYMOPT_LOAD_LINES opción mediante la función SymSetOptions . Esta opción debe establecerse antes de cargar el módulo. El parámetro szModuleName contiene el nombre del módulo de origen; es opcional y puede ser NULL. El parámetro szFileName debe contener el nombre del archivo de origen y el parámetro dwLineNumber debe contener el número de línea para el que se recuperará la dirección virtual.

TCHAR  szModuleName[MAX_PATH];
TCHAR  szFileName[MAX_PATH];
DWORD  dwLineNumber;
LONG   lDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
_tcscpy_s(szModuleName, MAX_PATH, TEXT("MyApp"));
_tcscpy_s(szFileName, MAX_PATH, TEXT("main.c"));
dwLineNumber = 248;

if (SymGetLineFromName64(hProcess, szModuleName, szFileName,
    dwLineNumber, &lDisplacement, &line))
{
    // SymGetLineFromName64 returned success
}
else
{
    // SymGetLineFromName64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromName64 returned error : %d\n"), error);
}