MDBG 샘플을 사용하여 관리되는 .NET 디버거를 만들고 있습니다.디버거 StepInto 자동 생성 코드 및 JMC 문제
현재 StepInto 및 StepOver가 작동하는 동안 StepInto 동작과 관련하여 고민하고 있습니다.
Just-My-Code
스테핑을 수행하려면 모듈로드시 SetJMCStatus
을 호출해야합니다. 그게 잘 작동하고 내 코드를 디버깅 할 수 있습니다.
하지만 전체 모듈을 JMC로 설정하기 때문에 자동 생성 된 코드가 실행되어 파손될 수 있습니다. 이러한 코드의 예는 자동 속성 일 수 있습니다.
디버거가 단계별로 단계별로 내 모듈에 포함되어 있기 때문에 step-into로 자동 생성 된 get_propertyName
및 set_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 상태의 해제하지 않을 경우 디버거 스테퍼 나누기, 확인 할 때 하나의 옵션에서
감사합니다,
감사합니다. 브라이언! 나는 Mike Stall의 게시물을 여러 번 읽었지만 지금부터는 힌트를 얻을 수 없었다. 어쨌든, 스테퍼를 다시 실행하는 것은 획기적인 아이디어처럼 보입니다! 나는 그것을 즉시 시도하고 당신에게 알려줄 것입니다. CompilerGenerated 속성의 문제점은 속성 get/set이 때로는 사용자 코드를 포함 할 수 있다는 것입니다. – 3615
Btw, 나는 초기 아이디어와 관련된 몇 가지 코드로이 질문을 업데이트했다. IMetadataTables.GetTableInfo에서 methodDefs 수를 얻고 ICorDebugModule.GetFunctionFromToken에서 사용되는 순차 토큰을 만듭니다. – 3615
제가 언급 한 힌트는 두 번째 마지막 단락의 마지막 문장에 있습니다. 또한 사용자가 해당 메소드에서 처음 멈출 때까지 디버거에서 JMC 상태를 지연시킬 수 있습니다. " –