DynaMD 1.0.9.1

.NET Core 3.1 .NET Standard 2.0 .NET Framework 4.7.1
dotnet add package DynaMD --version 1.0.9.1
NuGet\Install-Package DynaMD -Version 1.0.9.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DynaMD" Version="1.0.9.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DynaMD --version 1.0.9.1
#r "nuget: DynaMD, 1.0.9.1"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install DynaMD as a Cake Addin
#addin nuget:?package=DynaMD&version=1.0.9.1

// Install DynaMD as a Cake Tool
#tool nuget:?package=DynaMD&version=1.0.9.1

DynaMD

About

Helper objects to browse complex structures returned by ClrMD. This is useful to quickly write scripts to analyze memory dumps.

The library leverages the dynamic keyword to give direct access to memory structures.

How to use

Given an address and a ClrMD ClrHeap instance, you can get a dynamic proxy by calling GetProxy:

var proxy = heap.GetProxy(0x00001000);

Or all the instances of a given type:

// Using generics:
var proxies1 = heap.GetProxies<string>();

// Or writing the type name (useful if you don't reference it):
var proxies2 = heap.GetProxies("System.String");

From there, you can access any field like you would with a "real" object:

Console.WriteLine(proxy.Value);
Console.WriteLine((string)proxy.Child.Name);
Console.WriteLine(proxy.Description.Size.Width * proxy.Description.Size.Height);

Only fields are supported, but automatic properties are translated:

class SomeType
{
    private int _backingField;
    public int Field1 => _backingField;
    public int Field2 { get; }
}

var proxy = heap.GetProxies<SomeType>().First();

var value1 = proxy._backingField; // Calling proxy.Field1 is not supported
var value2 = proxy.Field2; // Automatically translated to <Field2>k__BackingField

Primitive types are automatically converted:

class SomeType
{
    public int IntValue;
    public double DoubleValue;
}

var proxy = heap.GetProxies<SomeType>().First();

Console.WriteLine(proxy.IntValue.GetType()); // System.Int32
Console.WriteLine(proxy.DoubleValue.GetType()); // System.Double

Non-primitive proxies can be cast to string or blittable structs:

struct BlittableStruct
{
    public int Value;
}

class SomeType
{
    public BlittableStruct StructValue;
    public DateTime DateTimeValue;
    public string StringValue;
}

var proxy = heap.GetProxies<SomeType>().First();

BlittableStruct structValue = (BlittableStruct)proxy.StructValue;
DateTime dateTimeValue = (DateTime)proxy.DateTimeValue;
string stringValue = (string)proxy.stringValue;

You can also enumerate the contents of arrays, get the length, or use an indexer:


class SomeType
{
    public int[] ArrayValue;
}

var proxy = heap.GetProxies<SomeType>().First();

Console.WriteLine("Length: " + proxy.ArrayValue.Length);
Console.WriteLine("First element: " + proxy.ArrayValue[0]);

foreach (var value in proxy.ArrayValue)
{
    Console.WriteLine(value);
}

To retrieve the address of a proxified object, explicitely cast it to ulong. Also, calling .ToString() on a proxy will return the address encoded in hexadecimal:

var proxy = heap.GetProxy(0x1000);
var address = (ulong)proxy;
Console.WriteLine("{0:x2}", address); // 0x1000
Console.WriteLine(proxy); // 0x1000

To retrieve the instance of ClrType, call GetClrType():

ClrType type = proxy.GetClrType();

Check the unit tests for more examples.

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows net7.0 net7.0-android net7.0-ios net7.0-maccatalyst net7.0-macos net7.0-tvos net7.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on DynaMD:

Repository Stars
chrisnas/DebuggingExtensions
Host of debugging-related extensions such as post-mortem tools or WinDBG extensions
Version Downloads Last updated
1.0.9.1 411 6/5/2021
1.0.9 276 6/5/2021
1.0.8 257 3/25/2021
1.0.7.3 709 7/8/2019
1.0.7.2 571 2/24/2019
1.0.7.1 730 12/3/2018
1.0.7 642 12/3/2018
1.0.6.2 971 7/15/2018
1.0.6.1 870 7/5/2018
1.0.5.2 828 7/1/2018
1.0.4.1 1,403 4/13/2018
1.0.4 896 4/11/2018
1.0.3.1 888 3/25/2018
1.0.2-pre 853 3/30/2017
1.0.1-pre 743 3/24/2017
1.0.0-pre 767 3/23/2017

Added Readme.md