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
정성태

... 61  62  63  [64]  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12339정성태9/21/202017023오류 유형: 655. 코어 모드의 윈도우는 GUI 모드의 윈도우로 교체가 안 됩니다.
12338정성태9/21/202017035오류 유형: 654. 우분투 설치 시 "CHS: Error 2001 reading sector ..." 오류 발생
12337정성태9/21/202018143오류 유형: 653. Windows - Time zone 설정을 바꿔도 반영이 안 되는 경우
12336정성태9/21/202021547.NET Framework: 942. C# - WOL(Wake On Lan) 구현
12335정성태9/21/202030711Linux: 31. 우분투 20.04 초기 설정 - 고정 IP 및 SSH 설치
12334정성태9/21/202015279오류 유형: 652. windbg - !py 확장 명령어 실행 시 "failed to find python interpreter"
12333정성태9/20/202015661.NET Framework: 941. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 (2)
12332정성태9/18/202018610.NET Framework: 940. C# - Windows Forms ListView와 DataGridView의 예제 코드파일 다운로드1
12331정성태9/18/202017507오류 유형: 651. repadmin /syncall - 0x80090322 The target principal name is incorrect.
12330정성태9/18/202018661.NET Framework: 939. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 [2]파일 다운로드1
12329정성태9/16/202020994오류 유형: 650. ASUS 메인보드 관련 소프트웨어 설치 후 ArmouryCrate.UserSessionHelper.exe 프로세스 무한 종료 현상
12328정성태9/16/202019974VS.NET IDE: 150. TFS의 이력에서 "Get This Version"과 같은 기능을 Git으로 처리한다면?
12327정성태9/12/202018111.NET Framework: 938. C# - ICS(Internet Connection Sharing) 제어파일 다운로드1
12326정성태9/12/202017491개발 환경 구성: 516. Azure VM의 Network Adapter를 실수로 비활성화한 경우
12325정성태9/12/202016701개발 환경 구성: 515. OpenVPN - 재부팅 후 ICS(Internet Connection Sharing) 기능이 동작 안하는 문제
12324정성태9/11/202017527개발 환경 구성: 514. smigdeploy.exe를 이용한 Windows Server 2016에서 2019로 마이그레이션 방법
12323정성태9/11/202016769오류 유형: 649. Copy Database Wizard - The job failed. Check the event log on the destination server for details.
12322정성태9/11/202020141개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한 [1]
12321정성태9/11/202015922오류 유형: 648. netsh http add urlacl - Error: 183 Cannot create a file when that file already exists.
12320정성태9/11/202017904개발 환경 구성: 512. RDP(원격 데스크톱) 접속 시 비밀 번호를 한 번 더 입력해야 하는 경우
12319정성태9/10/202017284오류 유형: 647. smigdeploy.exe를 Windows Server 2016에서 실행할 때 .NET Framework 미설치 오류 발생
12318정성태9/9/202016311오류 유형: 646. OpenVPN - "TAP-Windows Adapter V9" 어댑터의 "Network cable unplugged" 현상
12317정성태9/9/202019561개발 환경 구성: 511. Beats용 Kibana 기본 대시 보드 구성 방법
12316정성태9/8/202017354디버깅 기술: 170. WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
12315정성태9/7/202019779개발 환경 구성: 510. Logstash - FileBeat을 이용한 IIS 로그 처리 [2]
12314정성태9/7/202019944오류 유형: 645. IIS HTTPERR - Timer_MinBytesPerSecond, Timer_ConnectionIdle 로그
... 61  62  63  [64]  65  66  67  68  69  70  71  72  73  74  75  ...