2016-06-03 3 views
2

asking for an API to dump many objects from a .NET crash dump file 질문에서 @mark을 도와주고 싶습니다.MDbgEng을 사용하여 메모리에서 객체 읽기

그래서 다음 코드를 mdbgeng을 사용하여 작성했지만 불행히도 메모리에있는 개체를 열거하면 NotImplementedException과 함께 실패합니다.

using System; 
using System.Runtime.InteropServices; 
using Microsoft.Samples.Debugging.CorDebug; 
using Microsoft.Samples.Debugging.CorDebug.Utility; 
using Microsoft.Samples.Debugging.MdbgEngine; 
using Microsoft.Samples.Debugging.Native; 

namespace DumpHeapFromDotNet 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var libraryProvider = new LibraryProvider(); 
      var dumpReader = new DumpReader(args[0]); 
      var dataTarget = new DumpDataTarget(dumpReader); 
      foreach (var module in dumpReader.EnumerateModules()) 
      { 
       var clrDebugging = new CLRDebugging(); 
       Version actualVersion; 
       ClrDebuggingProcessFlags flags; 
       CorProcess proc; 
       var hr = (HResult) clrDebugging.TryOpenVirtualProcess(module.BaseAddress, dataTarget, libraryProvider, 
        new Version(4, 6, int.MaxValue, int.MaxValue), out actualVersion, out flags, out proc); 

       if (hr < 0) 
       { 
        switch (hr) 
        { 
         case HResult.CORDBG_E_NOT_CLR: 
          Console.WriteLine(module.FullName + " is not a .NET module"); 
          break; 
         case HResult.CORDBG_E_LIBRARY_PROVIDER_ERROR: 
          Console.WriteLine(module.FullName + " could not provide library"); 
          break; 
         case HResult.CORDBG_E_UNSUPPORTED_DEBUGGING_MODEL: 
         case HResult.CORDBG_E_UNSUPPORTED_FORWARD_COMPAT: 
          break; 
         default: 
          Marshal.ThrowExceptionForHR((int)hr); 
          break; 
        } 
       } 
       else 
       { 
        var objects = proc.Objects; // NotImplementedException 
        foreach (CorObjectValue o in objects) 
        { 
         // TODO: Write details of object to file here 
        } 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

내가 사용 된 덤프는 전체 메모리와 .NET 4.6.1076.0 덤프가 (당신은 인자로 파일 이름을 전달할 수 있습니다) :

0:000> lm vm clr 
[...] 
ProductVersion: 4.6.1076.0 
FileVersion:  4.6.1076.0 built by: NETFXREL3STAGE 

0:000> .dumpdebug 
----- User Mini Dump Analysis 

MINIDUMP_HEADER: 
Version   A793 (61B1) 
NumberOfStreams 11 
Flags   1806 
       0002 MiniDumpWithFullMemory 
       0004 MiniDumpWithHandleData 
       0800 MiniDumpWithFullMemoryInfo 
       1000 MiniDumpWithThreadInfo 

을 내가 함께 할 수있는 뭔가가 의심 누락 된 mscordacwks 또는 이와 비슷한, 나는이 샘플에 사용 된 것과 동일한 .NET 프레임 워크를 사용하여 동일한 시스템에서 덤프를 작성했기 때문에.

아직 실제로 구현되지 않았습니까? 아니면 내가 잘못된 것을하고 있습니까?

답변

1

저는 현재 MDBG를 망치고 있습니다. 실제 응용 프로그램에서 덤프가 아니라 설명 된 동작을 확인하려고했습니다. 나는 예외적으로 구현되지 않은 Exatly를 받았다. MSDN에 대한 설명서를 찾고 나는이 확인 메시지를 발견했습니다.이 내용은 method is not implemented입니다.

관련 문제