Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 39. DebugDiag 1.1을 사용한 덤프 분석 [링크 복사], [링크+제목 복사],
조회: 45738
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 6개 있습니다.)
(시리즈 글이 3개 있습니다.)
디버깅 기술: 39. DebugDiag 1.1을 사용한 덤프 분석
; https://www.sysnet.pe.kr/2/0/1026

디버깅 기술: 65. 프로세스 비정상 종료 시 "Debug Diagnostic Tool"를 이용해 덤프를 남기는 방법
; https://www.sysnet.pe.kr/2/0/1786

디버깅 기술: 137. 실제 사례를 통해 Debug Diagnostics 도구가 생성한 닷넷 웹 응용 프로그램의 성능 장애 보고서 설명
; https://www.sysnet.pe.kr/2/0/12067




DebugDiag 1.1을 사용한 덤프 분석

.NET Profiler의 코드를 변경하고, w3wp.exe를 프로파일링하는데 aspx 페이지를 방문하자마자 예외가 발생하면서 프로세스가 죽었습니다. 이벤트 로그에 보니 다음과 같은 오류를 확인할 수 있었는데요.

Log Name:      Application
Source:        Application Error
Date:          4/21/2011 11:53:44 PM
Event ID:      1000
Task Category: (100)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      MYPC.testad.com
Description:
Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0xc0000005
Fault offset: 0x0000000000000000
Faulting process id: 0x2d4
Faulting application start time: 0x01cc0033e50aebde
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: unknown
Report Id: 26e854a3-6c27-11e0-9940-00155d00c22a

Log Name:      Application
Source:        Windows Error Reporting
Date:          4/21/2011 11:53:47 PM
Event ID:      1001
Task Category: None
Level:         Information
Keywords:      Classic
User:          N/A
Computer:      MYPC.testad.com
Description:
Fault bucket , type 0
Event Name: BEX64
Response: Not available
Cab Id: 0

Problem signature:
P1: w3wp.exe
P2: 7.5.7601.17514
P3: 4ce7afa2
P4: StackHash_57bc
P5: 0.0.0.0
P6: 00000000
P7: 0000000000000000
P8: c0000005
P9: 0000000000000008
P10: 

Attached files:
C:\Windows\Temp\WER9269.tmp.appcompat.txt
C:\Windows\Temp\WER92C8.tmp.WERInternalMetadata.xml
C:\Windows\Temp\WER92E8.tmp.hdmp
C:\Windows\Temp\WER9B08.tmp.mdmp

...[생략]...

Watson Bucket 정보를 분석해 봐도, 모듈명이 "StackHash_57bc"라니... ^^; 뭔가 단단히 잘못된 모양입니다.

P1(AppName): w3wp.exe
P2(AppVer): 7.5.7601.17514
P3(AppStamp): 4ce7afa2
P4(AsmAndModName): StackHash_57bc
P5(AsmVer): 0.0.0.0
P6(ModStamp): 00000000
P7(MethodDef): 0000000000000000
P8(Offset): c0000005
P9(ExceptionType): 0000000000000008
P10: 

프로세스 덤프를 남길까 하다가, 이번에는 이벤트 로그에 기록되어 있던 C:\Windows\Temp\WER9B08.tmp.mdmp를 분석해 보기로 했습니다. (안 해보던 것을 해봐야죠! ^^)

분석도 windbg로 해볼까 하다가, 역시 예전부터 봐두기만 했던 DebugDiag의 자동 분석 도구를 이용하기로 마음먹었습니다.

우선, Debug Diagnostic Tool v2를 설치하고,

Debug Diagnostic Tool v2 Update 3.2
; https://www.microsoft.com/en-us/download/details.aspx?id=103453

"시작" / "Debug Diagnostics Tool 1.1" / "DebugDiag-AnalysisOnly 1.1" 도구를 실행합니다.

