2011-07-06 6 views
7

Tengo un montón de minivolcados que se grabaron durante el tiempo de ejecución de una aplicación a través de MiniDumpWriteDump. Los minivolcados se crearon en una máquina con una versión de sistema operativo diferente a la de mi máquina de desarrollo.¿Cómo extraer los rastros de pila de minivolcados?

Ahora estoy tratando de escribir un programa para extraer los rastros de pila de los minivolcados, usando dbghelp.dll. Estoy caminando MINIDUMP_MODULE_LIST y llamo a SymLoadModule64, pero esto no puede descargar los pdbs (kernel32, etc.) del servidor público de símbolos. Si agrego "C: \ Windows \ System32" a la ruta del símbolo, encuentra los dlls y descarga los símbolos, pero por supuesto no coinciden con los dlls del minivolcado, por lo que los resultados son inútiles.

Entonces, ¿cómo le digo a dbghelp.dll que descargue y use los pdbs adecuados?

[editar]

me olvidó decir que SymLoadModule64 sólo toma un nombre de archivo y hay información de versión/suma de control, por lo que, obviamente, con SymLoadModule64 solos es imposible que dbghelp averiguar qué pdb para descargar.

La información está realmente disponible en MINIDUMP_MODULE_LIST, pero no sé cómo devolverla a la API de dbghelp.

Hay SymLoadModuleEx que toma parámetros adicionales, pero no tengo idea si eso es lo que necesito o lo que debería pasar para los parámetros adicionales.

[editar]

No hubo suerte hasta ahora, aunque me he dado cuenta de que hay también Dbgeng.dll distribuye junto con dbghelp.dll en el SDK de depuración. MSDN se ve bastante bien documentado y dice que es el mismo motor que usa windbg. Tal vez pueda usar eso para extraer los rastros de la pila.

Si alguien puede indicarme alguna introducción al uso de dbgeng.dll para procesar minivolcados que probablemente también ayude, MSDN documenta solo los componentes individuales pero no cómo funcionan juntos.

+0

Posiblemente haya hecho que su minivolcado sea demasiado pequeño. Tinker con el argumento DumpType. Asegúrese de que la lista Debug + Windows + Modules muestre la ruta exacta de la DLL, la versión y las marcas de tiempo. –

+0

No, eso no es un problema, puedo cargar los minivolcados en WinDbg muy bien y descarga los PDB correctamente. Es solo que quiero automatizar la recuperación de la pila en lugar de inspeccionar los volcados manualmente en WinDbg. – Zarat

+1

Si quieres ir a la ruta truco, sólo podría transmitir órdenes a ntsd y capturar la salida –

Respuesta

8

Sólo en caso de cualquier otra persona quiere automatizar la extracción de trazas de la pila de los vertederos, esto es lo que terminé haciendo:

Como he mencionado en la actualización de que es posible utilizar en lugar de dbgeng.dll dbghelp.dll, lo que parece ser el mismo motor que usa WinDbg Después de algunas pruebas y errores, aquí se muestra cómo obtener un buen seguimiento de la pila con el mismo mecanismo de carga de símbolos que WinDbg.

  • llamada DebugCreate obtener una instancia del motor de depuración
  • consulta para IDebugClient4, IDebugControl4, IDebugSymbols3
  • IDebugSymbols3.SetSymbolOptions uso para configurar cómo se cargan los símbolos (ver MSDN de las opciones utiliza WinDbg)
  • uso IDebugSymbols3.SetSymbolPath fijar la ruta de símbolo como lo haría en WinDbg
  • uso IDebugClient4.OpenDumpFileWide para abrir el vertedero
  • uso IDebugCo ntrol4.WaitForEvent que esperar hasta que el volcado se carga
  • uso IDebugSymbols3.SetScopeFromStoredEvent para seleccionar la excepción almacenados en el vertedero
  • uso IDebugControl4.GetStackTrace para ir a buscar el último pocos marcos de pila
  • IDebugClient4.SetOutputCallbacks utilizar para registrar un receptor que recibe el seguimiento de pila decodificado
  • uso IDebugControl4.OutputStackTrace para procesar la pila de marcos
  • IDebugClient4.SetOutputCallbacks uso para anular el registro de devolución de llamada
  • liberar las interfaces

La llamada a WaitForEvent parece ser importante porque sin ella las siguientes llamadas no pueden extraer el seguimiento de la pila.

También parece haber alguna pérdida de memoria, no puedo decir si no estoy limpiando correctamente o algo interno a dbgeng.dll, pero puedo reiniciar el proceso cada 20 vertederos más o menos, así que no investigó más.

Cuestiones relacionadas