2010-02-04 11 views
5

Wiem, że otwieram się na królewski płomień, nawet pytając o to, ale pomyślałem, że zobaczę, czy StackOverflow ma jakieś rozwiązania problemu, który mam ...Obsługa niegrzeczna aplikacja przerywa w .NET

Mam aplikację C#, która zawiedzie w witrynie klienta w sposób, którego nie mogę odtworzyć lokalnie. Niestety bardzo trudno (moim zdaniem) uzyskać wszelkie informacje, które w ogóle pomagają w wyizolowaniu źródła problemu.

mam w miejscu dość szerokie ramy monitorowania błędów, który jest oglądanie na nieobsłużonych wyjątków we wszystkich standardowych lokalizacjach:

  • Backstop obsługi wyjątku w wątkach kontrolować
  • Application.ThreadException dla WinForms wyjątkami
  • AppDomain.CurrentDomain.UnhandledException

Który rejestruje szczegółowe informacje w miejscu, w którym mam do nich dostęp.

To było bardzo przydatne w przeszłości do identyfikowania problemów w kodzie produkcyjnym, ale nie dało mi żadnych informacji na temat aktualnej serii problemów.

Moje najlepsze przypuszczenie jest takie, że podstawowym problemem jest jeden z "nieuporządkowanych" typów wyjątków (wątek przerwany, brak pamięci, przepełnienie stosu, naruszenie zasad dostępu itp.), Które eskalują do niegrzecznego zamknięcia, które zrywają proces, zanim będę mógł zobaczyć, co się dzieje.

Czy jest coś, co mogę zrobić, aby uzyskać informacje o migawkach, ponieważ mój proces ulega awarii, który byłby przydatny? W idealnej sytuacji byłbym w stanie napisać mój niestandardowy format dziennika, ale byłbym szczęśliwy, gdybym mógł mieć niezawodny sposób, aby gdzieś zapisać zapis awaryjny.

Miałem nadzieję, że mogę zaimplementować klasę wywodzącą się z CriticalFinalizerObject i wypluć logi błędu ostatniej szansy, gdy jest ona utylizowana, ale to nie wydaje się być wyzwalane w scenariuszu StackOverflow, który testowałem.

Nie mogę korzystać z raportów błędów systemu Windows i znajomych z powodu braku certyfikatu podpisywania kodu.

Nie próbuję "odzyskać" z arbitralnych wyjątków, próbuję tylko odnotować, co poszło nie tak po drodze w dół.

Wszelkie pomysły?

+2

To dobry pytanie. Flaming jest przede wszystkim skierowany na ogólny kod "try-catch-pretend-it-OK". Zgrabne wyłączenia i raportowanie błędów są całkowicie dopuszczalnymi przyczynami do rejestrowania globalnych procedur obsługi wyjątków. – Aaronaught

Odpowiedz

1

Możesz spróbować utworzyć plik minidump. To jest API C++, ale powinno być możliwe napisanie małego programu w C++, który uruchamia twoją aplikację, zachowuje uchwyt do procesu, czeka na uchwyt procesu, a następnie używa uchwytu procesu do utworzenia minizrzutu, gdy aplikacja umiera.

1

Jeśli zrobiłeś to, co twierdzą:

  • try-catch w sprawie wniosku.Uruchom
  • Unhandled Domena wyjątkami
  • Unhandled wyjątkami wątku
  • spróbować koparki połowowe we wszystkich wątkach

Wtedy byłby złowione wyjątek wyjątkiem być może, jeśli jest wyrzucane przez osobę trzecią lub COM składnik.

Z pewnością nie podałeś wystarczających informacji.

  • Jakie zdarzenia, według klientów, prowadzą do wyjątku?
  • Jakiego składnika COM lub komponentów innych firm używasz? (Czy poprawnie wstawiasz i odwołujesz te komponenty? Czy przekazujesz prawidłowe argumenty do wywołań funkcji COM?)
  • Czy używasz jakiegoś niezarządzanego - niezabezpieczonego kodu?
  • Czy jesteś pozytywny, czy wszystkie połączenia obsługujące funkcję throw są objęte próbą catch-catch?

Po prostu mówię, że nikt nie może zaoferować ci żadnej przydatnej porady, chyba że zamieścisz dużo więcej informacji i nawet wtedy prawdopodobnie możemy tylko spekulować na temat twojego źródła problemu.

Miej zestaw świeżych oczu na swój kod.

Niektóre błędy nie mogą zostać przechwycone przez logowanie.

Zobacz to podobne pytanie Szczegółowe informacje:

StackOverflowException in .NET

Oto link wyjaśniając asynchronicznych wyjątki (i dlaczego nie można odzyskać z nich):

http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=c1898a31-a0aa-40af-871c-7847d98f1641

+0

Istnieje magiczny zestaw wyjątków, które nie mogą zostać przechwycone przez kod zarządzany. (jak StackOverflowException). Ten kod: za pomocą System; klasa c { static void Main() { try {f(); } catch (Exception ex) {Console.WriteLine (ex); } } static void f() {f();} } nie przechwyci przepełnienia stosu, ale aplikacja się zakończy. – StarBright

+0

@StarBright - Tak, dlatego musisz przejrzeć swój kod lub najlepiej, aby ktoś go zrecenzował. –

Powiązane problemy