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 string?[] GetStringArray() { if (Length == 0) { return(Array.Empty <string>()); } var stringArray = new string?[Length]; for (int itemIndex = 0; itemIndex < Length; itemIndex++) { var arrayElement = _clrArray .GetObjectValue(itemIndex) .AsString(); stringArray[itemIndex] = arrayElement; } return(stringArray); }
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)); } }