Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 4개 있습니다.)
(시리즈 글이 15개 있습니다.)
디버깅 기술: 22. VS.NET SP1 + .NET Framework 소스 코드 디버깅
; https://www.sysnet.pe.kr/2/0/623

개발 환경 구성: 112. Visual Studio 2010 - .NET Framework 소스 코드 디버깅
; https://www.sysnet.pe.kr/2/0/1009

디버깅 기술: 47. .NET Reflector를 이용한 "소스 코드가 없는" 어셈블리 디버깅
; https://www.sysnet.pe.kr/2/0/1201

개발 환경 구성: 143. Visual Studio 2010 - .NET Framework 소스 코드 디버깅 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/1243

개발 환경 구성: 297. 소스 코드가 없는 닷넷 어셈블리를 디버깅할 때 지역 변숫값을 확인하는 방법
; https://www.sysnet.pe.kr/2/0/11036

개발 환경 구성: 391. (GitHub 등과 직접 연동해) 소스 코드 디버깅을 쉽게 해 주는 SourceLink
; https://www.sysnet.pe.kr/2/0/11630

VS.NET IDE: 126. 디컴파일된 소스에 탐색을 사용하도록 설정(Enable navigation to decompiled sources)
; https://www.sysnet.pe.kr/2/0/11689

VS.NET IDE: 145. NuGet + Github 라이브러리 디버깅 관련 옵션 3가지 - "Enable Just My Code" / "Enable Source Link support" / "Suppress JIT optimization on module load (Managed only)"
; https://www.sysnet.pe.kr/2/0/12200

VS.NET IDE: 149. ("Binary was not built with debug information" 상태로) 소스 코드 디버깅이 안되는 경우
; https://www.sysnet.pe.kr/2/0/12278

개발 환경 구성: 500. (PDB 연결이 없는) DLL의 소스 코드 디버깅을 dotPeek 도구로 해결하는 방법
; https://www.sysnet.pe.kr/2/0/12281

VS.NET IDE: 153. 닷넷 응용 프로그램에서의 "My Code" 범위와 "Enable Just My Code"의 역할
; https://www.sysnet.pe.kr/2/0/12401

VS.NET IDE: 170. Visual Studio에서 .NET Core/5+ 역어셈블 소스코드 확인하는 방법
; https://www.sysnet.pe.kr/2/0/12880

VS.NET IDE: 177. 비주얼 스튜디오 2022를 이용한 (소스 코드가 없는) 닷넷 모듈 디버깅 - "외부 원본(External Sources)"
; https://www.sysnet.pe.kr/2/0/13109

VS.NET IDE: 180. Visual Studio - 닷넷 소스 코드 디버깅 중 "Decompile source code"가 동작하는 않는 문제
; https://www.sysnet.pe.kr/2/0/13247

VS.NET IDE: 189. Visual Studio - 닷넷 소스코드 디컴파일 찾기가 안 될 때
; https://www.sysnet.pe.kr/2/0/13554




.NET Reflector를 이용한 "소스 코드가 없는" 어셈블리 디버깅

언제 한번 소개를 해야지... 하면서 미뤄오다가 이제야 쓰게 되는군요.

올해 중순 쯤부터 상용 소프트웨어가 되어버려서 다른 .NET Decompiler들이 틈새를 비집고 나서고는 있지만... 여전히 .NET Reflector는 매력적인 도구임에는 분명한 것 같습니다.

그중에서, 제가 가장 손꼽는 기능이 바로 "소스 코드가 없는 어셈블리에 대한 디버깅(Debug assemblies without source code)"입니다.

현재 ".NET Reflector"는 3개의 버전으로 나뉘는데, 아쉽게도 디버깅 통합 기능은 "VS Pro" 버전에만 있습니다.

  • Standard: Standalone Windows application
  • VS: "Standard" + Microsoft Visual Studio Integration
  • VS Pro: "VS" + Debug assemblies without source code

(참고로, 웹 사이트에서 제공되는 30일 평가판 버전은 "VS Pro" 기능이 포함되어 있습니다.)

어디... 간단하게 어떤 기능인지 맛을 한번 볼까요? ^^




.NET Reflector를 다운로드해서 "Reflector.exe"를 실행시킨 후 "Tools" / "Visual Studio and Windows Explorer Integration" 메뉴를 선택하면 다음과 같이 add-in을 활성화 할 수 있는 창이 나옵니다.

reflector_debug_1.png

