성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <br /> <br /> <div class='mainCenterTitle'>Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석</div><br /> <br /> 개인적으로, Watson 오류 로그와는 그다지 친숙하지 않아서, Watson Bucket 정보라는 것을 알지는 못했습니다. 운이 좋게도 ^^ MSDN Magazine 2008년 9월 호에 나온 "<a target='_tab' href='https://docs.microsoft.com/en-us/archive/msdn-magazine/2008/september/clr-inside-out-unhandled-exception-processing-in-the-clr'>CLR Inside Out - CLR에서 처리되지 않은 예외 처리</a>"와 같은 좋은 글을 보게 되었습니다.<br /> <br /> 그 글을 읽다 보니 예전에 정리했던 다음의 아티클이 생각나더군요.<br /> <br /> <pre class='code'> Debug Features : 4. .NET 예외 처리 정리 ; <a target='_tab' href='/2/0/316'>http://www.sysnet.pe.kr/2/0/316</a> </pre> <br /> 위의 글에 "ASP.NET"에서의 예외를 소개하는 부분을 보면, "Request 처리 스레드" 이외의 스레드에서 예외가 발생하는 경우, 이벤트 로그에 변변한 내용이 남지 않는 다면서 실었던 바로 그 로그 내용이 "Watson Bucket" 정보였던 것입니다.<br /> <br /> 이렇고 알고 나니,,, 위와 같은 말은 실수였다는 느낌이 드는군요. ^^ 왜냐하면, P4 버킷 정보에서 해당 모듈 이름을 알수 있고, P9에서 예외 타입, P8에서 예외가 발생한 IL Offset을 알 수 있으니까요. 이 정도 정보면 충분히 예외가 발생한 코드를 추적을 할 수 있습니다.<br /> <br /> 재현을 해보는 의미에서 ^^ 다음과 같은 페이지를 포함하는 ASP.NET 응용 프로그램을 만들어 보겠습니다.<br /> <br /> <pre class='code'> namespace WebApplication1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem((WaitCallback)myFunc); } public void myFunc(object state) { <b>throw new ApplicationException("TEST");</b> } } } </pre> <br /> IIS에서 실행시키면, 다음과 같은 로그가 남게 됩니다.<br /> <br /> <pre class='code'> Event Type: Error Event Source: .NET Runtime 2.0 Error Reporting Event Category: None Event ID: 5000 Date: 9/30/2008 Time: 11:24:23 PM User: N/A Computer: TestMachine Description: EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.3959, P3 45d6968e, <b>P4 webapplication1</b>, P5 1.0.0.0, P6 48e23023, <b>P7 2</b>, <b>P8 b</b>, <b>P9 system.applicationexception</b>, P10 NIL. For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp. Data: 0000: 63 00 6c 00 72 00 32 00 c.l.r.2. 0008: 30 00 72 00 33 00 2c 00 0.r.3.,. 0010: 20 00 77 00 33 00 77 00 .w.3.w. ; [중간 생략] ; 00e8: 4c 00 0d 00 0a 00 L..... </pre> <br /> 위의 로그로부터 얻게 되는 정보들을 차례대로 나열해 볼까요!<br /> <br /> <pre class='code'> P1 (AppName) : w3wp.exe P2 (AppVer) : 6.0.3790.3959 P3 (AppStamp) : 45d6968e <b>P4 (AsmAndModName): webapplication1</b> P5 (AsmVer) : 1.0.0.0 P6 (ModStamp) : 48e23023 <b>P7 (MethodDef) : 2</b> <b>P8 (Offset): b</b> <b>P9 (ExceptionType): system.applicationexception</b> </pre> <br /> 자, 그럼, 모듈명은 webapplication1이라는 것을 알았으니, 그 다음으로 어느 메서드에서 예외가 발생했는지를 추적해야죠. 아하... P7 버킷 정보에 MethodDef가 포함되어 있군요. 이에 해당하는 메서드가 어느 것인지 알기 위해서는 "webapplication1" 모듈을 "ILDASM.EXE"로 로드한 후에 "Control + M" 키를 눌러서 P7에 표시된 MethodDef 번호와 일치하는 메서드를 찾아내면 됩니다.<br /> <br /> [그림: ILDASM.exe를 이용하여 MethodDef에 해당하는 메서드 확인]<br /> <img alt='watson_bucket_methoddef_1.png' src='/SysWebRes/bbs/watson_bucket_methoddef_1.png' /><br /> <br /> 메서드 명이 "myFunc"이군요. 다시, 계속해서 ILDASM.exe에서 "myFunc"의 IL 코드를 아래와 같이 확인해 보겠습니다.<br /> <br /> [그림: myFunc 메서드의 IL 코드를 확인]<br /> <img alt='watson_bucket_methoddef_2.png' src='/SysWebRes/bbs/watson_bucket_methoddef_2.png' /><br /> <br /> 그럼, 게임 끝이군요. ^^ P8 Offset 값이 "b"였으니까, "IL_000b" 라인의 throw에서 예외가 발생한 것을 확인할 수 있습니다.<br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4953
(왼쪽의 숫자를 입력해야 합니다.)