분석을 시작하기 전에, 2가지 설정을 해줍니다.

  1. 마이크로소프트 공용 심벌 서버 설정 (여러분들의 제품에 대한 심벌 서버 설정 포함)
  2. DebugDiag-AnalysisOnly 설정

일단 1번은 DebugDiag-AnalysisOnly도구에서도 설정할 수 있지만 _NT_SYMBOL_PATH를 해두는 것이 편리하기 때문에 아예 환경 변수로 설정해 두는 것이 좋습니다.

Microsoft의 PDB 파일 관리
; https://www.sysnet.pe.kr/2/0/321

2번은, DebugDiag-AnalysisOnly 도구의 "Tools" / "Options & Settings" 메뉴를 선택한 후 "Preferences"에서 다음과 같이 "Include source and line information in analysis reports."를 선택해 줍니다.

debug_analysis_w3wp_1.png

이렇게 설정을 마무리 지은 후에 분석 단계로 넘어가면!

방법은 매우 간단합니다. 다음과 같이 "Crash/Hang Analyzers"를 선택하고, "Add Data Files" 버튼으로 덤프 파일을 지정한 후 "Start Anaylsis" 버튼을 선택해 주면 끝입니다.

debug_analysis_w3wp_2.png

아래는 제 경우에 분석된 결과입니다.

debug_analysis_w3wp_3.png

와~~~ PDB 파일의 도움으로 크래쉬가 발생한 소스 코드 라인 번호까지 보여줍니다. (실제로 제 경우에, 저 위치의 분석으로 문제를 해결할 수 있었습니다.)

아쉬운 점이 하나 있다면, 아직 .NET 응용 프로그램에 대한 분석은 지원되지 않는다는 점입니다. 아래의 글에서도 나오지만,

Debugging a .NET crash with rules in Debug Diag
; http://blogs.msdn.com/b/tess/archive/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.aspx
; https://www.tessferrandez.com/blog/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.html

.NET 응용 프로그램의 경우에는 대강의 원인 파악만 DebugDiag-AnalysisOnly에서 할 수 있을 뿐, 결국 windbg + sos.dll을 이용하는 것을 볼 수 있습니다.