위와 같이 (제 컴퓨터에는 2010 버전만 설치되어 있으므로) "Visual Studio 2010"을 선택하고 "OK" 버튼을 누르는 것으로 Reflector.exe 프로그램은 역할이 끝납니다. 다음으로 본격적으로 디버깅 테스트를 위해 "Visual Studio"를 실행합니다.

정상적으로 add-in이 추가된 경우, 아래 화면과 같이 ".NET Reflector" 메뉴가 추가되어 있을 것입니다.

reflector_debug_2.png

자... 그럼 '소스 코드가 없는 어셈블리'를 디버깅해 볼 텐데요. 일부러 환경 구성을 하는 것보다, "닷넷 프레임워크 어셈블리"도 '소스 코드가 없는' 형태에 해당하기 때문에 그걸 가지고 테스트를 해보겠습니다. (오히려, 어정쩡하게 일부 어셈블리의 소스 코드만 공개한 닷넷 소스 코드 디버깅보다 더 나을 수 있습니다.)

우선, 다음과 같이 간단하게 코딩을 하고,

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("https://www.sysnet.pe.kr");
        }
    }
}

Uri 타입이 어느 DLL에 구현되어 있는지 알기 위해 편집 커서를 Uri에 놓고 "F12" 키를 누르면,

reflector_debug_3.png

아하... "System.dll" 파일에 정의되어 있군요. 이렇게 어느 DLL 파일에 타입이 정의되어 있는지 알았다면 ".NET Reflector" / "Choose Assemblies to Debug..." 메뉴를 선택하고 아래와 같이 원하는 DLL(여기서는 System.dll)을 선택한 후,

reflector_debug_4.png

"OK" 버튼을 누르면 다음과 같이 DLL 파일의 내용에 따라 소스 코드를 생성하는 작업을 거칩니다.

reflector_debug_5.png

(참고로, 이렇게 동적으로 생성된 소스 코드 및 pdb 파일은 "C:\Users\[사용자 계정]\AppData\Local\Red Gate\.NET Reflector 7" 폴더에 존재합니다.)

준비 작업은 모두 끝났습니다. 제대로 소스 코드가 생성되었는지 확인을 위해 다시 편집 커서를 Uri에 놓고 "F12" 키를 눌러보면... 이번에는 소스 코드가 보여지게 됩니다. 오~~~ 멋지죠. ^^

reflector_debug_6.png

이제 코드 창에서 BreakPoint를 걸고 디버깅을 시작한 후 "F11 (Step-into)" 키를 눌러서 Uri 생성자로 진입하면 다음과 같이 (마치 소스 코드가 있는 듯이) 디버깅이 가능합니다.

reflector_debug_7.png

참고로, '릴리스 빌드'로 된 어셈블리의 경우 그에 대한 최적화 작업이 이뤄지기 때문에 소스 코드와 1:1 매칭으로 디버깅 진행이 안 될 수도 있고 일부 변숫값들이 "Watch" 창에서 정상적으로 안 보이는 현상이 발생합니다. 이것은 ".NET Reflector"의 오류는 아니고, 다음의 글을 참고하시면 해결될 수 있습니다.

.NET JIT 최적화 코드 생성 제어
; https://www.sysnet.pe.kr/2/0/656

COMPLUS_ZapDisable - JIT 최적화 코드 생성 제어
; https://www.sysnet.pe.kr/2/0/646

어떠세요? 이 정도면 유료 버전이긴 하지만 ".NET Reflector"가 충분히 구매력이 있다고 생각되지 않으세요? ^^

기억하실 분들이 계실지 모르겠지만, .NET Reflector의 add-in으로 기획되었던 "Deblector"를 소개한 것이 거의 5년 전이었군요.

Integrating a debugger into Reflector
; https://www.sysnet.pe.kr/2/1/249

아마도, 저 아이디어가 발달해서 현재의 소스 코드 디버깅 기능이 나온 것이 아닐까요? ^^




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/1/2021]

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

비밀번호

댓글 작성자
 



2011-12-14 03시01분
[짜두] 예전 프로젝트에서 이걸 보여주며 보안 어쩌고 했던 모회사의 보안팀 대리가 생각나네요... ㅡㅡ;

[guest]
2011-12-19 09시54분
그럼, C/C++ 로 개발하라고 해야죠. ^^
정성태
2016-08-29 05시03분
%LOCALAPPDATA%\Temp\SymbolCache\
%LOCALAPPDATA%\Red Gate\.NET Reflector 9\Cache
정성태
2016-08-29 12시37분
무료로 배포되는 .NET Decompiler 도구 중에 Telerik JustDecompile도 2015년 9월부터 PDB 생성 기능을 제공한다고 합니다.

