2011-07-04 60 views
7

Mi escenario: quiero escribir en el archivo de registro de parte del código donde ha ocurrido una excepción (por ejemplo, 5 líneas antes y 5 líneas después de la línea donde se produjo la excepción - o por lo menos todo el código de este método).¿Cómo descompilar pdb para obtener el código fuente de C#?

Mi idea es descompilar archivo PDB en código C# y de ese archivo decompilados encontrar un método que entró excepción en bloque catch. existe

archivo Pbd y mi aplicación está construida como la versión de depuración. Sé que hay herramientas que permiten a través de su GUI (por ejemplo, Reflector) descompilar, pero quiero tener esa funcionalidad de mi código.

¿Cómo hacerlo?

+0

el CLR ya se utiliza el archivo .pdb. Eso es lo que produce el código fuente y las anotaciones del número de línea en StackTrace de la excepción. Compare con el seguimiento de la pila que obtiene sin el archivo .pdb en su lugar para ver la diferencia. No tiene sentido buscar más, eso es lo que es posible. –

Respuesta

2

Busca en el código fuente de ILSpy. Es una alternativa de código abierto para Reflector.

En particular, se utiliza las bibliotecas Mono.Cecil y Mono.Cecil.Pdb. Sospecho que este último puede ayudarte con lo que quieres hacer.

Las partes pertinentes de código utilizan la licencia MIT, que es una licencia permisiva.

+0

Por favor, evite ILSpy y use Reflector, se ahorrará algunos problemas. –

+1

@ BartoszWójcik ¿Podría explicar por qué usar 'Mono.Cecil.Pdb' no es una buena opción? – CodesInChaos

+0

La misma razón de4dot abandonó Mono.Cecil para las manipulaciones de .NET, aclare sus datos. –

3

El PDB contiene el mapeo entre MSIL y número de la fuente de nombre de archivo/línea. Esto es más útil cuando puede volver atrás y mirar los archivos fuente originales, porque la descompilación generalmente no conserva los números de línea (aunque podría hacerlo si también usara el archivo PDB). Ciertamente no recupera el código original exactamente como está escrito, aunque con nombres de símbolos (también almacenados en el PDB) a menudo se acerca.

0

utilizar la reflexión para obtener el código fuente del método de ejecución: System.Reflection.MethodBase.GetCurrentMethod().GetMethodBody();

Hay una variedad de información que puede obtener utilizando miembros MethodBase: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase_methods.aspx

Ver también en aquí por un buen ejemplo para obtener información MethodBase mientras que el manejo de excepciones: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx#Y563

+0

GetMethodBody() no me permite ver el código fuente del método. – Bero

Cuestiones relacionadas