문제

나는 호출 된 오픈 소스 제품을 사용합니다 evemon .NET 2.0 플랫폼을 타겟팅하는 C#에 작성된 저는 우리가 해결할 수없는 이상한 .NET 충돌로 고통받는 사용자가 있습니다.

Event Type: Error
Event Source: .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID: 5000
Date: 4/29/2009
Time: 10:58:10 PM
User: N/A
Computer: removed this
Description:
EventType clr20r3, P1 evemon.exe, P2 1.2.7.1301, P3 49ea37c8, P4
system.windows.forms, P5 2.0.0.0, P6 4889dee7, P7 6cd3, P8 18, P9
system.argumentexception, P10 NIL.

Data:
//hex representation of the above Description

애플리케이션 자체는 오류가 표시되지 않으면 (UI를 처리하는 오류가 있음에도 불구하고) 위의 메시지는 Windows 이벤트 로그에서 복사되었습니다. 최종 사용자는 .NET을 다시 설치하고 최신 버전으로 업데이트했습니다. .pdb 파일은 프로그램의 모든 릴리스 버전과 함께 배포되어 디버깅 및 테스트를 돕습니다. 문제가있는 사용자는 올바른 버전의 Evemon에 대한 PDB 파일을 완전히 보완합니다.

이러한 유형의 충돌을 분석하고 진단하기위한 구체적이고 시도 된 테스트 기술이 있습니까? 그렇다면 디버깅을 돕기 위해 어떤 도구와 기술을 사용할 수 있습니까?

특별한 감사

Steffen Opel에게 특별한 감사를 드리고 그의 대답 내가 묻는 질문에 직접 대답하지는 않았지만, 글로벌 오류 처리에 중요한 구성 요소가 누락 된 코드 기반의 더 큰 문제를 해결했습니다.

도움이 되었습니까?

해결책

이것이 충돌로 최종 사용자의 문제를 해결하는 방법입니다.

  1. Windows 용 디버깅 도구를 다운로드하여 설치하십시오 http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  2. 도구가 설치되면 (기본적으로 C : Program Files 로 이동) 명령 줄 창을 시작하십시오.

  3. Adplus가 포함 된 디렉토리로 변경합니다 (예 : "C : Program Files Windows 용 도구 (x86)").

  4. Follwing 명령을 실행하십시오. 이렇게하면 응용 프로그램이 시작되고 adplus가 첨부됩니다.

adplus -crash -o C:\debug\ -FullOnFirst -sc C:\path\to\your\app.exe

충돌 덤프가 생성 된 후

애플리케이션이 충돌하면 WindBG를 시작하고 c : debug에서 생성 된 .dmp 파일을로드하십시오. (파일 -> 오픈 충돌 덤프)

이 명령을 실행하여 스택 추적을보고 문제를 찾기를 바랍니다.

디버깅을 위해 SOS를로드합니다

  • Pre .NET 4.0
.loadby sos mscorwks
  • .NET 4.0
.loadby sos clr

스택 추적을 볼 수 있습니다

!clrstack

더 유용한 스택 추적을 볼 수 있습니다

!clrstack –p

물체 안에서 찌르려면 .. perhaps 예외가 발생한 원인을보십시오.

!do <address>

예를 들어 IO 예외로 무작위로 결함이있는 응용 프로그램의 결과입니다. Windbg는 언급 된 경로를 잘못 지적했습니다.

0:009> !do 017f2b7c    
Name: System.String    
MethodTable: 790fd8c4    
EEClass: 790fd824    
Size: 124(0x7c) bytes    
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)    
String: \\server\path\not_here.txt
Fields:    
      MT    Field   Offset                 Type VT     Attr    Value Name    
79102290  4000096        4         System.Int32  1 instance       54 m_arrayLength    
79102290  4000097        8         System.Int32  1 instance       53 m_stringLength    
790ff328  4000098        c          System.Char  1 instance       5c m_firstChar    
790fd8c4  4000099       10        System.String  0   shared   static Empty    
    >> Domain:Value  00161df8:790d884c <<    
7912dd40  400009a       14        System.Char[]  0   shared   static WhitespaceChars    
    >> Domain:Value  00161df8:014113e8 <<

다른 팁

소스 코드 (Trunk)를 엿볼 수 있으면 처리되지 않은 예외 처리가 Windows Forms Applications와 관련하여 불완전한 것 같습니다.

