성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
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'>Unknown custom metadata item kind: 6</h1> <p> 닷넷의 PDB 파일 관련 오픈 소스를 빌드하거나 해당 클래스를 사용해 PDB 파일을 분석하다 보면 다음과 같은 예외가 발생할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unhandled Exception: Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbDebugException: Unknown custom metadata item kind: 6 at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbFunction.ReadCustomMetadata(BitAccess bits) at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbFunction..ctor(ManProcSym proc, BitAccess bits) at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbFunction.LoadManagedFunctions(BitAccess bits, UInt32 limit, Boolean readStrings) at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbFile.LoadFuncsFromDbiModule(BitAccess bits, DbiModuleInfo info, Dictionary`2 names, List`1 funcList, Boolean readStrings, MsfDirectory dir, Dictionary`2 nameIndex, PdbStreamHelper reader, Dictionary`2 sources) at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbFile.LoadFunctions(Stream read, BitAccess bits, Boolean readAllStrings, Int32& ver, Int32& sig, Int32& age, Guid& guid, IEnumerable`1& sources) at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbReader.Init(Stream pdbStream) at Microsoft.Diagnostics.Runtime.Utilities.Pdb.PdbReader..ctor(String fileName) at Extensions.GetReaderForFrame(ClrStackFrame frame) in C:\ConsoleApplication2\ConsoleApplication2\Program.cs:line 260 at Extensions.GetSourceLocation(ClrStackFrame frame) in C:\ConsoleApplication2\ConsoleApplication2\Program.cs:line 147 at ConsoleApplication2.Program.threadStart() in C:\ConsoleApplication2\ConsoleApplication2\Program.cs:line 105 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() </pre> <br /> 문제가 되는 소스 코드를 따라가 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private void ReadCustomMetadata(BitAccess bits) { int savedPosition = bits.Position; byte version; bits.ReadUInt8(out version); if (version != 4) { throw new PdbDebugException("Unknown custom metadata item version: {0}", version); } byte kind; bits.ReadUInt8(out kind); bits.Align(4); uint numberOfBytesInItem; bits.ReadUInt32(out numberOfBytesInItem); switch (kind) { case 0: this.ReadUsingInfo(bits); break; case 1: break; // this.ReadForwardInfo(bits); break; case 2: break; // this.ReadForwardedToModuleInfo(bits); break; case 3: this.ReadIteratorLocals(bits); break; case 4: this.ReadForwardIterator(bits); break; <span style='color: blue; font-weight: bold'>default: throw new PdbDebugException("Unknown custom metadata item kind: {0}", kind);</span> } bits.Position = savedPosition + (int)numberOfBytesInItem; } </pre> <br /> PDB 분석 항목의 종류가 0 ~ 4까지만 지원하고 그 외의 숫자는 PdbDebugException이 발생하도록 만들어졌기 때문에 당연한 결과입니다.<br /> <br /> 다음의 이슈에 따르면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Fody is not working with Visual Studio 2015 ; <a target='tab' href='https://github.com/Fody/Fody/issues/141'>https://github.com/Fody/Fody/issues/141</a> </pre> <br /> Visual Studio 2015로 빌드한 PDB 결과물을 분석하는 경우 나오는 이슈라고 합니다. (실제로 좀 더 검색해 보면 2015부터 적용된 Roslyn 컴파일러에서 새롭게 제공되는 PDB 산출물 결과 때문입니다.)<br /> <br /> 어쨌든, 저 141번 이슈에서 Fody는 문제를 해결했다고 하면서 베타 버전을 내놓습니다. 그런데... ^^ 어떻게 고쳤을까요? 이는 1.26.2-beta1과 1.26.1 버전의 ReadCustomMetadata 메서드를 .NET Reflector로 보면 됩니다.<br /> <br /> 그래서 2개의 버전을 각각 다음과 같이 개별 프로젝트에 적용해 내려받고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Install-Package Fody -Version 1.26.2-beta1 -Pre Install-Package Fody -Version 1.26.1 </pre> <br /> Mono.Cecil.Pdb.dll 어셈블리의 Microsoft.Cci.Pdb.PdbFunction 클래스에 있는 ReadCustomMetadata를 1.26.2-beta1에서 변경된 부분을 찾아봤습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private void ReadCustomMetadata(BitAccess bits) { byte num2; byte num3; uint num4; int position = bits.Position; bits.ReadUInt8(out num2); if (num2 != 4) { throw new PdbDebugException("Unknown custom metadata item version: {0}", new object[] { num2 }); } bits.ReadUInt8(out num3); bits.Align(4); bits.ReadUInt32(out num4); switch (num3) { case 0: this.ReadUsingInfo(bits); break; case 1: this.ReadForwardInfo(bits); break; case 3: this.ReadIteratorLocals(bits); break; case 4: this.ReadForwardIterator(bits); break; } bits.Position = position + ((int) num4); } </pre> <br /> 간단하군요. ^^ 그냥 "default" 조건을 지워버렸습니다. 사실 그래도 되는 것이 switch 문 지나서 Position을 강제로 해당 PDB 항목을 건너 뛴 상태로 이동하기 때문입니다. (물론, 완벽한 것은 6번 종류의 PDB 항목도 읽어서 정보로 가지고 있으면 좋겠지요.)<br /> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1414
(왼쪽의 숫자를 입력해야 합니다.)