2011-07-04 74 views
7

Mój scenariusz: Chcę zapisać w pliku logu część kodu, w którym wystąpił wyjątek (na przykład 5 linii przed i 5 linii po linii, w których wystąpił wyjątek - lub przynajmniej cały kod tej metody).Jak dekompilować pdb, aby uzyskać kod źródłowy C#?

Mój pomysł polega na dekompilacji pliku pdb w kodzie C#, a z tego dekompilowanego pliku znajdź metodę, która przechodziła w wyjątek w bloku catch.

Plik Pbd istnieje, a moja aplikacja jest tworzona jako wersja do debugowania. Wiem, że istnieją narzędzia, które pozwalają poprzez GUI (na przykład Reflector) dekompilować, ale chcę mieć tę funkcjonalność z mojego kodu.

Jak to zrobić?

+0

CLR już korzysta z pliku .pdb. To właśnie tworzy adnotacje kodu źródłowego i numeru wiersza w StackTrace wyjątku. Porównaj ze stosem, który otrzymujesz bez pliku .pdb, aby zobaczyć różnicę. Nie ma sensu szukać więcej, to jest możliwe. –

Odpowiedz

2

Sprawdź kod źródłowy programu ILSpy. Jest to alternatywa open source dla Reflectora. W szczególności korzysta z bibliotek Mono.Cecil i Mono.Cecil.Pdb. Podejrzewam, że ten ostatni może ci pomóc w tym, co chcesz robić.

Odpowiednie części kodu wykorzystują licencję MIT, która jest licencją zezwalającą.

+0

Należy unikać ILSpy i używać reflektora, zaoszczędzisz sobie kilku problemów. –

+1

@ BartoszWójcik Czy możesz wyjaśnić, dlaczego użycie 'Mono.Cecil.Pdb' nie jest dobrym wyborem? – CodesInChaos

+0

Ten sam powód, dla którego de4dot porzucił Mono.Cecil dla manipulacji .NET, poznaj fakty. –

3

PDB zawiera mapowanie między MSIL a źródłową nazwą pliku/numerem linii. Jest to najbardziej przydatne, gdy można wrócić i spojrzeć na oryginalne pliki źródłowe, ponieważ dekompilacja zwykle nie zachowuje numerów linii (chociaż może, gdyby używał również pliku PDB). Z pewnością nie odzyskuje oryginalnego kodu dokładnie tak, jak zapisano, chociaż z nazwami symboli (przechowywanymi również w WPB) często się zbliża.

0

użycie odbicie w celu uzyskania kodu źródłowego metody wykonującym: System.Reflection.MethodBase.GetCurrentMethod().GetMethodBody();

Istnieje wiele informacji można uzyskać przy użyciu członków MethodBase: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase_methods.aspx

Zobacz również tutaj jakiś dobry przykład dla uzyskania informacji MethodBase podczas obsługi wyjątku: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx#Y563

+0

Funkcja GetMethodBody() nie pozwala mi zobaczyć kodu źródłowego metody. – Bero