DynaMD 1.0.9

Helper objects to browse complex structures returned by ClrMD

There is a newer version of this package available.
See the version list below for details.
Install-Package DynaMD -Version 1.0.9
dotnet add package DynaMD --version 1.0.9
<PackageReference Include="DynaMD" Version="1.0.9" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DynaMD --version 1.0.9
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: DynaMD, 1.0.9"
#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

// Install DynaMD as a Cake Tool
#tool nuget:?package=DynaMD&version=1.0.9
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

DynaMD

Helper objects to browse complex structures returned ClrMD

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

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);

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.Int32

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, or get the length:


class SomeType
{
    public int[] ArrayValue;
}

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

Console.WriteLine(proxy.ArrayValue.Length);

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

To retrieve the address of a proxified object, explicitely cast it to ulong:

var address = (ulong)proxy.Child;

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

ClrType type = proxy.GetClrType();

Check the unit tests for more examples.

DynaMD

Helper objects to browse complex structures returned ClrMD

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

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);

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.Int32

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, or get the length:


class SomeType
{
    public int[] ArrayValue;
}

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

Console.WriteLine(proxy.ArrayValue.Length);

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

To retrieve the address of a proxified object, explicitely cast it to ulong:

var address = (ulong)proxy.Child;

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

ClrType type = proxy.GetClrType();

Check the unit tests for more examples.

Release Notes

Added Readme.md

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 History

Version Downloads Last updated
1.0.9.1 143 6/5/2021
1.0.9 123 6/5/2021
1.0.8 100 3/25/2021
1.0.7.3 493 7/8/2019
1.0.7.2 389 2/24/2019
1.0.7.1 532 12/3/2018
1.0.7 450 12/3/2018
1.0.6.2 720 7/15/2018
1.0.6.1 624 7/5/2018
1.0.5.2 609 7/1/2018
1.0.4.1 1,126 4/13/2018
1.0.4 643 4/11/2018
1.0.3.1 621 3/25/2018
1.0.2-pre 716 3/30/2017
1.0.1-pre 612 3/24/2017
1.0.0-pre 634 3/23/2017