당신은 처리해야합니다 둘 다 비 UI 스레드 예외 및 UI 스레드 예외 :

  • 전자의 경우 CLR이없는 예외 핸들러를 구현해야합니다. AppDomain.CurrentDomain.UnhandledException, 이미 제자리에 있습니다.

  • 후자의 경우 Windows Forms Unbandled Exception Handler를 통해 구현해야합니다. Application.ThreadException, 누락 된 것 같습니다. 이것은 실제로 당신이 목격하는 문제를 정확하게 생성 할 수 있습니다. 구현 예는 MSDN 문서를 참조하십시오 application.threadexception 이벤트.

지금 당장 도착하지 않은 Windows Forms를 통해 예외를 명시 적으로 억제합니다. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException), 당신은 이것을 변경해야합니다 UnhandledExceptionMode.CatchException 핸들러로 라우팅을 가능하게합니다 Application.ThreadException, 이미 Jehof가 올바르게 제안했듯이.

사용자는 어떤 OS (Windows XP, Windows Vista 등)를 사용합니까?

Windows Vista가 "문제 보고서 및 솔루션 기능"(제어판-> 문제 보고서 및 솔루션-> 변경 설정-> 고급 설정-> 프로그램의 끄기, 문제보고)를 비활성화하려고합니다.

또는 설정하려고합니다

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

이것은 항상 스레드 렉싱 핸들러에 대한 예외를 경로합니다.

간단히 말해서 : 응용 프로그램에는 도대치되지 않은 예외가 있습니다.

기계에 액세스 할 수있는 경우 (원격 액세스 등을 통해) Visual Studio Express를 설치하고 응용 프로그램을 시작하십시오. 새로운 비주얼 스튜디오 인스턴스로 응용 프로그램을 디버깅 할 수있는 대화 상자가 표시되어야합니다.

또한 Windows 형태가 제대로 초기화되는 것을 방지하는 것이있을 수도 있습니다. 글꼴 문제가이를 일으킬 수 있음을 시사하는 포럼 게시물을 보았습니다. 사용자가 응용 프로그램이 필요하다는 글꼴과 MS Sansserif, Arial, Tahoma, Times 등과 같은 일반적인 기본값이 설치되어 있는지 확인하십시오.

그리고 실패했습니다 ... PC를 통해 닭을 희생하십시오. 매번 매력적으로 작동합니다!

스레드 코드의 예외에 문제가있었습니다. 새 스레드를 생성하고 스레드 메소드에서 예외를 처리하는 것을 잊어 버린 경우 응용 프로그램은 "중지"입니다. 오류 메시지가없고 아무것도없고 이벤트 로그의 항목 만 가능합니다. 그때조차도 UnhandledExceptionHandler 트리거됩니다.

아마도 이런 것이 원인일까요?

... 그 고통받는 사용자에게 연락 할 수 있다면 다음은 다음과 같습니다.

아이디어 : 로그 사전 실행 단계

당신에게 바로 가기를하는 대신 program.exe, 바로 가기를 만듭니다 program.bat, 그것은 할 것입니다

echo "Pre-start" > stage.txt
start program.exe

첫 번째 줄 Program.cs 그러므로

File.WriteAllLines("stage.txt", "Program execution started.");

핸들러에서 AppDomain.UnhandledException 첫 번째 줄이 될 것입니다

File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");

또한 핸들러가 메모리 나 리소스를 할당하지 않도록하십시오. 프로그램 시작시 사전 할당하십시오. 핸들러는 글을 로그에만 트리거합니다.

코멘트

그럴 가능성이 큽니다 stage.txt (사용자가 보낸)에는 "사전 시작"이 포함됩니다. 이것은 프로그램이 시작되기 전에도 제 3 자 .dll에서 예외가 발생하면 발생합니다.

이 경우 간단한 체커 프로그램이 필요합니다. program.exe 그러나하지만 의지 Assembly.Load(...) 그들을.

추신

stage.txt 프로그램 파일이 아닌 %AppData %미만 어딘가에 배치해야합니다.

나는 찾았다 서버 2003의 흥미로운 사례 그리고 또 다른 멋진 토론.

당신은 .pdb 사용자에게 해당 특정 릴리스에 대한 파일 (옆에 배치됩니다. .exe) 그리고 그들이 충돌을 재현하게한다.

당신은 처리해야합니다 AppDomain.UnhandledException 코드에서.

거기가 있었다 비슷한 질문 물었다. 관련 것도 참조하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top