Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 8개 있습니다.)

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

... 16  17  18  [19]  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13171정성태11/25/20225053Windows: 214. 윈도우 - 스레드 스택의 "red zone"
13170정성태11/24/20225331Windows: 213. 윈도우 - 싱글 스레드는 컨텍스트 스위칭이 없을까요?
13169정성태11/23/20225901Windows: 212. 윈도우의 Protected Process (Light) 보안 [1]파일 다운로드2
13168정성태11/22/20225239제니퍼 .NET: 31. 제니퍼 닷넷 적용 사례 (9) - DB 서비스에 부하가 걸렸다?!
13167정성태11/21/20225271.NET Framework: 2070. .NET 7 - Console.ReadKey와 리눅스의 터미널 타입
13166정성태11/20/20224989개발 환경 구성: 651. Windows 사용자 경험으로 WSL 환경에 dotnet 런타임/SDK 설치 방법
13165정성태11/18/20224873개발 환경 구성: 650. Azure - "scm" 프로세스와 엮인 서비스 모음
13164정성태11/18/20225814개발 환경 구성: 649. Azure - 비주얼 스튜디오를 이용한 AppService 원격 디버그 방법
13163정성태11/17/20225729개발 환경 구성: 648. 비주얼 스튜디오에서 안드로이드 기기 인식하는 방법
13162정성태11/15/20226768.NET Framework: 2069. .NET 7 - AOT(ahead-of-time) 컴파일
13161정성태11/14/20226030.NET Framework: 2068. C# - PublishSingleFile로 배포한 이미지의 역어셈블 가능 여부 (난독화 필요성) [4]
13160정성태11/11/20225949.NET Framework: 2067. C# - PublishSingleFile 적용 시 native/managed 모듈 통합 옵션
13159정성태11/10/20229270.NET Framework: 2066. C# - PublishSingleFile과 관련된 옵션 [3]
13158정성태11/9/20225431오류 유형: 826. Workload definition 'wasm-tools' in manifest 'microsoft.net.workload.mono.toolchain' [...] conflicts with manifest 'microsoft.net.workload.mono.toolchain.net7'
13157정성태11/8/20226077.NET Framework: 2065. C# - Mutex의 비동기 버전파일 다운로드1
13156정성태11/7/20227006.NET Framework: 2064. C# - Mutex와 Semaphore/SemaphoreSlim 차이점파일 다운로드1
13155정성태11/4/20226472디버깅 기술: 183. TCP 동시 접속 (연결이 아닌) 시도를 1개로 제한한 서버
13154정성태11/3/20225949.NET Framework: 2063. .NET 5+부터 지원되는 GC.GetGCMemoryInfo파일 다운로드1
13153정성태11/2/20227257.NET Framework: 2062. C# - 코드로 재현하는 소켓 상태(SYN_SENT, SYN_RECV)
13152정성태11/1/20225839.NET Framework: 2061. ASP.NET Core - DI로 추가한 클래스의 초기화 방법 [1]
13151정성태10/31/20226011C/C++: 161. Windows 11 환경에서 raw socket 테스트하는 방법파일 다운로드1
13150정성태10/30/20225989C/C++: 160. Visual Studio 2022로 빌드한 C++ 프로그램을 위한 다른 PC에서 실행하는 방법
13149정성태10/27/20225943오류 유형: 825. C# - CLR ETW 이벤트 수신이 GCHeapStats_V1/V2에 대해 안 되는 문제파일 다운로드1
13148정성태10/26/20225897오류 유형: 824. msbuild 에러 - error NETSDK1005: Assets file '...\project.assets.json' doesn't have a target for 'net5.0'. Ensure that restore has run and that you have included 'net5.0' in the TargetFramew
13147정성태10/25/20224971오류 유형: 823. Visual Studio 2022 - Unable to attach to CoreCLR. The debugger's protocol is incompatible with the debuggee.
13146정성태10/24/20225833.NET Framework: 2060. C# - Java의 Xmx와 유사한 힙 메모리 최댓값 제어 옵션 HeapHardLimit
... 16  17  18  [19]  20  21  22  23  24  25  26  27  28  29  30  ...