¿Qué me proporciona el PDB durante la depuración y cómo sé que está funcionando?

StackOverflow https://stackoverflow.com/questions/52600

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo que utilizar un componente de terceros sin código fuente.Tengo la DLL de lanzamiento y el archivo PDB de lanzamiento.Llamémoslo 'CorporateComponent.dll'.Mi propio código crea objetos a partir de esta DLL y llama a métodos en estos objetos.

CorpObject o = new CorpObject();
Int32 result = o.DoSomethingLousy();

Durante la depuración, el método 'DoSomethingLousy' genera una excepción.¿Qué hace el archivo PDB por mí?Si hace algo bueno, ¿cómo puedo estar seguro de que lo estoy utilizando?

¿Fue útil?

Solución

Para confirmar si está utilizando el PDB proporcionado, CorporateComponent.pdb, durante la depuración dentro del IDE de Visual Studio revise la ventana de resultados y localice la línea que indica que CorporateComponent.dll está cargado y seguida de la cadena Symbols loaded.

Para ilustrar un proyecto mío:

The thread 0x6a0 has exited with code 0 (0x0).
The thread 0x1f78 has exited with code 0 (0x0).
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug  \AvayaConfigurationService.exe', Symbols loaded.
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug\IPOConfigService.dll', No symbols loaded.

Loaded 'C:\Development\src...\bin\Debug\AvayaConfigurationService.exe', Symbols loaded.

Esto indica que el depurador IDE encontró y cargó la PDB.

Como lo indicaron otros. Al examinar los marcos de pila dentro de su aplicación, debería poder ver los símbolos de CorporateComponent.pdb.Si no lo hace, es posible que el tercero no haya incluido información sobre los símbolos en la versión del PDB.

Otros consejos

El pdb contiene información que el depurador necesita para leer correctamente la pila.Los seguimientos de su pila contendrán números de línea y nombres de símbolos de los marcos de pila dentro de los módulos para los cuales tiene el pdb.

Daré dos ejemplos de uso.La primera es la respuesta obvia.El segundo explica los pdb indexados en fuente.

Primer ejemplo de uso...

Dependiendo de la convención de llamada y de las optimizaciones que utilizó el compilador, es posible que el depurador no pueda desenrollar manualmente la pila a través de un módulo para el que no tenga un pdb.Esto puede suceder con determinadas bibliotecas de terceros e incluso con algunas partes del sistema operativo.

Considere un escenario en el que encuentre una infracción de acceso dentro del sistema operativo Windows.El seguimiento de la pila no se desenrolla en su propia aplicación porque ese componente del sistema operativo utiliza una convención de llamada especial que confunde al depurador.Si configura la ruta de su símbolo para descargar los pdb del sistema operativo público, entonces existe una buena posibilidad de que el seguimiento de la pila se desenrolle en su aplicación.Eso le permite ver exactamente qué argumentos pasó su propio código a la llamada del sistema operativo.(y un ejemplo similar para AV dentro de una biblioteca de terceros o incluso dentro de su propio código)

Segundo ejemplo de uso...

Los PDB tienen otra propiedad muy útil: pueden integrarse con algunos sistemas de control de fuentes utilizando una característica que Microsoft llama "indexación de fuentes".Una PDB indexada en el código fuente contiene comandos de control de código fuente que especifican cómo obtener del control de código fuente las versiones exactas de los archivos que se utilizaron para crear el componente.Los depuradores de Microsoft saben cómo ejecutar los comandos para recuperar automáticamente los archivos durante una sesión de depuración.Esta es una característica poderosa que evita que el ingeniero de depuración tenga que sincronizar manualmente un árbol fuente con la etiqueta correcta para una compilación determinada.Es especialmente útil para sesiones de depuración remota y para analizar volcados de memoria post-mortem.

La instalación de "herramientas de depuración para Windows" (windbg) contiene un documento llamado srcsrv.doc que proporciona un ejemplo que demuestra cómo usar srctool.exe para determinar qué archivos fuente están indexados en un pdb determinado.

Para responder a su pregunta "¿cómo lo sé?", la función "módulos" del depurador puede indicarle qué módulos tienen un pdb correspondiente.En windbg utilice el comando "lml".En Visual Studio, seleccione módulos desde algún lugar de los menús de depuración.(lo siento, no tengo una versión actual de Visual Studio a mano)

El PDB es un archivo de base de datos que asigna las instrucciones a sus números de línea en el código original, de modo que cuando obtenga un seguimiento de la pila obtendrá los números de línea del código.Si se trata de una DLL no administrada, el archivo PDB también le proporcionará los nombres de las funciones en el seguimiento de la pila, mientras que esa información generalmente solo está disponible para DLL administradas sin PDB.

Lo principal que obtengo del pdb son los números de línea y los nombres de métodos reales para los seguimientos de la pila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top