コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
    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}");
        }
    }
コード例 #5
0
        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));
            }
        }