2009-12-16 4 views
10

Estoy usando visual C# para depurar un proyecto C# grande. El proyecto es muy grande y solo algunos de los pdbs son compilados por mí mismo. Puedo construir todo el pdb, pero lleva mucho tiempo. Estoy depurando una traza inversa, pero una parte de la traza está marcada con [Código externo]. Sé que falta pdb, pero ¿cómo puedo saber en qué DLL reside el código externo? En C, puedo obtener el EIP y luego ver el mapeo del proceso para determinar dónde vive el EIP, pero ¿cómo se puede hacer esto en el entorno .Net?Retroceso de Visual C#: cómo saber dónde reside el [código externo]?

Respuesta

23

Vaya a Herramientas | Opciones | Depuración | General, y desmarque la casilla de verificación "Habilitar simplemente mi código". Ahora Visual Studio mostrará la pila de llamadas completa (al menos para el código administrado, aún puede ver algunas "transiciones nativas a gestionadas" allí).

+0

oh sí, se muestra la: \t [Originario de transición controlada] \t \t [arregló para Transición Nativo] \t Pero puedo llegar a donde va la transición? –

+0

No creo que eso sea posible a menos que tenga símbolos (PDB) para el código no administrado. VS puede hacerlo por las partes administradas del seguimiento de la pila porque los ensamblados administrados contienen metadatos, pero el código no administrado no tiene los mismos metadatos, por lo que VS no puede reconstruir las llamadas al método. Sin embargo, puede anclarlo un poco utilizando la ventana Módulos y/o la opción "Mostrar desensamblaje si la fuente no está disponible", pero no tiene experiencia en hacerlo, lo siento. – itowlson

+0

Gracias. Lo que estaba haciendo antes en Linux es que obtengo el EIP (0x800453c me gusta), luego obtengo un mapa de los mapas DLL dinámicos, luego puedo obtener el DLL al que pertenece el EIP. ¿Es factible en Visual C#? –

1

Así que si su proyecto es realmente tan grande, entonces supongo que todas sus clases están bien compartidas a lo largo de sus espacios de nombres y que todos los ensamblados llevan el nombre de los espacios de nombres que contienen. Entonces, si observa dónde comienza (o termina) su código externo, debe averiguar desde (o hacia) a dónde va la llamada y determinar el conjunto faltante pdb.

+0

En realidad, no es tan fácil como podría pensar ... –

+0

Pero entonces es un problema de organización de la solución, proyecto, ensamblado, espacio de nombres, jerarquía de clases. Esto para corregir en retrospectiva es aburrido y costoso. Así que aprende para el próximo proyecto e implementa una buena estructura al principio. – Oliver

+0

Por ahora, acaba de construir todos los pdbs (quizás durante la noche). Esto sería más rápido que buscar una solución (tal vez no existente) por días. – Oliver

Cuestiones relacionadas