2013-05-24 14 views
9

Mam problem z odtworzeniem kilku błędów, które widzimy w naszym dzienniku błędów.Uzyskaj wartości parametrów w stosie śledzenia

Mogłoby być znacznie łatwiejsze, gdybym wiedział, który identyfikator rekordu użył konkretnej metody, gdy rzucił wyjątek.

Wszystkie nasze nieobsługiwane wyjątki są obsługiwane przez naszą globalną procedurę obsługi wyjątków, która umieszcza wszystkie szczegóły wyjątku, a także wszystkie szczegóły żądania HTTP, w tabeli dziennika.

Czy istnieje sposób przechwytywania wartości wszystkich parametrów metody, która rzuciła wyjątek? A może nawet lepiej, wszystkie wartości w górę śledzenia stosu?

+1

Nie ma sposobu, aby zrobić to z wewnątrz CLR, jednak niektóre narzędzia, takie jak AVIcode, mogą to zrobić przez podłączenie do CLR z zewnątrz, zasadniczo za pomocą haków do debugowania, aby uzyskać informacje. –

+1

Możesz wypróbować o log4net http://logging.apache.org/log4net/. Możesz po prostu skonfigurować, jeśli chcesz zobaczyć błąd śledzenia stosu – Rodrigo

+1

Możesz skonfigurować ProcDump (sysinternals), aby przechwycić pełne zrzuty pamięci zarządzanego kodu, gdy wystąpią określone wyjątki. Następnie możesz użyć psscor4 (kod debugowania zarządzanego kodu dla windbg), aby sprawdzić stan procesu, gdy wystąpił wyjątek - ten materiał nie jest jednak przeznaczony dla osób o słabych nerwach ... –

Odpowiedz

12

Niestety, nie jest to możliwe: w momencie wychwycenia wyjątku w procedurze obsługi wszystkie ramki stosu z parametrami metody zniknęły. Gdy kontrolka opuszcza twoją funkcję, nie możesz już uzyskać dostępu do jej wartości parametrów.

Ponieważ znasz konkretną funkcję, w której zdarzyła się awaria, możesz ustawić tam program obsługi wyjątków, aby zebrać wszystkie interesujące parametry i ponownie rzucić zawinięty wyjątek. Po zakończeniu diagnostyki, można przywrócić kod wraca do normy:

void SuspiciousFunction(string name, long count) { 
    try { 
     // The code of your function goes here 
    } catch (Exception e) { 
     var args = new Dictionary<string,object> { 
      { "name" , name } 
     , { "count", count } 
     }; 
     throw new MySpecialException(e, args); 
    } 
} 
3

Chciałbym uchwycić wyjątek w metodzie, w którą został on zgłoszony, zebrać parametry i wszelkie inne potrzebne informacje, a następnie ponownie zgłosić błąd za pomocą nowego wyjątku ApplicationException lub innego niestandardowego wyjątku zawierającego dodatkowe informacje.

-1

Z dokumentacji Environment.StackTrace chciałbym powiedzieć, że jest to możliwe. Mówią

Informacje ślad stosu dla każdego wywołania metody jest sformatowany w następujący sposób:

"w FullClassName MethodName (MethodParams) w pliku:. Linia LineNumber"

+5

W tym kontekście 'MethodParams' to nazwy i typy, a nie wartości, na przykład' w System.Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (Źródło IEnumerable'1, Func'2 keySelector, Func'2 elementSelector, IEqualityComparer '1 porównujący)' – Axarydax

Powiązane problemy