DynaMD 1.1.0
dotnet add package DynaMD --version 1.1.0
NuGet\Install-Package DynaMD -Version 1.1.0
<PackageReference Include="DynaMD" Version="1.1.0" />
paket add DynaMD --version 1.1.0
#r "nuget: DynaMD, 1.1.0"
// Install DynaMD as a Cake Addin #addin nuget:?package=DynaMD&version=1.1.0 // Install DynaMD as a Cake Tool #tool nuget:?package=DynaMD&version=1.1.0
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 Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
- Microsoft.CSharp (>= 4.5.0)
- Microsoft.Diagnostics.Runtime (>= 3.1.512801)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
-
.NETFramework 4.8
- Microsoft.CSharp (>= 4.5.0)
- Microsoft.Diagnostics.Runtime (>= 3.1.512801)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
-
.NETStandard 2.0
- Microsoft.CSharp (>= 4.5.0)
- Microsoft.Diagnostics.Runtime (>= 3.1.512801)
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
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.1.0 | 251 | 3/8/2024 |
1.0.9.1 | 660 | 6/5/2021 |
1.0.9 | 402 | 6/5/2021 |
1.0.8 | 401 | 3/25/2021 |
1.0.7.3 | 893 | 7/8/2019 |
1.0.7.2 | 723 | 2/24/2019 |
1.0.7.1 | 894 | 12/3/2018 |
1.0.7 | 804 | 12/3/2018 |
1.0.6.2 | 1,146 | 7/15/2018 |
1.0.6.1 | 1,034 | 7/5/2018 |
1.0.5.2 | 998 | 7/1/2018 |
1.0.4.1 | 1,592 | 4/13/2018 |
1.0.4 | 1,064 | 4/11/2018 |
1.0.3.1 | 1,062 | 3/25/2018 |
1.0.2-pre | 967 | 3/30/2017 |
1.0.1-pre | 860 | 3/24/2017 |
1.0.0-pre | 887 | 3/23/2017 |
Upgrade to ClrMD 3