2012-05-26 12 views
13

mogę uzyskać informację o parametrze przez StackTrace użyciu coś takiego:Jak uzyskać wartości parametrów w stacktrace

catch (Exception ex) 
{ 
    var st = new StackTrace(ex); 

    System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); 
} 

Chcę wiedzieć, jak uzyskać wartość parametru. Przykład:

Jeśli moja metoda w ślad stosu było jak:

void MyMethod(object value) 

a rozmowa była jak:

MyMethod(10); 

chcę uzyskać wartość 10. Jak to zrobić?

+0

możliwy duplikat [Czy możliwe jest uzyskanie wartości parametrów dla każdej klatki w stosie wywołań w .NET] (http://stackoverflow.com/questions/819576/is-it-possible-to-get-parameters- wartości dla każdej klatki w zestawie połączeń w sieci) – nawfal

Odpowiedz

9

Istnieją dwa sposoby. Mocniejszy jest interfejs COM API do debugowania .NET. Na przykład argumenty i zmienne lokalne funkcji w stosie wywołań są dostępne od ICorDebugILFrame. Ale to musi być uruchamiane z oddzielnego procesu, który jest dołączony do twojego procesu jako debugger.

Dla introspekcji wewnątrzprocesowej istnieje Profiler API, which also can find information about function arguments. Spójrz na informacje o "stosach cienia".

+0

fyi, Twój drugi link jest martwy – Fredou

+1

@Fredou: Dzięki za poinformowanie mnie, zaktualizowałem link do nowego adresu informacji. –

+0

Przykład proszę! – Demodave

3

Nie w języku C#, chyba że tworzy się rozwiązanie zależne od wersji CLR (łatki). Ale to, co działa jest dołączenie WinDBG do procesu ładowania sos.dll przełącznik do wątku i wpisz

!ClrStack -p 

pokazać zarządzanego stosu wywołań i parametry metoda większości metod. Nawet w przypadku debuggera nie jest to niezawodne, ponieważ dzięki optymalizacji inline i optymalizacji JIT układ stosu jest bardzo elastyczny. Poza tym niektóre parametry mogą nawet nie pojawić się w pamięci stosu, ponieważ są przekazywane za pośrednictwem rejestrów (co jest jeszcze bardziej powszechne w przypadku platformy x64).

Aby odpowiedzieć na pierwsze pytanie. Nie jest to możliwe przy podejściu, które próbujesz. Roztwór roboczy byłby możliwy, ale wcale nie przenośny. Zarządzany debugger może częściowo odzyskać twoje argumenty, ale nie ma 100% działającego rozwiązania (nawet pod debuggerem).

Powiązane problemy