2009-05-16 13 views
6

Tengo un dll de lanzamiento nativo creado con símbolos. Hay un paso posterior a la compilación que modifica el dll. El paso de compilación posterior hace algo de compresión y, probablemente, anexa algunos datos. El archivo pdb sigue siendo válido, pero ni WinDbg ni Visual Studio 2008 cargarán los símbolos para el dll después del paso de compilación posterior. ¿Qué bits del archivo pdb o el dll necesitamos modificar para que WinDbg o Visual Studio carguen los símbolos cuando carguen un volcado en el que se hace referencia a nuestra versión dll?Los símbolos (pdb) para dll nativo no se cargan debido al paso de compilación posterior

¿Es el tamaño del archivo lo que importa? Una suma de comprobación o hash? Una marca de tiempo?

Modificar el volcado? o modificar el pdb? modificar el dll antes de que se envíe?

(Sabemos que el pdb es válido porque podemos usarlo para obtener manualmente los nombres de símbolo para las direcciones en los volcados callstacks que hacen referencia al dll publicado. Es solo un dolor en el * ss hacerlo a mano para cada dirección en una pila de llamadas en todos los hilos.)

Respuesta

11

This post me llevó a chkmatch. En la DLL procesado, chkmatch muestra esta información:

 
Executable: 
TimeDateStamp: 4a086937 
Debug info: 2 (CodeView) 
TimeStamp: 4a086937 Characteristics: 0 MajorVer: 0 MinorVer: 0 
Size: 123 RVA: 00380460 FileOffset: 00380460 
CodeView signature: sUar 

Debug information file: 
Format: PDB 7.00 
Result: unmatched (reason: incompatible debug information formats) 

Con el mismo pdb contra la DLL pre-procesado, se informa lo siguiente:

 
Executable: 
TimeDateStamp: 4a086937 
Debug info: 2 (CodeView) 
TimeStamp: 4a086937 Characteristics: 0 MajorVer: 0 MinorVer: 0 
Size: 123 RVA: 00380460 FileOffset: 00380460 
CodeView format: RSDS 
Signature: (my guid) Age: 19 
PdbFile: (my path) 

Debug information file: 
Format: PDB 7.00 
Signature: (my matching guid) Age: 19 

abrí las dos versiones de la DLL y fui a offset 00380460. En la versión original, lo suficientemente claro veo el nombre del pdb, pero en la versión postprocesada no hay información de pdb en ese desplazamiento. Busqué el camino pdb y encontré exactamente el mismo bloque, solo que en un desplazamiento diferente. Luego busqué bin los bytes "38 00 60 04" en el dll original. Mirando el mismo desplazamiento en el dll procesado, encontré los mismos bytes. Así que ajusté el RVA y el desplazamiento (localizado al hacer coincidir los bytes). ¡Bingo! Ahora chkmatch informa exactamente los mismos resultados para el dll procesado que el original (aparte del RVA y FileOffset que cambié).

Editar: Confirmado, ahora Visual Studio carga los símbolos de vuelcos que hacen referencia al dll procesado.

+0

+1: Gracias por regresar con una descripción tan detallada. – RichieHindle

2

en Windbg intente utilizando el .symopt +40, esto forzará la carga del pdb.

+0

Intenté con el dll procesado original, pero no importó en este caso, sospecho que debido a que RVA y FileOffsets estaban simplemente equivocados después del paso de compilación posterior. –

Cuestiones relacionadas