Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 1. 디버깅 방법 - CLR 프로파일러 [링크 복사], [링크+제목 복사],
조회: 27908
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 2개 있습니다.)

저 같은 경우, 해당 응용 프로그램을 개발하기 쉬운지, 어려운지에 대한 기준으로 얼마나 쉽게 "디버거" 환경에서 구동시킬 수 있느냐로 판단합니다. 쉽게 말해서, IDE 환경에서 "F5"를 통한 디버깅이 되느냐/안되느냐에 따른 것인데요.

그러한 디버깅이 다소 어려운 Windows Shell, ISAPI Filter, API 후킹 등은 "어려운 분야"라고 저는 판단합니다. 사실 어려운 분야죠. ^^; 어려울수록 디버깅은 더욱 힘들어지는 것이 정석인가 봅니다.

다행스러운 것은, 최근 들어 전체적으로 개발환경이 .NET으로 넘어오면서, "F5 디버깅"의 영역이 넓어지고 있다는 것입니다. 단적인 예로, ASP.NET 디버깅이 그렇죠.



이런저런 이유로, 어떤 응용 프로그램을 개발할 때에 저는 최대한 "F5 디버깅"이 가능하게 하려고 노력을 합니다. 이번 글은, 최근에 제가 노력했었던 "F5 디버깅" 환경 구성 중에서 "CLR 프로파일러"를 위한 것을 설명하겠습니다.

CLR 프로파일러 자체는 Unamaged C/C++로 개발이 되고, Managed 환경으로부터의 접점을 Environment Variable을 통해서 하고 있습니다. 얼핏 디버깅 방법이 실행 중에 attach 시키는 것뿐이 없는 것 같은데요. 그런 식으로 디버깅하는 것과 "F5 디버깅"의 생산성 차이는 엄청나기 때문에 조금 살펴보게 되었습니다.

일단, 시작 예제 프로젝트는 7차 MMS 모임 때 발표 자료였던 "High-Level .NET Profiling API"를 이용한 프로젝트로 하겠습니다.어차피 Low-Level CLR Profiling API도 마찬가지일거라 봅니다. 관련 자료는 다음의 URL에서 찾아 볼 수 있습니다.

.NET Profiling
Write Profilers With Ease Using High-Level Wrapper Classes
; https://docs.microsoft.com/en-us/archive/msdn-magazine/2006/april/write-profilers-with-ease-using-high-level-wrapper-classes

이제부터, .NET Profiler 프로젝트를 위한 디버깅 환경 설정을 설명해 보겠습니다.

1. 우선, 프로젝트 설정 / "General" 범주에서 "Output Directory"를 CLR Profiling 대상이 되는 .NET 프로그램이 있는 폴더로 지정합니다. 당연하겠지요. ^^

다음은 실제 예제 프로젝트의 솔루션 구조와, 대상 Output Directory에 모여진 파일들의 모습입니다.
Output Directory

2. "Debugging" 범주에서 아래와 같이 적절한 값으로 Command, Working Directory, Debugger Type을 지정합니다. Command Arguments가 있는 경우에는 역시 입력해 주면 되겠고, 각자 자신이 맞는 환경에 맞게 값을 채워주시면 됩니다. 주의할 것은 Working Directory도 반드시 명시를 해주셔야 합니다.

  Command : .NET 프로파일링 대상이 되는 EXE 프로그램 경로
  Working Directory : 대상 EXE 프로그램이 있는 디렉터리
  Debugger Type : 반드시 Native Only 값을 주어야 합니다. Mixed 방식을 주면 CLR로부터의 Call back API들에서 Break Point가 동작하지 않습니다.

프로젝트 설정 화면

3. 이미 말씀드린 것처럼, CLR Profiling의 동작 방식은 CLR이 로딩시에 환경 변수에 특정 변수로 등록된 COM 개체의 CLSID를 얻어서 해당 COM 개체를 활성화시킨 다음 정해진 interface 규칙에 맞게 callback을 해주는 구조입니다. 따라서, "F5 디버깅"을 위해서는 해당 디버깅 세션 동안에 유효할 수 있는 환경 변수 설정을 적절하게 해주어야 합니다. 사실 VS.NET 2003까지는 디버깅 세션에 환경 변수를 설정할 수 있는 방법이 없었습니다. "My Computer"의 전역 환경 설정 변수를 이용할 수도 있었겠지만, 그런 경우 전체 응용 프로그램 모두에 프로파일링 API가 동작하게 되는 부작용이 있으므로 사용하기에는 현실성이 없어 보입니다.

