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
/// </summary> /// </summary>
public IList<MemberInfo> GetItemTypeMembers() 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;
using Debugger.AddIn.Visualizers.Common; using Debugger.AddIn.Visualizers.Common;
using Debugger.AddIn.Visualizers.Utils; using Debugger.AddIn.Visualizers.Utils;
using Debugger.MetaData; using Debugger.MetaData;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.Services;
using System.Reflection; using System.Reflection;
@ -16,8 +17,12 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
/// </summary> /// </summary>
public class ListValuesProvider : GridValuesProvider, IListValuesProvider<ObjectValue> public class ListValuesProvider : GridValuesProvider, IListValuesProvider<ObjectValue>
{ {
private bool countEvaluated = false; int? listCount = null;
private int count = -1; /// <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) public ListValuesProvider(Expression targetObject, DebugType listItemType)
:base(targetObject, listItemType) :base(targetObject, listItemType)
@ -26,16 +31,23 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
public int GetCount() public int GetCount()
{ {
if (!countEvaluated) if (this.listCount == null) {
{ this.listCount = Debugger.AddIn.TreeModel.Utils.GetIListCount(this.targetObject);
this.count = Debugger.AddIn.TreeModel.Utils.GetIListCount(this.targetObject);
countEvaluated = true;
} }
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) 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( return ObjectValue.Create(
targetObject.AppendIndexer(index).Evaluate(WindowsDebugger.CurrentProcess), targetObject.AppendIndexer(index).Evaluate(WindowsDebugger.CurrentProcess),
//targetObject.AppendIndexer(index), // use Expression instead of value - possible only for IList though //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
// This is done once ExitProcess callback is received // 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() void SelectSomeThread()
{ {
if (this.SelectedThread != null && !this.SelectedThread.IsInValidState) { if (this.SelectedThread != null && !this.SelectedThread.IsInValidState) {

Loading…
Cancel
Save