Browse Source

GridValues - clearing debugger expression cache each 50 items to prevent keeping too many PermanentReferences.

pull/15/head
mkonicek 15 years ago
parent
commit
8836f72720
  1. 3
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs
  2. 26
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs
  3. 13
      src/AddIns/Debugger/Debugger.Core/Process.cs

3
src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs

@ -35,7 +35,8 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -35,7 +35,8 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
/// </summary>
public IList<MemberInfo> GetItemTypeMembers()
{
return itemType.GetFieldsAndNonIndexedProperties(BindingFlags.Public | BindingFlags.Instance);
var publicPropetiesAndFields = itemType.GetFieldsAndNonIndexedProperties(BindingFlags.Public | BindingFlags.Instance);
return publicPropetiesAndFields;
}
}
}

26
src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using Debugger.AddIn.Visualizers.Common;
using Debugger.AddIn.Visualizers.Utils;
using Debugger.MetaData;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Services;
using System.Reflection;
@ -16,8 +17,12 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -16,8 +17,12 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
/// </summary>
public class ListValuesProvider : GridValuesProvider, IListValuesProvider<ObjectValue>
{
private bool countEvaluated = false;
private int count = -1;
int? listCount = null;
/// <summary>
/// After evaluating how many items to clear debugger Expression cache,
/// so that the cache does not keep too many PermanentReferences.
/// </summary>
static readonly int ClearCacheThreshold = 50;
public ListValuesProvider(Expression targetObject, DebugType listItemType)
:base(targetObject, listItemType)
@ -26,16 +31,23 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -26,16 +31,23 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
public int GetCount()
{
if (!countEvaluated)
{
this.count = Debugger.AddIn.TreeModel.Utils.GetIListCount(this.targetObject);
countEvaluated = true;
if (this.listCount == null) {
this.listCount = Debugger.AddIn.TreeModel.Utils.GetIListCount(this.targetObject);
}
return this.count;
return this.listCount.Value;
}
/// <summary>When this reaches ClearCacheThreshold, the debugger Expression cache is cleared.</summary>
int itemClearCacheCounter = 0;
public ObjectValue GetItemAt(int index)
{
if (itemClearCacheCounter++ > ClearCacheThreshold) {
// clear debugger Expression cache to avoid holding too many PermanentReferences
WindowsDebugger.CurrentProcess.ClearExpressionCache();
LoggingService.Info("Cleared debugger Expression cache.");
itemClearCacheCounter = 0;
}
return ObjectValue.Create(
targetObject.AppendIndexer(index).Evaluate(WindowsDebugger.CurrentProcess),
//targetObject.AppendIndexer(index), // use Expression instead of value - possible only for IList though

13
src/AddIns/Debugger/Debugger.Core/Process.cs

@ -531,6 +531,19 @@ namespace Debugger @@ -531,6 +531,19 @@ namespace Debugger
// This is done once ExitProcess callback is received
}
/// <summary>
/// Clears the internal Expression cache used too speed up Expression evaluation.
/// Use this if your code evaluates expressions in a way which would cause
/// the cache to grow too large. The cache holds PermanentReferences so it
/// shouldn't grow larger than a few hundred items.
/// </summary>
public void ClearExpressionCache()
{
if (this.ExpressionsCache != null ){
this.ExpressionsCache.Clear();
}
}
void SelectSomeThread()
{
if (this.SelectedThread != null && !this.SelectedThread.IsInValidState) {

Loading…
Cancel
Save