Example #1
0
        public IReadOnlyCollection <ObjectTypeStatistics> GetInstanceTypeStatistics([FromQuery(Name = "traversing-heap-mode")] TraversingHeapModes traversingMode)
        {
            var analyzer = new ObjectTypeStatisticsAnalyzer(_runtimeContext);

            analyzer.TraversingHeapMode = traversingMode;
            return(analyzer.GetObjectTypeStatistics());
        }
Example #2
0
 private void LogLongestStrings(ILogger logger, TraversingHeapModes traversingMode, int count, int maxLength = 200)
 {
     foreach (var s in GetStrings(count, maxLength))
     {
         logger.LogInformation($"Length = {s.Length} symbols, Value = {s.Value}");
     }
 }
Example #3
0
 public IEnumerable <ClrObject> EnumerateObjects(TraversingHeapModes traversingMode)
 {
     return
         (from obj in Heap.EnumerateObjects()
          where obj.IsValid &&
          FilterByWalkMode(traversingMode, obj.Address)
          select obj);
 }
Example #4
0
 private bool FilterByWalkMode(TraversingHeapModes traversingMode, ulong address)
 {
     return(traversingMode switch
     {
         TraversingHeapModes.Live => HeapIndex.HasRoot(address),
         TraversingHeapModes.Dead => !HeapIndex.HasRoot(address),
         TraversingHeapModes.All => true,
         _ => throw new ArgumentOutOfRangeException(nameof(traversingMode), traversingMode, null),
     });
Example #5
0
        private void WriteLog(ILogger logger, TraversingHeapModes traversingMode)
        {
            foreach (var timer in GetTimers(traversingMode))
            {
                logger.LogInformation($"{timer.Address} m_dueTime = {timer.DueTime}, m_period = {timer.Period}, m_canceled = {timer.Cancelled}");

                if (timer.CancellationState != null)
                {
                    logger.LogInformation($"CanBeCanceled: {timer.CancellationState.CanBeCanceled}");
                    logger.LogInformation($"IsCancellationRequested: {timer.CancellationState.IsCancellationRequested}");
                    logger.LogInformation($"IsCancellationCompleted: {timer.CancellationState.IsCancellationCompleted}");
                }
            }
        }
Example #6
0
        private IEnumerable <ClrObject> GetLongestStrings(int count, TraversingHeapModes traversingMode)
        {
            var query =
                from clrObject in Context.EnumerateObjectsByTypeName("System.String", traversingMode)
                orderby clrObject.Size descending
                select clrObject;

            return(query.Take(count));

            //                var stringLength = clrObject.GetField<int>("_stringLength");
            //                var firstCharAddress = clrObject.Type.GetFieldByName("_firstChar").GetAddress(clrObject.Address);
            //
            //                var bufferLength = Math.Min(stringLength * 2, 30 * 2);
            //                var buffer = new byte[bufferLength];
            //                heap.ReadMemory(firstCharAddress,buffer,0,
            //                    bufferLength);
            //
            //                Console.WriteLine($"Address: {clrObject.HexAddress}");
            //                Console.WriteLine($"Length: {stringLength}");
            //                Console.WriteLine($"Value: {System.Text.Encoding.Unicode.GetString(buffer)}...");
        }
Example #7
0
        public IReadOnlyCollection <TimerQueueTimerInfo> GetTimers(TraversingHeapModes traversingMode)
        {
            var result = new List <TimerQueueTimerInfo>();

            foreach (var address in Context.EnumerateObjectAddressesByTypeName("System.Threading.TimerQueueTimer", traversingMode))
            {
                var timerObjectType = Context.Heap.GetObjectType(address);

                var state    = timerObjectType.GetFieldByName("m_state").ReadObject(address, false);
                var dueTime  = timerObjectType.GetFieldByName("m_dueTime").Read <uint>(address, true);
                var period   = timerObjectType.GetFieldByName("m_period").Read <uint>(address, true);
                var canceled = timerObjectType.GetFieldByName("m_canceled").Read <bool>(address, true);

                //        var timerCallback = timerObjectType.GetFieldByName("m_timerCallback")
                //           .GetValue(address);

                //             public delegate void TimerCallback(Object state);
                //var timerCallbackObjectType = heap.GetObjectType((ulong)timerCallback);

                CancellationTokenSourceInfo?cancellationTokenSourceInfo = null;
                if (state.IsValid)
                {
                    var stateObjectType = state.Type;

                    if (stateObjectType.Name == "System.Threading.CancellationTokenSource")
                    {
                        var cancellationTokenSourceProxy = new CancellationTokenSourceProxy(Context, state);
                        cancellationTokenSourceInfo = new(cancellationTokenSourceProxy.CanBeCanceled, cancellationTokenSourceProxy.IsCancellationRequested, cancellationTokenSourceProxy.IsCancellationCompleted);
                    }
                }

                var timerInfo = new TimerQueueTimerInfo(new(address), dueTime, period, canceled, cancellationTokenSourceInfo);
                result.Add(timerInfo);
            }

            return(result);
        }
Example #8
0
 private void WriteLog(ILogger logger, TraversingHeapModes traversingMode)
 {
     LogLongestStrings(logger, traversingMode, 10);
 }
Example #9
0
 public async Task <ObjectTypeStatistics[]> GetInstanceTypeStatisticsAsync(TraversingHeapModes traversingMode)
 {
     return(await _httpClient.GetFromJsonAsync <ObjectTypeStatistics[]>($"dump/instance-type-statistics?traversing-heap-mode={traversingMode:G}"));
 }
Example #10
0
        public IEnumerable <ClrObject> EnumerateObjectsByTypeName(string typeName, TraversingHeapModes traversingMode)
        {
            var clrType = Heap.GetTypeByName(typeName);

            return(EnumerateObjects(traversingMode).Where(obj => obj.Type !.MethodTable == clrType.MethodTable));
        }
Example #11
0
        public IEnumerable <ulong> EnumerateObjectAddressesByTypeName(string typeName, TraversingHeapModes traversingMode)
        {
            var clrType = Heap.GetTypeByName(typeName);

            if (clrType == null)
            {
                throw new Exception($"Type '{typeName}' is not found");
            }

            return
                (from clrObject in Heap.EnumerateObjects()
                 let type = clrObject.Type
                            where type != null && !type.IsFree && type.MethodTable == clrType.MethodTable &&
                            FilterByWalkMode(traversingMode, clrObject)
                            select clrObject.Address);
        }