JustDecompile
; http://www.telerik.com/support/whats-new/justdecompile
정성태

... 106  107  108  109  110  111  112  113  114  115  116  117  118  [119]  120  ...
NoWriterDateCnt.TitleFile(s)
10949정성태4/28/201619935.NET Framework: 575. SharedDomain과 JIT 컴파일파일 다운로드1
10948정성태4/28/201623898.NET Framework: 574. .NET - 눈으로 확인하는 SharedDomain의 동작 방식 [3]파일 다운로드1
10947정성태4/27/201621780.NET Framework: 573. .NET CLR4 보안 모델 - 4. CLR4 보안 모델에서의 조건부 APTCA 역할파일 다운로드1
10946정성태4/26/201624565VS.NET IDE: 106. Visual Studio 2015 확장 - INI 파일을 위한 사용자 정의 포맷 기능 (Syntax Highlighting)파일 다운로드1
10945정성태4/26/201618340오류 유형: 327. VSIX 프로젝트 빌드 시 The "VsTemplatePaths" task could not be loaded from the assembly 오류 발생
10944정성태4/22/201619559디버깅 기술: 80. windbg - 풀 덤프 파일로부터 텍스트 파일의 내용을 찾는 방법
10943정성태4/22/201624416디버깅 기술: 79. windbg - 풀 덤프 파일로부터 .NET DLL을 추출/저장하는 방법 [1]
10942정성태4/19/201619724디버깅 기술: 78. windbg 사례 - .NET 예외가 발생한 시점의 오류 분석 [1]
10941정성태4/19/201619634오류 유형: 326. Error MSB8020 - The build tools for v120_xp (Platform Toolset = 'v120_xp') cannot be found.
10940정성태4/18/201622931Windows: 116. 프로세스 풀 덤프 시간을 줄여 주는 Process Reflection [3]
10939정성태4/18/201623936.NET Framework: 572. .NET APM 비동기 호출의 Begin...과 End... 조합 [3]파일 다운로드1
10938정성태4/13/201623499오류 유형: 325. 파일 삭제 시 오류 - Error 0x80070091: The directory is not empty.
10937정성태4/13/201631693Windows: 115. UEFI 모드로 윈도우 10 설치 가능한 USB 디스크 만드는 방법
10936정성태4/8/201642441Windows: 114. 삼성 센스 크로노스 7 노트북의 운영체제를 USB 디스크로 새로 설치하는 방법 [3]
10935정성태4/7/201626712웹: 32. Edge에서 Google Docs 문서 편집 시 한영 전환키가 동작 안하는 문제
10934정성태4/5/201625404디버깅 기술: 77. windbg의 콜스택 함수 인자를 쉽게 확인하는 방법 [1]
10933정성태4/5/201631038.NET Framework: 571. C# - 스레드 선호도(Thread Affinity) 지정하는 방법 [8]파일 다운로드1
10932정성태4/4/201623314VC++: 96. C/C++ 식 평가 - printf("%d %d %d\n", a, a++, a);
10931정성태3/31/201623603개발 환경 구성: 283. Hyper-V 내에 구성한 Active Directory 환경의 시간 구성 방법 [3]
10930정성태3/30/201621571.NET Framework: 570. .NET 4.5부터 추가된 CLR Profiler의 실행 시 Rejit 기능
10929정성태3/29/201631674.NET Framework: 569. ServicePointManager.DefaultConnectionLimit의 역할파일 다운로드1
10928정성태3/28/201637376.NET Framework: 568. ODP.NET의 완전한 닷넷 버전 Oracle ODP.NET, Managed Driver [2]파일 다운로드1
10927정성태3/25/201626576.NET Framework: 567. System.Net.ServicePointManager의 DefaultConnectionLimit 속성 설명
10926정성태3/24/201626135.NET Framework: 566. openssl의 PKCS#1 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 [10]파일 다운로드1
10925정성태3/24/201620422.NET Framework: 565. C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 - 두 번째 이야기파일 다운로드1
10924정성태3/22/201621116오류 유형: 324. Visual Studio에서 Azure 클라우드 서비스 생성 시 Failed to initialize the PowerShell host 에러 발생
... 106  107  108  109  110  111  112  113  114  115  116  117  118  [119]  120  ...