다행히도, VS.NET 2005에서는 디버깅 세션에 환경 변수를 설정할 수 있는 방법을 명시적으로 제공하고 있습니다. 아래의 화면에서 보는 것처럼, CLR 프로파일링 동작을 위한 환경 변수를 설정해 주시면 됩니다.

환경 변수 설정

4. 자, 이제 모든 준비는 끝났습니다. 평상시처럼, 자신이 구현한 CLR 프로파일러 내부의 로직에 break point를 설정한 후, "F5" 키를 누르면 아래 화면과 같이 정상적으로 디버깅이 가능한 것을 볼 수 있습니다.

CLR 프로파일러 디버깅 화면 **** 첨부 파일은 이 글에서 설명한 예제 프로젝트입니다.
[연관 글]






[최초 등록일: ]
[최종 수정일: 6/25/2021]

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

비밀번호

댓글 작성자
 



2012-09-20 12시39분
본문과는 상관없지만! 프로파일러와 관련이 있어서 기록을 남깁니다.

ICorProfilerInfo2::DoStackSnapshot 호출의 반환값(hr)으로 E_INVALIDARG (-2147024809, 0x80070057) 값이 나왔다면? DoStackSnapshot API가 동작하기 위해서는 ICorProfilerInfo2::SetEventMask에 COR_PRF_ENABLE_STACK_SNAPSHOT 옵션을 주어야 하기 때문입니다.
정성태

... 166  167  168  169  170  [171]  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
728정성태5/23/200937366.NET Framework: 137. C#에서 Union 구조체 다루기파일 다운로드1
727정성태5/22/200922314오류 유형: 82. 메서드가 많은 경우 프록시 클래스 생성 실패
726정성태5/21/200921828VS.NET IDE: 62. Visual Studio 2010 Beta1 버그 피드백 - EnC기능 오류 [1]
725정성태5/21/200925096VS.NET IDE: 61. Visual Studio 2010 베타1과 Visual Studio 2008의 혼합 개발 [2]
724정성태5/19/200939183.NET Framework: 136. 자바와 닷넷의 압축 호환파일 다운로드2
723정성태5/18/200933162.NET Framework: 135. C# - Deflate, GZip, Zip
722정성태5/18/200921737개발 환경 구성: 45. SQL 서버 2008 백업 구성 [2]
721정성태5/14/200927361오류 유형: 81. Package 실행 오류 - Error 15404
720정성태5/13/200924103오류 유형: 80. SQL Server 2008 - Package 실행 오류의 구체적인 원인 확인
719정성태5/12/200925297.NET Framework: 134. WPF - XBAP을 호스팅하고 있는 인터넷 익스플로러 인터페이스 구하기파일 다운로드1
717정성태5/11/200925537개발 환경 구성: 44. VHD 파일 크기 확장하는 방법 - 두 번째 이야기
714정성태5/7/200924109Windows: 45. Windows 7 RC와 함께 공개된 Windows Virtual PC 베타
713정성태4/30/200955880오류 유형: 79. DLL 'xxxxx.dll'을(를) 로드할 수 없습니다. [1]
712정성태4/28/200928512오류 유형: 78. Windows Vista/2008에서의 MSXML4.cab 파일 배포 문제
711정성태4/27/200928036개발 환경 구성: 43. Hyper-V VHD 파일 크기 확장하는 방법
710정성태4/26/200928654.NET Framework: 133. CallbackOnCollectedDelegate was detected [4]파일 다운로드1
709정성태4/24/200924887개발 환경 구성: 42. Windows Vista SP1에서 사용 가능한 Hyper-V 관리 도구
708정성태4/23/200929753.NET Framework: 132. ClickOnce 배포를 명령행 수작업 구성파일 다운로드1
707정성태4/22/200929395개발 환경 구성: 41. Hyper-V에 Linux 설치 - SUSE Linux Enterprise Server 11
706정성태4/21/200925265.NET Framework: 131. ClickOnce - 그룹화시켜 다운로드파일 다운로드1
705정성태4/20/200920776개발 환경 구성: 40. TFS2008 SP1의 DBTier에 SQL Server 2008 SP1 설치 [1]
704정성태4/19/200920769개발 환경 구성: 39. Together 2007 SP1 설치
702정성태4/18/200932054.NET Framework: 130. Infragistics - Tabbed MDI WPF 응용 프로그램파일 다운로드1
701정성태4/17/200926935Windows: 44. bootsect 오류 - Access is denied.
700정성태4/17/200930033.NET Framework: 129. Infragistics WPF 컨트롤 사용 [1]
699정성태4/16/200928582.NET Framework: 128. 이벤트 멤버의 명시적 구현파일 다운로드1
... 166  167  168  169  170  [171]  172  173  174  175  176  177  178  179  180  ...