성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>(PDB 연결이 없는) DLL의 소스 코드 디버깅을 dotPeek 도구로 해결하는 방법</h1> <p> 지난 글에 설명한 것처럼,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > DEVPATH 환경 변수의 사용 예 - .NET Reflector의 (PDB 연결이 없는) DLL의 소스 코드 디버깅 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12277'>https://www.sysnet.pe.kr/2/0/12277</a> </pre> <br /> IMAGE_DEBUG_DIRECTORY 섹션이 없는 PE(EXE, DLL) 파일의 경우 .NET Reflector만이 유일하게 (역어셈블된) 소스 코드 디버깅을 가능하게 해 줍니다. 하지만 <a target='tab' href='https://www.sysnet.pe.kr/3/0/4852'>질문자</a>가 언급한 것처럼 아쉽게도 .NET Reflector는 유료이므로, 가능한 무료 제품을 이용한 해결책도 설명하는 것이 좋을 것 같아 이렇게 ^^ 글을 남깁니다.<br /> <br /> 사실, "<a target='tab' href='https://www.sysnet.pe.kr/2/0/12277'>https://www.sysnet.pe.kr/2/0/12277</a>" 글을 잘 읽어보셨다면 이미 그 방법을 알고 계신 것이나 다름없습니다. 그래도 도구 간의 조합이 약간 필요하므로 쭈~~~욱 나열해 보겠습니다.<br /> <br /> 우선, 저런 식으로 IMAGE_DEBUG_DIRECTORY 섹션이 없는 PE(EXE, DLL) 파일이 있다면 IL disassembler와 assembler를 이용해 "IMAGE_DEBUG_DIRECTORY"를 가진 DLL로 새롭게 빌드해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 이 글의 예제에서는 실제로 IMAGE_DEBUG_DIRECTORY 섹션이 없는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12275'>InterSystems.Data.IRISClient.dll</a>을 대상으로 합니다. C:\temp\> <span style='color: blue; font-weight: bold'>ildasm InterSystems.Data.IRISClient.dll /out=Test.il</span> C:\temp\> <span style='color: blue; font-weight: bold'>mkdir out</span> C:\temp\> <span style='color: blue; font-weight: bold'>ilasm /dll /pdb /Out:.\out\InterSystems.Data.IRISClient.dll Test.il</span> </pre> <br /> 위와 같이 실행하고 나면 c:\temp\out 폴더에 dll, pdb 파일이 각각 놓이게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\out \InterSystems.Data.IRISClient.dll \InterSystems.Data.IRISClient.pdb </pre> <br /> 이제 InterSystems.Data.IRISClient.dll 파일과 InterSystems.Data.IRISClient.pdb 파일을 %DEVPATH% 폴더에 복사해 주시면 됩니다. 그리고 이 단계에서 생성한 PDB는 c:\temp에 있는 test.il 파일과 연결되어 있으므로, IL 코드를 보는 데 크게 위화감이 없는 상태라면 Visual Studio로 디버깅을 시작하면 test.il 코드가 연결되어 IL 단계별로 진행하게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 하지만, 역시나 C# 소스 코드로 디버깅을 보는 것이 역시 편합니다. 따라서, 우선 c:\temp\out에 생성된 PDB 파일은 지우고, <a target='tab' href='https://www.jetbrains.com/ko-kr/decompiler/download/'>(무료로 배포하고 있는) dotpeek</a>를 이용해 c:\temp\out에 있는 InterSystems.Data.IRISClient.dll 파일을 로드해 "Generate PDB..." 명령을 수행해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dotpeek - Generate PDB Files ; <a target='tab' href='https://www.jetbrains.com/help/decompiler/Generating_PDB_Files.html'>https://www.jetbrains.com/help/decompiler/Generating_PDB_Files.html</a> </pre> <br /> dotpeek는 해당 DLL을 기반으로 PDB 파일과 함께 다음의 폴더에 (역어셈블한) 소스 코드를 출력해 둡니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > %LOCALAPPDATA%\jetbrains\shared\vany\decompilercache\decompiler\ </pre> <br /> 마지막으로, 이렇게 생성한 PDB와 그 대상이었던 DLL 파일을 %DEVPATH%에 복사한 후, <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > %DEVPATH% \InterSystems.Data.IRISClient.dll \InterSystems.Data.IRISClient.pdb </pre> <br /> 비주얼 스튜디오에서 디버깅을 시작해 F11(Step-into)로 3rd-party 라이브러리에서 제공하는 클래스의 메서드 내로 진입을 시도하면 "%LOCALAPPDATA%\jetbrains\shared\vany\decompilercache\decompiler\"에 있는 소스 코드 파일들이 열리며 디버깅이 계속됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> (업데이트: 2023-02-14) Visual Studio에서 모듈 창을 이용해 (PDB 연결이 없는) DLL을 "Extract Source Code" 명령을 내리면 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unable to decompile the module. Modules built without support for debug symbols cannot be decompiled. </pre> <br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1378
(왼쪽의 숫자를 입력해야 합니다.)