From 0a8a7bb3cd8c2078122da1c625bb78b0428e29a4 Mon Sep 17 00:00:00 2001 From: Martin Konicek Date: Sat, 9 Feb 2013 00:26:24 +0100 Subject: [PATCH] Re-obtain hash code method after debuggee is restarted. --- .../Visualizers/Utils/DebuggerHelpers.cs | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs index dfeded0947..c447e566a9 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs @@ -2,6 +2,7 @@ // This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt) using System.Linq; +using System.Runtime.InteropServices; using Debugger.AddIn.TreeModel; using Debugger.AddIn.Visualizers.Graph; using Debugger.Interop.CorDebug; @@ -87,21 +88,32 @@ namespace Debugger.AddIn.Visualizers.Utils /// Hash code of the object in the debugee. public static int InvokeDefaultGetHashCode(this Value value) { - // TODO reimplement check for Process.HasExited (debuggee restarted) - if (hashCodeMethod == null /*|| hashCodeMethod.Process.HasExited*/) { - IType runtimeHelpers = - value.Type.GetDefinition().Compilation.FindType( - typeof(System.Runtime.CompilerServices.RuntimeHelpers) - ).GetDefinition(); - hashCodeMethod = runtimeHelpers.GetMethods(m => m.Name == "GetHashCode" && m.Parameters.Count == 1).FirstOrDefault(); - if (hashCodeMethod == null) { - throw new DebuggerException( - "Cannot find method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode()."); - } + if (hashCodeMethod == null) { + hashCodeMethod = findDebuggeeHashCodeMethod(value); } - #warning Encountered "COM object has been separated from its underlying RCW" here - Value defaultHashCode = Eval.InvokeMethod(WindowsDebugger.EvalThread, DebuggerHelpers.hashCodeMethod, null, new Value[]{value}); - return (int)defaultHashCode.PrimitiveValue; + Value valueHashCode; + try { + valueHashCode = Eval.InvokeMethod(WindowsDebugger.EvalThread, hashCodeMethod, null, new Value[]{value}); + } catch(InvalidComObjectException ex) { + // debuggee was restarted + hashCodeMethod = findDebuggeeHashCodeMethod(value); + valueHashCode = Eval.InvokeMethod(WindowsDebugger.EvalThread, hashCodeMethod, null, new Value[]{value}); + } + return (int)valueHashCode.PrimitiveValue; + } + + private static IMethod findDebuggeeHashCodeMethod(Value value) + { + IType runtimeHelpers = + value.Type.GetDefinition().Compilation.FindType( + typeof(System.Runtime.CompilerServices.RuntimeHelpers) + ).GetDefinition(); + hashCodeMethod = runtimeHelpers.GetMethods(m => m.Name == "GetHashCode" && m.Parameters.Count == 1).FirstOrDefault(); + if (hashCodeMethod == null) { + throw new DebuggerException( + "Cannot find method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode()."); + } + return hashCodeMethod; } ///