Compartir a través de


Símbolos públicos, globales y locales

Las funcionalidades de control de símbolos de la API DbgHelp han evolucionado a lo largo de los años. Para asegurarse de que el código funciona en una variedad de escenarios y proporciona detalles completos sobre los símbolos, use las funciones más recientes siempre que sea posible. Por ejemplo, SymEnumSymbols reemplaza SymEnumerateSymbols64, SymFromName reemplaza SymGetSymFromName64 y SymFromAddr reemplaza SymGetSymFromAddr4.

Símbolos públicos

Las versiones iniciales de DbgHelp.dll solo admiten el examen de símbolos públicos. Estos símbolos se generan para cualquier elemento del código que se debe exponer entre diferentes archivos de código fuente. También incluyen todos los elementos que se exportan fuera del módulo.

Los símbolos se incrustan en la imagen o se almacenan por separado en un archivo .dbg o .pdb. La única información almacenada es el nombre y la dirección del símbolo. Los nombres están disponibles como nombres decorados. Para ver nombres no codificados, llame a la función SymSetOptions con SYMOPT_UNDNAME o use la función UnDecorateSymbolName .

Tenga en cuenta que la API DbgHelp no se diseñó inicialmente para admitir varias instancias del mismo símbolo dentro de un módulo. Esto se debe a que los símbolos públicos están restringidos a nombres únicos dentro de un módulo. Por lo tanto, SymGetSymFromName64 devuelve solo el primer símbolo que coincide. Para recuperar todos los símbolos que coinciden, llame a SymEnumSymbols.

Símbolos globales y locales

Las versiones más recientes de DbgHelp.dll admiten símbolos globales y locales al usar archivos .pdb. Estas nuevas versiones incluyen funciones estáticas, funciones con ámbito dentro de un archivo de origen, parámetros de función y variables locales. Cuando DbgHelp busca un símbolo, comprueba las tablas de símbolos globales y locales antes de comprobar la tabla de símbolos públicos. Esto se debe a que hay más información disponible para estos tipos de símbolos que para los símbolos públicos.

Los símbolos globales y locales se almacenan con nombres no codificados. Por lo tanto, la marca SYMOPT_UNDNAME no tiene ningún efecto. Para obtener nombres de símbolo decorados, debe usar la marca SYMOPT_PUBLICS_ONLY. Esto hace que DbgHelp busque solo los símbolos públicos.

Para ver símbolos locales o parámetros de función, llame a la función SymSetContext con el miembro InstructionOffset de la estructura IMAGEHLP_STACK_FRAME establecida en la dirección de cualquier símbolo de función. Las llamadas subsiguientes a SymFromName y SymEnumSymbols pueden funcionar en el contexto de esta dirección. Para ello, establezca el parámetro BaseOfDll en NULL y omita el especificador del módulo del parámetro Name o Mask . Esto obliga a DbgHelp a buscar símbolos coincidentes dentro del ámbito indicado por SymSetContext.

Para determinar si un símbolo es un parámetro, compruebe el miembro Flags de la estructura SYMBOL_INFO . Si el símbolo es un parámetro, el miembro contiene SYMFLAG_PARAMETER. Si es un símbolo local, el miembro contiene SYMFLAG_LOCAL.