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

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13601정성태4/19/2024214닷넷: 2243. C# - PCM 사운드 재생(NAudio)파일 다운로드1
13600정성태4/18/2024283닷넷: 2242. C# - 관리 스레드와 비관리 스레드
13599정성태4/17/2024330닷넷: 2241. C# - WAV 파일의 PCM 사운드 재생(Windows Multimedia)파일 다운로드1
13598정성태4/16/2024354닷넷: 2240. C# - WAV 파일 포맷 + LIST 헤더파일 다운로드1
13597정성태4/15/2024434닷넷: 2239. C# - WAV 파일의 PCM 데이터 생성 및 출력파일 다운로드1
13596정성태4/14/2024798닷넷: 2238. C# - WAV 기본 파일 포맷파일 다운로드1
13595정성태4/13/2024918닷넷: 2237. C# - Audio 장치 열기 (Windows Multimedia, NAudio)파일 다운로드1
13594정성태4/12/20241021닷넷: 2236. C# - Audio 장치 열람 (Windows Multimedia, NAudio)파일 다운로드1
13593정성태4/8/20241051닷넷: 2235. MSBuild - AccelerateBuildsInVisualStudio 옵션
13592정성태4/2/20241207C/C++: 165. CLion으로 만든 Rust Win32 DLL을 C#과 연동
13591정성태4/2/20241169닷넷: 2234. C# - WPF 응용 프로그램에 Blazor App 통합파일 다운로드1
13590정성태3/31/20241073Linux: 70. Python - uwsgi 응용 프로그램이 k8s 환경에서 OOM 발생하는 문제
13589정성태3/29/20241143닷넷: 2233. C# - 프로세스 CPU 사용량을 나타내는 성능 카운터와 Win32 API파일 다운로드1
13588정성태3/28/20241197닷넷: 2232. C# - Unity + 닷넷 App(WinForms/WPF) 간의 Named Pipe 통신파일 다운로드1
13587정성태3/27/20241156오류 유형: 900. Windows Update 오류 - 8024402C, 80070643
13586정성태3/27/20241297Windows: 263. Windows - 복구 파티션(Recovery Partition) 용량을 늘리는 방법
13585정성태3/26/20241096Windows: 262. PerformanceCounter의 InstanceName에 pid를 추가한 "Process V2"
13584정성태3/26/20241049개발 환경 구성: 708. Unity3D - C# Windows Forms / WPF Application에 통합하는 방법파일 다운로드1
13583정성태3/25/20241158Windows: 261. CPU Utilization이 100% 넘는 경우를 성능 카운터로 확인하는 방법
13582정성태3/19/20241420Windows: 260. CPU 사용률을 나타내는 2가지 수치 - 사용량(Usage)과 활용률(Utilization)파일 다운로드1
13581정성태3/18/20241588개발 환경 구성: 707. 빌드한 Unity3D 프로그램을 C++ Windows Application에 통합하는 방법
13580정성태3/15/20241138닷넷: 2231. C# - ReceiveTimeout, SendTimeout이 적용되지 않는 Socket await 비동기 호출파일 다운로드1
13579정성태3/13/20241494오류 유형: 899. HTTP Error 500.32 - ANCM Failed to Load dll
13578정성태3/11/20241629닷넷: 2230. C# - 덮어쓰기 가능한 환형 큐 (Circular queue)파일 다운로드1
13577정성태3/9/20241876닷넷: 2229. C# - 닷넷을 위한 난독화 도구 소개 (예: ConfuserEx)
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...