2016-08-11 11 views
2

MDBG 샘플을 사용하여 관리되는 .NET 디버거를 만들고 있습니다.디버거 StepInto 자동 생성 코드 및 JMC 문제

현재 StepInto 및 StepOver가 작동하는 동안 StepInto 동작과 관련하여 고민하고 있습니다.

Just-My-Code 스테핑을 수행하려면 모듈로드시 SetJMCStatus을 호출해야합니다. 그게 잘 작동하고 내 코드를 디버깅 할 수 있습니다.

하지만 전체 모듈을 JMC로 설정하기 때문에 자동 생성 된 코드가 실행되어 파손될 수 있습니다. 이러한 코드의 예는 자동 속성 일 수 있습니다.

디버거가 단계별로 단계별로 내 모듈에 포함되어 있기 때문에 step-into로 자동 생성 된 get_propertyNameset_propertyName 메서드가 내 코드로 표시됩니다.

자동 생성 코드를 내 코드와 구별하기 위해 자동 생성 코드의 경우 누락 된 디버깅 기호가 있는지 확인할 수 있습니다. 그리고 나서 메소드를 스테핑 중에 건너 뛸 수있는 코드로 표시 할 수 있습니다.

문제는 내가 스테핑 중에 내부에 들어가기 전에 자동 생성되는 방법을 모르겠다는 것입니다. 디버깅 기호가없는 메서드 내부에 밟았을 때 코드가 아니라 코드로 표시 할 수 있지만 너무 늦었습니다 - 디버거가 멈추지 않는 곳에서 중단되었습니다. 다음 만 나는이 다음에 실행될 어떤 기능을 알고 싶다면

foreach (var methodToken in mdbgModule.Importer.EnumerateAllMethodTokens()) { 
       var func = mdbgModule.GetFunction(methodToken); 
        if (func.SymMethod == null) 
         func.CorFunction.JMCStatus = false; 
      } 

:

이론적으로 나는 IMetadataImport를 사용하여 내 모듈의 방법을 반복하고 디버거를 시작할 때 자신의 JMCStatus을 설정하지만, 꽤 비싼 것 같다 수 나는 그것의 상태를 설정하고 처음으로 자동 생성 된 코드 내에서 스텝하는 것을 막을 수있을 것이다.

스테핑을 위해 MDBG 방식을 고수하고 아무것도 변경하지 않고 SetJMCStatus를 필요한 곳에서 호출하므로 모든 코드를 제공하는 것이 타당한 지 확신 할 수 없습니다 ... 그렇다면 질문, 그냥 코멘트를 추가하십시오!

주제에 대한 의견을 보내 주시면 대단히 감사하겠습니다. 이 방법은 디버깅 경우 다음이 JMC 상태의 해제하지 않을 경우 디버거 스테퍼 나누기, 확인 할 때 하나의 옵션에서

감사합니다,

답변

1

마이크 스톨 hinted, 당신은 다음 전체 모듈 JMC을 설정하고 수 있으며, 스테퍼를 다시 실행하십시오. (스테핑을 다시 시작하기 전에 다시 스테핑해야한다면 행동 변화가 생길지 확신하지 못합니다.)

pdb를 사용할 수있는 모듈에 대해 JMC 만 설정하면 문제를 개선 할 수 있습니다 [DebuggerNonUserCode] (아마도 [DebuggerHidden]도 적용됨) 클래스/메소드에 대해 JMC를 비활성화합니다. 하지만 모든 클래스/메소드를 열거하고 속성이 있는지 확인하기보다는 커스텀 속성을 열거하고 tkType이 아닌 tkType이 설정된 IMetaDataImport::EnumCustomAttributes으로 작업 한 다음 IMetaDataImport::GetCustomAttributeProps을 사용하여 적용된 항목을 가져옵니다.

메서드 수준에서 적용 할 경우 [CompilerGenerated] 특성과 유사한 기능을 수행 할 수 있지만 클래스 수준에서 적용하면 오 탐지 될 수 있습니다 (컴파일러는 iterators 및 async 메서드에 대해 상태 시스템에 적용하지만 둘 다 비 생성 코드가있을 수 있습니다).

+0

감사합니다. 브라이언! 나는 Mike Stall의 게시물을 여러 번 읽었지만 지금부터는 힌트를 얻을 수 없었다. 어쨌든, 스테퍼를 다시 실행하는 것은 획기적인 아이디어처럼 보입니다! 나는 그것을 즉시 시도하고 당신에게 알려줄 것입니다. CompilerGenerated 속성의 문제점은 속성 get/set이 때로는 사용자 코드를 포함 할 수 있다는 것입니다. – 3615

+0

Btw, 나는 초기 아이디어와 관련된 몇 가지 코드로이 질문을 업데이트했다. IMetadataTables.GetTableInfo에서 methodDefs 수를 얻고 ICorDebugModule.GetFunctionFromToken에서 사용되는 순차 토큰을 만듭니다. – 3615

+0

제가 언급 한 힌트는 두 번째 마지막 단락의 마지막 문장에 있습니다. 또한 사용자가 해당 메소드에서 처음 멈출 때까지 디버거에서 JMC 상태를 지연시킬 수 있습니다. " –