private int GetActiveConnectionCount(ClrObject connectionPool) { var connections = connectionPool.ReadObjectField("_objectList"); ClrArray dbConnectionInternals = connections.ReadObjectField("_items").AsArray(); int openConnections = 0; for (int i = 0; i < dbConnectionInternals.Length; i++) { var SqlInternalConnectionTds = dbConnectionInternals.GetObjectValue(i); bool isConnectioOpen = false; try { isConnectioOpen = SqlInternalConnectionTds.ReadField <bool>("_fConnectionOpen"); } catch (Exception e) { PrintDebugMessage($"Exception while processing active connections {e.Message}"); //the array can have null objects. We will be catching them here. } if (isConnectioOpen) { openConnections++; } } return(openConnections); }
public void Length_WhenReferenceArrayWithBlanks_ReturnsExpected() { // Arrange ClrArray referenceArraySnapshot = _arrayHolder .ReadObjectField(nameof(ArrayConnection.ArraysHolder.ReferenceArrayWithBlanks)).AsArray(); // Act & Assert Assert.Equal(_prototype.ReferenceArrayWithBlanks.Length, referenceArraySnapshot.Length); }
public void Length_WhenCustomStructArray_ReturnsExpected() { // Arrange ClrArray customStructArray = _arrayHolder .ReadObjectField(nameof(ArrayConnection.ArraysHolder.StructArray)).AsArray(); // Act & Assert Assert.Equal(_prototype.StructArray.Length, customStructArray.Length); }
public void Length_WhenDateTimeArray_ReturnsExpected() { // Arrange ClrArray dateTimeArray = _arrayHolder .ReadObjectField(nameof(ArrayConnection.ArraysHolder.DateTimeArray)).AsArray(); // Act & Assert Assert.Equal(_prototype.DateTimeArray.Length, dateTimeArray.Length); }
public void Length_WhenPrimitiveValueTypeArray_ReturnsExpected() { // Arrange ClrArray intArraySnapshot = _arrayHolder .ReadObjectField(nameof(ArrayConnection.ArraysHolder.IntArray)).AsArray(); // Act & Assert Assert.Equal(_prototype.IntArray.Length, intArraySnapshot.Length); }
public void Length_WhenStringArray_ReturnsExpected() { // Arrange ClrArray referenceArraySnapshot = _arrayHolder .GetObjectField(nameof(ArrayConnection.ArraysHolder.StringArray)).AsArray(); // Act & Assert Assert.Equal(_prototype.StringArray.Length, referenceArraySnapshot.Length); }
public void Length_WhenGuidArray_ReturnsExpected() { // Arrange ClrArray guidArray = _arrayHolder .GetObjectField(nameof(ArrayConnection.ArraysHolder.GuidArray)).AsArray(); // Act & Assert Assert.Equal(_prototype.GuidArray.Length, guidArray.Length); }
private Dictionary <string, string> GetParameters(ClrArray parameters) { Dictionary <string, string> parameterValues = new Dictionary <string, string>(); for (int i = 0; i < parameters.Length; i++) { ClrObject parameter = parameters.GetObjectValue(i); if (parameter.Address != 0) { string parameterName = parameter.ReadStringField("_parameterName"); string parameterValue = ""; if (parameter.ReadObjectField("_value").Address != 0) { switch (parameter.ReadObjectField("_value").Type.Name) { case "System.Int64": parameterValue = parameter.ReadField <Int64>("_value").ToString(); break; case "System.String": parameterValue = parameter.ReadObjectField("_value").AsString(); break; case "System.Int32": parameterValue = parameter.ReadField <Int32>("_value").ToString(); break; case "System.DateTime": parameterValue = parameter.ReadField <DateTime>("_value").ToString(); break; case "System.Double": parameterValue = parameter.ReadField <Double>("_value").ToString(); break; case "System.Boolean": parameterValue = parameter.ReadField <Boolean>("_value").ToString(); break; default: parameterValue = "cannot be read"; break; } } if (!string.IsNullOrEmpty(parameterValue) && !string.IsNullOrEmpty(parameterName)) { parameterValues.Add(parameterName, parameterValue); } } } return(parameterValues); }
static void Main(string[] args) { if (args.Length != 3) { Console.WriteLine("Usage: DumpDict [dump] [objref]"); Environment.Exit(1); } if (ulong.TryParse(args[2], System.Globalization.NumberStyles.HexNumber, null, out ulong objAddr)) { Console.WriteLine($"Could not parse object ref '{args[2]}'."); Environment.Exit(1); } string dumpFileName = args[0]; string dacPath = args[1]; using DataTarget dataTarget = DataTarget.LoadDump(dumpFileName); using ClrRuntime runtime = dataTarget.ClrVersions.Single().CreateRuntime(); ClrHeap heap = runtime.Heap; ClrObject obj = heap.GetObject(objAddr); if (!obj.IsValidObject) { Console.WriteLine("Invalid object {0:X}", obj); return; } if (!obj.Type.Name.StartsWith("System.Collections.Generic.Dictionary")) { Console.WriteLine("Error: Expected object {0:X} to be a dictionary, instead it's of type '{1}'."); return; } // Get the entries field. ClrArray entries = obj.ReadObjectField("entries").AsArray(); Console.WriteLine("{0,8} {1,16} : {2}", "hash", "key", "value"); for (int i = 0; i < entries.Length; ++i) { ClrObject entry = entries.GetObjectValue(i); // TODO: Need to handle non-object references int hashCode = entry.ReadField <int>("hashCode"); ClrObject key = entry.ReadObjectField("key"); ClrObject value = entry.ReadObjectField("value"); Console.WriteLine($"{hashCode:x} {key} -> {value}"); } }
public static IEnumerable <ClrObject> EnumerateObjectItems(ClrArray array) { var length = array.Length; if (length == 0) { yield break; } for (int itemIndex = 0; itemIndex < length; itemIndex++) { yield return(array.GetObjectValue(itemIndex)); } }
private IEnumerable <SqlCommandInfo> GetSqlCommandInfo() { List <ClrObject> commandObjects = new List <ClrObject>(); commandObjects.AddRange(FilterObjectByType("System.Data.SqlClient.SqlCommand")); commandObjects.AddRange(FilterObjectByType("Microsoft.Data.SqlClient.SqlCommand")); if (commandObjects.Count != 0) { foreach (ClrObject commandObject in commandObjects) { string commandString = commandObject.ReadStringField("_commandText"); string connectionString = commandObject.ReadObjectField("_activeConnection").ReadStringField("_connectionString"); ClrObject paramsObject = commandObject.ReadObjectField("_parameters"); int connState = commandObject.ReadObjectField("_activeConnection").ReadObjectField("_innerConnection").ReadField <int>("_state"); string connectionState = "Open"; if (connState == 0) { connectionState = "Closed"; } Dictionary <string, string> parameters = new Dictionary <string, string>(); if (paramsObject.Address != 0) { ClrArray paramsArray = paramsObject.ReadObjectField("_items").ReadObjectField("_items").AsArray(); parameters = GetParameters(paramsArray); } yield return(parameters.Count == 0 ? new SqlCommandInfo { CommandString = commandString, ConnectionString = connectionString, Parameters = null, ConnectionState = connectionState } : new SqlCommandInfo { CommandString = commandString, ConnectionString = commandString, Parameters = parameters, ConnectionState = connectionState }); } } else { yield break; } }
private static bool HasSimpleValue(ClrArray items, int index, ClrValueType item, out string content) { content = null; var typeName = item.Type.Name; switch (typeName) { case "System.Char": content = $"'{items.GetValue<System.Char>(index)}'"; break; case "System.Boolean": content = items.GetValue <System.Boolean>(index).ToString(); break; case "System.SByte": content = items.GetValue <System.SByte>(index).ToString(); break; case "System.Byte": content = items.GetValue <System.Byte>(index).ToString(); break; case "System.Int16": content = items.GetValue <System.Int16>(index).ToString(); break; case "System.UInt16": content = items.GetValue <System.UInt16>(index).ToString(); break; case "System.Int32": content = items.GetValue <System.Int32>(index).ToString(); break; case "System.UInt32": content = items.GetValue <System.UInt32>(index).ToString(); break; case "System.Int64": content = items.GetValue <System.Int64>(index).ToString(); break; case "System.UInt64": content = items.GetValue <System.UInt64>(index).ToString(); break; case "System.Single": content = items.GetValue <System.Single>(index).ToString(); break; case "System.Double": content = items.GetValue <System.Double>(index).ToString(); break; case "System.IntPtr": { var val = items.GetValue <System.IntPtr>(index); content = (val == IntPtr.Zero) ? "null" : $"0x{val.ToInt64():x16}"; } break; case "System.UIntPtr": { var val = items.GetValue <System.UIntPtr>(index); content = (val == UIntPtr.Zero) ? "null" : $"0x{val.ToUInt64():x16}"; } break; default: return(false); } return(true); }
public ArrayProxy(RuntimeContext context, ClrObject targetObject) : base(context, targetObject) { _clrArray = TargetObject.AsArray(); }
public ArrayProxy(RuntimeContext context, ulong address) : base(context, address) { _clrArray = TargetObject.AsArray(); }