2013-05-17 3 views
5

내 멀티 스레드 서버에 이상한 문제가 있습니다. 이것은 Windows 서비스이며 많은 클라이언트에 대한 소켓 연결을 관리하는 FTP 서버와 유사하게 작동합니다. Delphi 2006 (Turbo Delphi)을 사용하여 생성되었으며 대부분의 시스템에서 잘 작동합니다. 불행히도 일부 컴퓨터에서는 때때로 자체적으로 추적하지 않고 충돌합니다 (예외는 로그에 저장해야하지만 그렇지 않습니다). 때때로 시스템은 메시지 박스를 (이 서비스에서 메시지 박스 아니지만, 나는 그것이 시스템 메시지 박스를 생각) 표시하지만 대부분의 자주 시스템은 EventLog에서 이러한 정보를 참조하십시오Delphi 멀티 스레드 프로그램에서 이상한 0x0eedfade 예외

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

이 응용 프로그램은 EventLog에서 내가 볼 수 있습니다

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

가끔 이러한 항목이 응용 프로그램 또는 시스템 EventLog에 있지만 아무 일도 일어나지 않습니다 - 내 서버는 일반적으로 작동하지만 때때로 사라집니다. 그런 다음 Service Manager가 EventlLog에서 내 서비스가 예기치 않게 중지되었다고보고합니다.

이러한 문제에 대해서는 "일반적인"시나리오가 없습니다. 일부 WinXP, Win2003 및 Win2008에 나타납니다. 모든 테스트 머신에는 모든 MS 패치가 적용됩니다.

나는 0x0eedfade kernelbase.dll faulting module in d7 windows service에 대한 답변을 읽었지만 Dialog 단위는 사용하지 않습니다.

수리하려면 어떻게해야합니까? 그러한 0x0eedfade 예외를 추적하는 방법?

내가 EurekaLog와 madExcept 모두 몇 일 동안 내 서버를 테스트

편집 할 수 있습니다.

EurekaLog :

서버가 문제없이 작동합니다. EventLog에는 예외가보고되지 않습니다. %AppData%\EurekaLab s.a.s\EurekaLog\Bug Reports\에 예외가보고되지 않았습니다 (내 프로그램 용 디렉토리가 있어야하지만 작성되지 않았습니다 - 작성해야하는지 또는 EurekaLog 오류인지 여부는 알 수 없음).

EurekaLog7은 Windows 서비스에 "응용 프로그램 유형"설정에 문제가 있습니다. 알려진 문제이며 작성자가 이에 대해 작업합니다. 내 서비스는 WinXP에서 작동하지만 Win2003에서는 작동하지 않습니다. 그것은 단순히 시작하지 않습니다.

madExcept :

서버는 4 시간 근무 추락했다. 내 스레드 에서이 예외를 잡았습니다 :

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

이 예외에 대한 madExcept 보고서를 발견하지 못했습니다. 이 예외가 발생하면 CLOSE_WAIT 상태 (다른 쪽이 닫힌 연결)의 소켓으로 인해 하나의 스레드가 손실되었습니다. 그런 다음 서비스를 다시 시작한 후 몇 시간 후 아무 문제없이 작동했습니다.

장애인 EurekaLog와 madExcept :

10 ~ 30 분 후 나는 오류 메시지 박스를 참조하십시오. 그러나 0x0eedfade 오류는 신빙성이 없으며 문제의 원인에 대한 힌트를 표시하지 않습니다. 또한 이러한 메시지 서비스를 표시 한 후에 문제없이 (대부분의 경우) 작동하기 때문에 매우 이상합니다.

요약 OD 예외 인터셉터는 :

EurekaLog와 madExcept은 델파이에 의해 발행되는 예외에 아마 좋은하지만 내 서비스의 변경 동작을 보인다 오류가 마법 사라 또는 내가 찾을 수 없습니다 배치하는 예외를보고합니다.

편집 : 문제는 나에게 아무데도 내가 사임하고 마지막으로 최선을 다하고 변화를 조사하기 시작했다 (매우 이상한 장소로 스택을 호출하지 않음)으로 이어질 디버깅 후

를 해결했다. 하나의 변경 사항은 문자열 연산이었습니다. 여기서 string (AnsiString)은 64 또는 128 (일종의 비트 마스크) 일 수 있습니다. 이전에 SetLength(buffer, 64)으로 할당 된 문자열의 70 번째 문자를 설정했습니다. 그것이 문제였습니다. 범위 검사를 사용하면 시간을 절약 할 수 있다고 생각합니다.

답변

6

0x0eedfade 예외를 추적하는 방법은 무엇입니까?

이것은 Delphi 예외 코드입니다. 분명히 처리되지 않고 프로세스를 중단시키는 Delphi 예외를 제기하고 있습니다.

madExcept, EurekaLog, JCLDebug 또는 유사하게 프로세스에 추가해야합니다. 이러한 도구는 프로세스가 실패 할 때 진단 보고서를 생성합니다. 이러한 보고서 중 가장 유용한 부분은 실패 시점의 스택 추적입니다. 최소한 오류가 발생한 부분을 해결할 수 있어야하며 일반적으로 코드에 문제가있는 것만으로도 충분합니다.

+0

감사합니다. EurekaLog로 시작했지만이 도구의 최신 버전에는 "VCL Windows Service"프로젝트 유형을 설정할 수없는 버그가있는 것으로 보입니다. 그러나 "Custom settings"프로젝트 유형으로 서비스를 컴파일하고 테스트를 시작했으며 어떤 일이 일어날 지 지켜보고 있습니다. –

+3

개인적으로 나는 madExcept 사용자입니다. 나는 그 도구에 대해 칭찬 만하고있다. –

+0

테스트 머신 중 하나에서 그런 툴이없는 서버는 10-15 분의 테스트 후에'0x0eedfade'를보고했습니다. EurekaLog를 사용하면 "Bug Raports"디렉토리에 예외가 없으며 로그인 할 필요가 없습니다. 지금 문제가 사라지거나 EurekaLog가 시스템을 "수리"하거나 오류를 숨기는 것을 변경했는지는 알 수 없습니다. 이제 madExcept로 테스트하고 있습니다. –

관련 문제