windows - Minivolcado WinDbg Dr. Watson: ¿requiere pdb/dll originalmente creado para la versión instalada?
debugging dr.watson (5)
Tengo un archivo mindmp del bloqueo de aplicaciones de un objetivo. ¿Es posible para mí reconstruir los archivos dll / pdb para una versión de software y tener símbolos de carga windbg correctamente?
Mi problema es que nuestros archivos pdb solo se guardan para versiones principales (por desgracia). Esta es una creación diaria, que puedo reconstruir a mí mismo, pero me estoy tropezando con errores.
Con! Sym ruidoso activado: "el encabezado de la imagen no coincide con el encabezado de la imagen de memoria".
DBGENG: C:/.../XXX.dll image header does not match memory image header.
DBGENG: XXX.dll - Partial symbol image load missing image info
DBGHELP: Module is not fully loaded into memory.
DBGHELP: Searching for symbols using debugger-provided data.
DBGHELP: C:/.../XXX.pdb - mismatched pdb
Tenga en cuenta que he compilado el pdb con el dll, son del mismo directorio de RELEASE (¿Debería crear depuración?)
Estos tesis son compilaciones de versiones (ya que las compilaciones de versiones instaladas están en el objetivo y se cuelgan) ¿Debería de alguna manera estar utilizando los archivos DLL de compilación de depuración para obtener más información sobre los símbolos?
En mi experiencia probablemente no.
Si tiene el directorio de compilación exacto y la compilación con la misma configuración exacta del compilador, esto podría funcionar. Definitivamente no podrá cargar símbolos de una compilación de depuración contra un volcado de bloqueo de la versión.
Tendrá que activar las opciones de ''cargar todo'': .symopt + 0x40 para que windbg ignore las diferencias de marca de tiempo.
La utilidad ChkMatch está diseñada para este escenario exacto. Siempre que tenga el .EXE original, puede recompilar las fuentes (con las mismas configuraciones de compilador y compilador) y aplicar un parche al .PDB nuevo para que coincida con el viejo .EXE.
En este ejemplo, OriginalExecutable.exe es el ejecutable que ya no tiene un archivo .PDB, y RebuiltPDB.pdb es uno que se ha producido mediante la reconstrucción de la fuente original.
chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb
Ahora, siempre que los dos archivos tengan sus nombres originales, el depurador debería aceptarlos como un par coincidente.
Los archivos PDB están vinculados a sus archivos EXE por un GUID y una "edad" (es un número de secuencia). Estos están incrustados en el EXE y en el PDB. El GUID se regenera en cada compilación completa, y la "edad" se cambia en cada compilación incremental.
El depurador los utiliza para asegurarse de que está buscando el PDB correcto para el archivo EXE.
No sabía acerca de la herramienta "chkmatch" mencionada por SteveMan, pero sospecho que funciona parcheando el GUID / edad para que coincidan.
Esto es demasiado tarde para ayudar a Doug, pero por el bien de cualquiera que se encuentre con esta pregunta, otro hilo ( ¿Es posible cargar símbolos no coincidentes en Visual Studio? ) Señaló una forma de hacer que WinDbg acepte archivos .PDB que no coinciden.
.symopt_0x40
si todavía tiene el código fuente exacto de donde se compiló la imagen, vuelva a generarlo produciendo un nuevo archivo pdb y luego ordene a WinDbg que cargue este pdb cuando abra el volcado de emergencia, funcionó una vez en mi práctica.