How to decompile pdb to get C# source code?
Asked Answered
L

3

7

My scenario: I want to write in log file part of code where exception has happened (for example 5 lines before and 5 lines after line where exception happened - or at least all the code of that method).

My idea is to decompile pdb file in C# code and from that decompiled file find a method that went in exception in catch block.

Pbd file exists and my app is build as debug version. I know that there are tools that allows through its GUI (for example Reflector) to do decompiling but I want to have that functionality from my code.

How to do it?

Lecroy answered 4/7, 2011 at 21:4 Comment(1)
The CLR already uses the .pdb file. That's what produces the source code and line number annotations in the exception's StackTrace. Compare to the stack trace you get without the .pdb file in place to see there difference. There's no point in looking for more, that's what is possible.Conception
H
5

The PDB contains the mapping between MSIL and source filename / line number. This is most useful when you can go back and look at the original source files, because decompilation typically doesn't preserve line numbers (although it could if it also used the PDB file). It certainly doesn't recover the original code exactly as written, although with symbol names (also stored in the PDB) it often comes close.

Hurff answered 4/7, 2011 at 21:53 Comment(0)
J
2

Look into the source-code of ILSpy. It's an open source alternative for Reflector.

In particular it uses the libraries Mono.Cecil and Mono.Cecil.Pdb. I suspect the latter can help you with what you want to do.

The relevant code parts use the MIT license, which is a permissive license.

Jammiejammin answered 4/7, 2011 at 21:50 Comment(4)
Please avoid ILSpy and use Reflector, you will save yourself a few problems.Insightful
@BartoszWójcik Could you please explain why using Mono.Cecil.Pdb isn't a good choice?Jammiejammin
The same reason de4dot abandoned Mono.Cecil for .NET manipulationsInsightful
@BartoszWójcik How would you embed Reflector into your application to generate extended debug information? Does its license even allow that?Jammiejammin
L
-1

Use reflection to get the source code of executing method: System.Reflection.MethodBase.GetCurrentMethod().GetMethodBody();

There is a variety of info you can get using MethodBase members: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase_methods.aspx

Also look in here for some good example for getting MethodBase info while exception handling : http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx#Y563

Larose answered 4/7, 2011 at 21:56 Comment(1)
GetMethodBody() doesn't allow me to see source code of the method.Lecroy

© 2022 - 2024 — McMap. All rights reserved.