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

닷넷 프로파일러 - ICorProfilerInfo::GetILFunctionBody 함수 버그

얼마 전 고객사에서 희한한 버그가 발생했습니다. Visual Basic .NET으로 만들어진 어셈블리였는데, 구현된 클래스 중에서 별로 특징적이지도 않은 그 메서드 하나만 후킹을 하려고 하면 꼭 System.BadImageFormatException - "Bad class token" 예외가 발생하는 것이었습니다.

오류를 재현하려고 해당 메서드의 코드를 IL 레벨에서 복사를 한 다음, 제가 만든 동일한 VB 소스 코드로 옮겨 보았으나 이제는 오류가 발생하지 않았습니다. 즉, 그 VB.NET 어셈블리에 바로 그 코드가 존재했을 때에만 오류가 발생하는 희한한 현상이었던 것입니다.

조사 결과, GetILFunctionBody의 메서드 크기를 반환하는 것에 버그가 있다는 것을 알게 되었습니다.

예를 들어, 원래 메서드의 크기가 200byte라면 GetILFunctionBody는 198byte를 반환하는 현상이 발생한 것이었습니다. 혹시나 검색을 해보았더니, 정말 그와 같은 이야기가 나옵니다.

BUG: GetILFunctionBody returns wrong size
; http://blogs.msdn.com/b/davbr/archive/2008/05/22/bug-getilfunctionbody-returns-wrong-size.aspx

ICorProfilerInfo::GetILFunctionBody doesn't return the correct size on methods with SEH? 
; http://social.msdn.microsoft.com/forums/en-US/netfxtoolsdev/thread/88fe07e0-6e4a-4334-bd09-b760e3c7b455/

정리해 보면, CLR 2.x의 버그인데 GetILFunctionBody가 메서드의 실제 크기보다 더 크게 반환할 수 있다는 것입니다. IL 코드 영역이 DWORD 정렬이 되어야 해서 0 ~ 3바이트 정도 패딩이 될 수 있는데 패딩의 2배 범위내로 오차가 발생하므로 0 ~ 6바이트 정도의 차이가 있다는 것입니다.

재미있는 것은 위의 문서는 실제 크기보다 더 많게 반환된다는 문서였고, 제 경우에는 2바이트 적게 반환된다는 점이었습니다. 왜 2바이트였을까요? 가만 보니 그 메서드의 IL 코드 패딩이 2바이트였습니다. 그것이 우연의 일치였는지, 전혀 다른 이유에서였는지에 대해서는 알 수 없습니다. 어쨌든, CLR 4부터는 이런 문제가 없어졌겠지만 CLR 2.x를 대상으로 하는 Profiler를 만드는 분들은 이점에 주의를 해야 합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/5/2016]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  52  53  54  55  56  [57]  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12515정성태1/28/202118795웹: 41. Microsoft Edge - localhost에 대해 http 접근 시 무조건 https로 바뀌는 문제 [3]
12514정성태1/28/202118991.NET Framework: 1021. C# - 일렉트론 닷넷(Electron.NET) 소개 [1]파일 다운로드1
12513정성태1/28/202116096오류 유형: 698. electronize - User Profile 디렉터리에 공백 문자가 있는 경우 빌드가 실패하는 문제 [1]
12512정성태1/28/202116524오류 유형: 697. The program can't start because VCRUNTIME140.dll is missing from your computer. Try reinstalling the program to fix this problem.
12511정성태1/27/202116246Windows: 187. Windows - 도스 시절의 8.3 경로를 알아내는 방법
12510정성태1/27/202117096.NET Framework: 1020. .NET Core Kestrel 호스팅 - Razor 지원 추가 [1]파일 다운로드1
12509정성태1/27/202116940개발 환경 구성: 524. Jupyter Notebook에서 C#(F#, PowerShell) 언어 사용을 위한 환경 구성 [3]
12508정성태1/27/202116219개발 환경 구성: 523. Jupyter Notebook - Slide 플레이 버튼이 없는 경우
12507정성태1/26/202116763VS.NET IDE: 157. Visual Studio - Syntax Visualizer 메뉴가 없는 경우
12506정성태1/25/202119882.NET Framework: 1019. Microsoft.Tye 기본 사용법 소개 [1]
12505정성태1/23/202116555.NET Framework: 1018. .NET Core Kestrel 호스팅 - Web API 추가 [1]파일 다운로드1
12504정성태1/23/202118562.NET Framework: 1017. .NET 5에서의 네트워크 라이브러리 개선 (2) - HTTP/2, HTTP/3 관련 [1]
12503정성태1/21/202116956오류 유형: 696. C# - HttpClient: Requesting HTTP version 2.0 with version policy RequestVersionExact while HTTP/2 is not enabled.
12502정성태1/21/202117515.NET Framework: 1016. .NET Core HttpClient의 HTTP/2 지원파일 다운로드1
12501정성태1/21/202116456.NET Framework: 1015. .NET 5부터 HTTP/1.1, 2.0 선택을 위한 HttpVersionPolicy 동작 방식파일 다운로드1
12500정성태1/21/202117304.NET Framework: 1014. ASP.NET Core(Kestrel)의 HTTP/2 지원 여부파일 다운로드1
12499정성태1/20/202118673.NET Framework: 1013. .NET Core Kestrel 호스팅 - 포트 변경, non-localhost 접속 지원 및 https 등의 설정 변경 [1]파일 다운로드1
12498정성태1/20/202117081.NET Framework: 1012. .NET Core Kestrel 호스팅 - 비주얼 스튜디오의 Kestrel/IIS Express 프로파일 설정
12497정성태1/20/202119675.NET Framework: 1011. C# - OWIN Web API 예제 프로젝트 [1]파일 다운로드2
12496정성태1/19/202117013.NET Framework: 1010. .NET Core 콘솔 프로젝트에서 Kestrel 호스팅 방법 [1]
12495정성태1/19/202119351웹: 40. IIS의 HTTP/2 지원 여부 - h2, h2c [1]
12494정성태1/19/202118612개발 환경 구성: 522. WSL 2 인스턴스와 호스트 측의 Hyper-V에 운영 중인 VM과 네트워크 연결을 하는 방법 [2]
12493정성태1/18/202116700.NET Framework: 1009. .NET 5에서의 네트워크 라이브러리 개선 (1) - HTTP 관련 [1]파일 다운로드1
12492정성태1/17/202115648오류 유형: 695. ASP.NET 0x80131620 Failed to bind to address
12491정성태1/16/202117654.NET Framework: 1008. 배열을 반환하는 C# COM 개체의 메서드를 C++에서 사용 시 메모리 누수 현상 [1]파일 다운로드1
12490정성태1/15/202116788.NET Framework: 1007. C# - foreach에서 열거 변수의 타입을 var로 쓰면 object로 추론하는 문제 [1]파일 다운로드1
... 46  47  48  49  50  51  52  53  54  55  56  [57]  58  59  60  ...