2016-06-03 6 views
2

Я хотел помочь @mark в вопросе, где он asking for an API to dump many objects from a .NET crash dump file.Чтение объектов из памяти с помощью 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, и я попытался проверить описанное поведение на реальном приложении, а не на дампе. Я получил то же исключение. В поисках документации по MSDN я нашел подтверждение, что это method is not implemented.