Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 1. 디버깅 방법 - CLR 프로파일러 [링크 복사], [링크+제목 복사],
조회: 23667
글쓴 사람
정성태 (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 옵션을 주어야 하기 때문입니다.
정성태

... 16  17  18  19  20  21  22  23  24  25  26  [27]  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
12975정성태2/20/20228711.NET Framework: 1159. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 qsvdec.c 예제 포팅파일 다운로드1
12974정성태2/20/20226778.NET Framework: 1158. C# - SqlConnection의 최소 Pooling 수를 초과한 DB 연결은 언제 해제될까요?
12973정성태2/16/20229161개발 환경 구성: 639. ffmpeg.exe - Intel Quick Sync Video(qsv)를 이용한 인코딩 [3]
12972정성태2/16/20228506Windows: 200. Intel CPU의 내장 그래픽 GPU가 작업 관리자에 없다면? [4]
12971정성태2/15/202210144.NET Framework: 1157. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 muxing.c 예제 포팅 [7]파일 다운로드2
12970정성태2/15/20228262.NET Framework: 1156. C# - ffmpeg(FFmpeg.AutoGen): Bitmap으로부터 h264 형식의 파일로 쓰기 [1]파일 다운로드1
12969정성태2/14/20226705개발 환경 구성: 638. Visual Studio의 Connection Manager 기능(Remote SSH 관리)을 위한 명령행 도구 - 두 번째 이야기파일 다운로드1
12968정성태2/14/20226966오류 유형: 794. msbuild 에러 - error NETSDK1005: Assets file '...\project.assets.json' doesn't have a target for '...'.
12967정성태2/14/20227366VC++: 153. Visual C++ - C99 표준의 Compund Literals 빌드 방법 [4]
12966정성태2/13/20227178.NET Framework: 1155. C# - ffmpeg(FFmpeg.AutoGen): Bitmap으로부터 yuv420p + rawvideo 형식의 파일로 쓰기파일 다운로드1
12965정성태2/13/20227184.NET Framework: 1154. "Hanja Hangul Project v1.01 (파이썬)"의 C# 버전
12964정성태2/11/20227477.NET Framework: 1153. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 avio_reading.c 예제 포팅파일 다운로드1
12963정성태2/11/20228215.NET Framework: 1152. C# - 화면 캡처한 이미지를 ffmpeg(FFmpeg.AutoGen)로 동영상 처리 (저해상도 현상 해결)파일 다운로드1
12962정성태2/9/20228081오류 유형: 793. 마이크로소프트 스토어 - 제품이 존재하지 않습니다. 재고가 없는 것일 수 있습니다.
12961정성태2/8/20228221.NET Framework: 1151. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 프레임의 크기 및 포맷 변경 예제(scaling_video.c) [7]파일 다운로드1
12960정성태2/8/20227624개발 환경 구성: 637. ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 디코딩 예제(decode_video.c) - 세 번째 이야기
12959정성태2/7/20228334.NET Framework: 1150. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 디코딩 예제(decode_video.c) - 두 번째 이야기 [2]파일 다운로드1
12958정성태2/6/20228357.NET Framework: 1149. C# - ffmpeg(FFmpeg.AutoGen) - 비디오 프레임 디코딩 [2]파일 다운로드1
12957정성태2/6/20227950개발 환경 구성: 636. ffmpeg.exe를 이용해 planar 포맷의 데이터를 packed 형식으로 변환하는 방법? [2]
12956정성태2/4/20227204.NET Framework: 1148. C# - ffmpeg(FFmpeg.AutoGen) - decoding 과정 [2]파일 다운로드1
12955정성태2/4/20226653개발 환경 구성: 635. 비주얼 스튜디오에서 실행하던 ASP.NET Core (.NET Framework) 응용 프로그램을 명령행에서 실행하는 방법 (2)
12954정성태2/4/20226483VS.NET IDE: 173. 비주얼 스튜디오 - Output 창에 색상이 지정된 출력 결과가 "[39m[22m" 식의 문자로 나오는 문제
12953정성태2/2/20226688Linux: 48. Windows 11 + WSL 우분투 GUI 환경에서 한글 출력
12952정성태2/2/20227221.NET Framework: 1148. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 오디오 필터 예제(filter_audio.c)파일 다운로드1
12951정성태2/2/20227184.NET Framework: 1147. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 오디오 필터링 예제(filtering_audio.c)파일 다운로드1
12950정성태2/1/20226723.NET Framework: 1146. .NET 6에 추가되지 않은 Generic Math (예: INumber<T>)
... 16  17  18  19  20  21  22  23  24  25  26  [27]  28  29  30  ...