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

... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12726정성태7/21/20218617VS.NET IDE: 169. 비주얼 스튜디오 - 단위 테스트 선택 시 MSTestv2 외의 xUnit, NUnit 사용법 [1]
12725정성태7/21/20217265오류 유형: 741. Failed to find the "go" binary in either GOROOT() or PATH
12724정성태7/21/202110060개발 환경 구성: 582. 윈도우 환경에서 Visual Studio Code + Go (Zip) 개발 환경 [1]
12723정성태7/21/20217664오류 유형: 740. SharePoint - Alternate access mappings have not been configured 경고
12722정성태7/20/20217503오류 유형: 739. MSVCR110.dll이 없어 exe 실행이 안 되는 경우
12721정성태7/20/20218085오류 유형: 738. The trust relationship between this workstation and the primary domain failed. - 세 번째 이야기
12720정성태7/19/20217449Linux: 43. .NET Core/5+ 응용 프로그램의 Ubuntu (Debian) 패키지 준비
12719정성태7/19/20216640오류 유형: 737. SharePoint 설치 시 "0x800710D8 The object identifier does not represent a valid object." 오류 발생
12718정성태7/19/20217208개발 환경 구성: 581. Windows에서 WSL로 파일 복사 시 root 소유권으로 적용되는 문제파일 다운로드1
12717정성태7/18/20217144Windows: 195. robocopy에서 파일의 ADS(Alternate Data Stream) 정보 복사를 제외하는 방법
12716정성태7/17/20218073개발 환경 구성: 580. msbuild의 Exec Task에 robocopy를 사용하는 방법파일 다운로드1
12715정성태7/17/20219583오류 유형: 736. Windows - MySQL zip 파일 버전의 "mysqld --skip-grant-tables" 실행 시 비정상 종료 [1]
12714정성태7/16/20218391오류 유형: 735. VCRUNTIME140.dll, MSVCP140.dll, VCRUNTIME140.dll, VCRUNTIME140_1.dll이 없어 exe 실행이 안 되는 경우
12713정성태7/16/20218945.NET Framework: 1077. C# - 동기 방식이면서 비동기 규약을 따르게 만드는 Task.FromResult파일 다운로드1
12712정성태7/15/20218352개발 환경 구성: 579. Azure - 리눅스 호스팅의 Site Extension 제작 방법
12711정성태7/15/20218722개발 환경 구성: 578. Azure - Java Web App Service를 위한 Site Extension 제작 방법
12710정성태7/15/202110518개발 환경 구성: 577. MQTT - emqx.io 서비스 소개
12709정성태7/14/20217049Linux: 42. 실행 중인 docker 컨테이너에 대한 구동 시점의 docker run 명령어를 확인하는 방법
12708정성태7/14/202110493Linux: 41. 리눅스 환경에서 디스크 용량 부족 시 원인 분석 방법
12707정성태7/14/202177812오류 유형: 734. MySQL - Authentication method 'caching_sha2_password' not supported by any of the available plugins.
12706정성태7/14/20218929.NET Framework: 1076. C# - AsyncLocal 기능을 CallContext만으로 구현하는 방법 [2]파일 다운로드1
12705정성태7/13/20219091VS.NET IDE: 168. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 - 두 번째 이야기
12704정성태7/12/20218255개발 환경 구성: 576. Azure VM의 서비스를 Azure Web App Service에서만 접근하도록 NSG 설정을 제한하는 방법
12703정성태7/11/202113962개발 환경 구성: 575. Azure VM에 (ICMP) ping을 허용하는 방법
12702정성태7/11/20219054오류 유형: 733. TaskScheduler에 등록된 wacs.exe의 Let's Encrypt 인증서 업데이트 문제
12701정성태7/9/20218741.NET Framework: 1075. C# - ThreadPool의 스레드는 반환 시 ThreadStatic과 AsyncLocal 값이 초기화 될까요?파일 다운로드1
... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...