2009-04-20 11 views
21

Si tengo una DLL (que se creó en modo de lanzamiento) y el archivo PDB correspondiente, ¿es posible depurar (entrar) las clases/métodos contenidos en esa DLL?Depuración de una versión de lanzamiento de una DLL (con archivo PDB)

En caso afirmativo, ¿cuáles son los pasos/configuración necesarios (por ejemplo, dónde colocar el archivo PDB)?

Editar:

Si tiene el archivo PDB en el mismo lugar que la DLL (en el directorio bin/debug de una simple aplicación de prueba de la consola). Puedo ver que los símbolos de la DLL están cargados (en la ventana de Salida y también en la ventana de Módulos), pero aún no puedo entrar en los métodos de esa DLL.

¿Podría ser esto el resultado de las optimizaciones del compilador (como lo describe Michael en su respuesta)?

Respuesta

5

fin encontré lo que causa los problemas de depuración de un archivo DLL que se construyó en configuración de liberación:

En primer lugar, funciona básicamente como se esperaba. Lo que significa que si tengo una DLL incorporada en la configuración de lanzamiento más el correspondiente archivo PDB, entonces puedo depurar las clases/métodos contenidos en esa DLL.

La primera vez que lo intenté, desafortunadamente traté de entrar en los métodos de una clase que tiene el DebuggerStepThroughAttribute, e.g:

[System.Diagnostics.DebuggerStepThrough] 
public class MyClass { 
    public void Test() { ... } 
} 

En ese caso, es, por supuesto, no es posible entrar en el método desde el depurador (como se esperaba/previsto).

Así que todo funciona según lo previsto. Muchas gracias por sus respuestas.

14

El pdb generalmente se detecta (al menos para mí) si está al lado del dll (como con los archivos xml de intellisense).

Alternativamente; Necesitará un punto de interrupción después de que el módulo se haya cargado ...

En el punto de interrupción, abra la ventana "Módulos" (Ctrl + D, M - o Depuración-> Windows-> Módulos). Haga clic derecho en su dll "Cargar símbolos desde", "Ruta del símbolo", etc.

+2

El PDB está al lado de la DLL, los símbolos están cargados, pero todavía no puedo entrar en los métodos. ¿Alguna idea? – M4N

5

Sí, puede depurar el código de liberación con un PDB. Sin embargo, hay algunos inconvenientes con la depuración del código optimizado, más información here y here.

Su AP sólo tiene que ser en un lugar que el depurador puede encontrarlo - para la depuración local mismo directorio que el archivo DLL es generalmente más fácil. De lo contrario, colóquelo en un lugar donde el depurador pueda encontrarlo y dirija el depurador a ese lugar con la ruta del símbolo.

2

La depuración de una compilación de lanzamiento suele ser mucho más difícil que la depuración de una versión de depuración. En general, necesitará cierta comprensión del ensamblador x86 y probablemente pasará algún tiempo mirando la ventana de desensamblaje. Esto tiende a ser la única forma de descubrir en qué línea de código está realmente puesto, ya que en una compilación de lanzamiento con optimizaciones en el compilador puede hacer una importante reordenación y reordenamiento de instrucciones. Además, encuentro que el depurador con frecuencia no informa correctamente los valores de las variables. Si necesita conocer el valor de una variable y no está seguro de que el depurador sea correcto, vaya a la ventana de desensamblaje y encuentre la ubicación de la memoria o regístrela.

Los archivos pdb pueden almacenarse en un Servidor de símbolos. Consulte Setting up a Symbol Server para obtener un buen tutorial. Cada producto que creamos en una máquina de compilación publica los símbolos en nuestro servidor de símbolos, por lo que siempre podemos depurar los volcados de emergencia que recibimos de WinQual.

Cuestiones relacionadas