[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/9/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2011-04-25 11시06분
[lancers] 사실 .NET이야 런타임 내부 오류가 아닌 이상은 예외정보가 나오니깐..
DebugDiag가 편리하긴 하더라고요. Crash나 Hang 원인 파악을 하는데는 매우 유용하지요. ^^
(예전 모 사이트에서 이거 덕에 하나 건졌죠..)
[guest]
2011-04-25 04시32분
넵. DebugDiag 결과 보고 쩜 반했습니다. ^^
정성태
2011-04-26 12시41분
[[유수석]] DebugDiag 출력 결과가 WinDbg로 덤프 분석하는 것과 무슨 차이가 있는지 잘 모르겠네요.
WinDbg나 심지어 Visual Studio로도 저 정도의 호출 스택은 보이는데...
궁금해요~ 알려주삼~
[guest]
2011-04-27 10시02분
유수석 님 좋은 지적이십니다. ^^

저도 Visual Studio를 순간적으로 잊은 것 같습니다. VS가 dump 분석을 추가한 이후로 DebugDiag와 스택 덤프에 관해서는 유사한 기능을 가지지 않을까 싶습니다. 대신, windbg 같은 경우에는, 약간의 차이가 있다면 windbg 사용법 및 명령어를 전혀 몰라도 저런 결과를 얻을 수 있다는 점이 틀릴 것 같습니다.

그러고 보니, VS가 정말 좋은 디버거인 것 같습니다. ^^
정성태
2011-04-28 05시40분
참고로, (향후에는 바뀔지 모르지만) 현재 x64/x86 모두 설치하려면, 우선 x64 버전 설치 후 x86을 설치해야 합니다. x86 먼저 설치하면 x64 버전이 설치되지 않습니다.
정성태
2017-07-08 10시37분
정성태
2020-06-08 10시59분
정성태

... 61  62  63  64  65  66  67  68  69  [70]  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12186정성태3/12/202017400오류 유형: 604. The SysVol Permissions for one or more GPOs on this domain controller and not in sync with the permissions for the GPOs on the Baseline domain controller.
12185정성태3/11/202017998오류 유형: 603. The browser service was unable to retrieve a list of servers from the browser master...
12184정성태3/11/202019925오류 유형: 602. Automatic certificate enrollment for local system failed (0x800706ba) The RPC server is unavailable. [3]
12183정성태3/11/202017728오류 유형: 601. Warning: DsGetDcName returned information for \\[...], when we were trying to reach [...].
12182정성태3/11/202019222.NET Framework: 901. C# Windows Forms - Vista/7 이후의 Progress Bar 업데이트가 느린 문제파일 다운로드1
12181정성태3/11/202019514기타: 76. 재현 가능한 최소한의 예제 프로젝트란? - 두 번째 예제파일 다운로드1
12180정성태3/10/202015962오류 유형: 600. "Docker Desktop for Windows" - EXPOSE 포트가 LISTENING 되지 않는 문제
12179정성태3/10/202027695개발 환경 구성: 481. docker - PostgreSQL 컨테이너 실행
12178정성태3/10/202019750개발 환경 구성: 480. Linux 운영체제의 docker를 위한 tcp 바인딩 추가 [1]
12177정성태3/9/202018966개발 환경 구성: 479. docker - MySQL 컨테이너 실행
12176정성태3/9/202018496개발 환경 구성: 478. 파일의 (sha256 등의) 해시 값(checksum) 확인하는 방법
12175정성태3/8/202018518개발 환경 구성: 477. "Docker Desktop for Windows"의 "Linux Container" 모드를 위한 tcp 바인딩 추가
12174정성태3/7/202017914개발 환경 구성: 476. DockerDesktopVM의 파일 시스템 접근 [3]
12173정성태3/7/202019235개발 환경 구성: 475. docker - SQL Server 2019 컨테이너 실행 [1]
12172정성태3/7/202023771개발 환경 구성: 474. docker - container에서 root 권한 명령어 실행(sudo)
12171정성태3/6/202018877VS.NET IDE: 143. Visual Studio - ASP.NET Core Web Application의 "Enable Docker Support" 옵션으로 달라지는 점 [1]
12170정성태3/6/202016901오류 유형: 599. "Docker Desktop is switching..." 메시지와 DockerDesktopVM CPU 소비 현상
12169정성태3/5/202019407개발 환경 구성: 473. Windows nanoserver에 대한 docker pull의 태그 사용 [1]
12168정성태3/5/202020611개발 환경 구성: 472. 윈도우 환경에서의 dockerd.exe("Docker Engine" 서비스)가 Linux의 것과 다른 점
12167정성태3/5/202019052개발 환경 구성: 471. C# - 닷넷 응용 프로그램에서 DB2 Express-C 데이터베이스 사용 (3) - ibmcom/db2express-c 컨테이너 사용
12166정성태3/4/202019444개발 환경 구성: 470. Windows Server 컨테이너 - DockerMsftProvider 모듈을 이용한 docker 설치
12165정성태3/2/202018419.NET Framework: 900. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 네 번째 이야기(Monitor.Enter 후킹)파일 다운로드1
12164정성태2/29/202019512오류 유형: 598. Surface Pro 6 - Windows Hello Face Software Device가 인식이 안 되는 문제
12163정성태2/27/202017841.NET Framework: 899. 익명 함수를 가리키는 delegate 필드에 대한 직렬화 문제
12162정성태2/26/202021686디버깅 기술: 166. C#에서 만든 COM 객체를 C/C++로 P/Invoke Interop 시 메모리 누수(Memory Leak) 발생 [6]파일 다운로드2
12161정성태2/26/202017685오류 유형: 597. manifest - The value "x64" of attribute "processorArchitecture" in element "assemblyIdentity" is invalid.
... 61  62  63  64  65  66  67  68  69  [70]  71  72  73  74  75  ...