2013-05-17 17 views
5

Mam dziwny problem z moim serwerem z wieloma wątkami. Jest to usługa Windows i działa podobnie jak serwer FTP zarządzający połączeniem z gniazdem dla wielu klientów. Został stworzony przy użyciu Delphi 2006 (Turbo Delphi) i działa dobrze na większości maszyn. Niestety na niektórych komputerach czasami ulega awarii bez żadnego śladu od samego siebie (wyjątek powinien być zapisany w dzienniku, ale nie jest). Czasami System pokazuje MessageBox (nie jest MessageBox ze służby, ale myślę, że to jest system MessageBox), ale najczęściej widzę takiej informacji w systemie Eventlog:Dziwny wyjątek 0x0eedfade w wielowątkowym programie Delphi

Application popup: ht_switch.exe - Application Error : The exception unknown software exception (0x0eedfade) occurred in the application at location 0x77e4bef7. 

w zgłoszeniu Eventlog widzę:

Faulting application ht_switch.exe, version 1.2.0.2, faulting module kernel32.dll, version 5.2.3790.5069, fault address 0x0000bef7. 

Czasami takie wpisy są w aplikacji lub dzienniku zdarzeń systemowych, ale nic się nie dzieje - mój serwer działa tak jak zwykle, ale czasami po prostu znika. Następnie Menedżer usług zgłasza w EventlLog, że moja usługa została nieoczekiwanie zatrzymana.

Nie widzę żadnego "powszechnego" scenariusza takiego problemu. Pojawia się na niektórych WinXP, Win2003 i Win2008. Wszystkie maszyny testowe mają wszystkie zastosowane łaty MS.

Czytałem odpowiedzi na: 0x0eedfade kernelbase.dll faulting module in d7 windows service, ale nie używam jednostki Dialog.

Co mogę zrobić, aby to naprawić? Jak śledzić wyjątek od 0x0eedfade?

EDIT

testowałem przez kilka dni mój serwer zarówno EurekaLog i madExcept.

EurekaLog:

Serwer działa bez problemu. W dzienniku zdarzeń nie odnotowano wyjątku. Żaden wyjątek nie został zgłoszony w %AppData%\EurekaLab s.a.s\EurekaLog\Bug Reports\ (powinien istnieć katalog dla mojego programu, ale nie został utworzony - nie wiem, czy powinien on zostać utworzony, czy jest to błąd EurekaLog).

EurekaLog7 ma problem z ustawieniem "Typ aplikacji" na usługę Windows. Jest to znany problem i pracują nad nim autorzy. Moja usługa skompilowana z nim działa na WinXP, ale nie była w stanie pracować na Win2003. Po prostu się nie uruchamia.

madExcept:

Server pracował przez 4 godziny i rozbił się. Wyjąłem ten wyjątek w moim wątku:

EAccessViolation: Access violation at address 7C90100B in module 'ntdll.dll'. Read of address 00000018!!! 

Nie zauważyłem żadnego raportu madExcept na temat tego wyjątku. Po tym wyjątku utracono jeden wątek z gniazdem w stanie CLOSE_WAIT (połączenie z drugiej strony zamknięte). Potem ponownie uruchomiłem moją usługę i po następnych kilku godzinach działało bez problemu.

niepełnosprawnych EurekaLog i madExcept:

Po 10-30 minutach widzę MessageBox z błędem. Ale błąd 0x0eedfade jest tajemniczy i nie pokazuje mi żadnych wskazówek na temat źródła problemu. Jest to również bardzo dziwne, ponieważ po wyświetleniu takiej usługi wiadomości działa bez problemu (przez większość czasu).

Podsumowanie OD wyjątków przechwytujących:

EurekaLog i madExcept są prawdopodobnie dobre na wyjątki podniesione przez Delphi, ale wydaje się, że zachowanie zmiana mojego serwisu i błędów magicznie zniknęły albo zgłosić wyjątek, aby umieścić nie mogę znaleźć.

EDIT: Problem rozwiązany

Po pewnym debugowania, które prowadzą mnie do nikąd (Call Stack z bardzo dziwnych miejscach) zrezygnowałem z niego i zaczął sprawdzać wreszcie popełnił zmian. Jedną zmianą była operacja łańcuchowa, w której łańcuch (AnsiString) może mieć długość 64 lub 128 (jakiś rodzaj maski bitowej). Ustawiłem 70. znak ciągu, który wcześniej został przydzielony z SetLength(buffer, 64). To był problem. Myślę, że zaoszczędziłbym czas, włączając sprawdzanie zasięgu.

Odpowiedz

6

Jak śledzić wyjątek 0x0eedfade?

To jest kod dla wyjątku Delphi. Najwyraźniej podnosisz wyjątek Delphi, który nie jest obsługiwany i powoduje obniżenie twojego procesu.

Powinieneś dodać madExcept, EurekaLog, JCLDebug lub podobny proces. Narzędzia te będą generować raporty diagnostyczne, gdy proces się nie powiedzie. Najbardziej użyteczną częścią tych raportów będzie ślad stosu w punkcie awarii. Powinieneś być w stanie wyliczyć, gdzie wystąpi awaria, a to zwykle wystarczy, aby ustalić, co jest nie tak z twoim kodem.

+0

Dzięki, zacząłem od EurekaLog, ale wygląda na to, że najnowsza wersja tego narzędzia zawiera błąd, który nie pozwala na ustawienie typu projektu "VCL Windows Service". Ale skompilowałem moją usługę z typem projektu "Ustawienia niestandardowe", rozpocząłem testy i obserwuję, co się stanie. –

+3

Osobiście jestem użytkownikiem madExcept. Mam tylko pochwałę za to narzędzie. –

+0

Na jednej z maszyn testowych mój serwer bez takich narzędzi zgłosił "0x0eedfade" po 10-15 minutach testów. Z EurekaLog nie ma takiego wyjątku ani nie logujemy się do katalogu "Raporty o błędach". Nie wiem, czy teraz problem zniknął, czy EurekaLog zmienił coś, co "naprawił" system lub ukrył błąd. Teraz testuję to z madExcept. –

Powiązane problemy