2525
2626import org .eclipse .debug .core .DebugException ;
2727import org .eclipse .debug .core .model .IVariable ;
28+ import org .eclipse .debug .ui .DebugUITools ;
2829import org .eclipse .jdt .debug .core .IJavaObject ;
2930import org .eclipse .jdt .debug .core .IJavaThread ;
3031import org .eclipse .jdt .debug .core .IJavaValue ;
3132import org .eclipse .jdt .debug .core .IJavaVariable ;
33+ import org .eclipse .jdt .internal .debug .core .model .JDIStackFrame ;
3234import org .eclipse .jface .viewers .IStructuredSelection ;
3335import org .eclipse .osgi .util .NLS ;
3436
@@ -68,7 +70,7 @@ public String objectValueExtraction(IJavaValue value) throws DebugException {
6870 }
6971 }
7072 if (interfaceCheck .contains ("Number" )) {
71- IJavaThread thread = ( IJavaThread ) value . getDebugTarget (). getThreads ()[ 0 ] ;
73+ IJavaThread thread = getSuspendedThread ( value ) ;
7274 IJavaValue stringVal = ((IJavaObject ) value ).sendMessage ("doubleValue" , "()D" , null , thread , false );
7375 return stringVal .getValueString ();
7476 }
@@ -85,7 +87,7 @@ public String objectValueExtraction(IJavaValue value) throws DebugException {
8587 */
8688 @ SuppressWarnings ("nls" )
8789 private String stringValueExtraction (IJavaObject value ) throws DebugException {
88- IJavaThread thread = ( IJavaThread ) value . getDebugTarget (). getThreads ()[ 0 ] ;
90+ IJavaThread thread = getSuspendedThread ( value ) ;
8991 IJavaValue stringVal = value .sendMessage ("toString" , "()Ljava/lang/String;" , null , thread , false );
9092 return stringVal .getValueString ();
9193 }
@@ -122,7 +124,7 @@ public Map<IJavaVariable, Object> setExtraction(List<IStructuredSelection> selec
122124 @ SuppressWarnings ("nls" )
123125 public List <String > setElementsExtraction (IJavaObject javaObject1 ) throws DebugException {
124126 List <String > contents = new ArrayList <>();
125- IJavaThread thread = ( IJavaThread ) javaObject1 . getDebugTarget (). getThreads ()[ 0 ] ;
127+ IJavaThread thread = getSuspendedThread ( javaObject1 ) ;
126128 IJavaValue toArray = javaObject1 .sendMessage ("toArray" , "()[Ljava/lang/Object;" , null , thread , false );
127129 for (IVariable ob : toArray .getVariables ()) {
128130 contents .add (objectValueExtraction ((IJavaValue ) ob .getValue ()));
@@ -661,7 +663,7 @@ public Map<IJavaVariable, Object> iterableExtraction(List<IStructuredSelection>
661663 @ SuppressWarnings ("nls" )
662664 public List <String > iterableElementsExtraction (IJavaObject javaObject1 ) throws DebugException {
663665 List <String > contents = new ArrayList <>();
664- IJavaThread thread = ( IJavaThread ) javaObject1 . getDebugTarget (). getThreads ()[ 0 ] ;
666+ IJavaThread thread = getSuspendedThread ( javaObject1 ) ;
665667 IJavaObject iterator = (IJavaObject ) javaObject1 .sendMessage ("iterator" , "()Ljava/util/Iterator;" , null , thread , false );
666668 while (true ) {
667669 IJavaValue hasNext = iterator .sendMessage ("hasNext" , "()Z" , null , thread , false );
@@ -707,7 +709,7 @@ public Map<IJavaVariable, Object> listExtraction(List<IStructuredSelection> sele
707709 @ SuppressWarnings ("nls" )
708710 public List <String > listElementsExtraction (IJavaObject javaObject1 ) throws DebugException {
709711 List <String > contents = new ArrayList <>();
710- IJavaThread thread = ( IJavaThread ) javaObject1 . getDebugTarget (). getThreads ()[ 0 ] ;
712+ IJavaThread thread = getSuspendedThread ( javaObject1 ) ;
711713 IJavaValue toArray = javaObject1 .sendMessage ("toArray" , "()[Ljava/lang/Object;" , null , thread , false );
712714 for (IVariable ob : toArray .getVariables ()) {
713715 contents .add (objectValueExtraction ((IJavaValue ) ob .getValue ()));
@@ -766,9 +768,9 @@ public Map<IJavaVariable, Object> stringExtraction(List<IStructuredSelection> se
766768 @ SuppressWarnings ("nls" )
767769 public Map <String , Object > mapElementsExtraction (IJavaVariable selectedObject1 ) throws DebugException {
768770 if (selectedObject1 .getValue () instanceof IJavaObject javaObject1 ) {
771+ IJavaThread thread = getSuspendedThread (javaObject1 );
769772 Map <String , Object > result = new HashMap <>();
770773 List <String > keySet = new ArrayList <>();
771- IJavaThread thread = (IJavaThread ) javaObject1 .getDebugTarget ().getThreads ()[0 ];
772774 IJavaObject keySetObject = (IJavaObject ) javaObject1 .sendMessage ("keySet" , "()Ljava/util/Set;" , null , thread , false );
773775 IJavaValue keyToArray = keySetObject .sendMessage ("toArray" , "()[Ljava/lang/Object;" , null , thread , false );
774776 for (IVariable ob : keyToArray .getVariables ()) {
@@ -854,4 +856,20 @@ public static String checkInterfaces(String className) {
854856 }
855857 }
856858
859+ /**
860+ * Returns a suspended thread for vm message operation
861+ *
862+ * @param value
863+ * IJavaValue object
864+ * @return returns a suspended IJavaThread object
865+ */
866+ private IJavaThread getSuspendedThread (IJavaValue value ) throws DebugException {
867+ IJavaThread thread = (IJavaThread ) value .getDebugTarget ().getThreads ()[0 ];
868+ if (!thread .isSuspended ()) {
869+ JDIStackFrame frame = (JDIStackFrame ) DebugUITools .getDebugContext ();
870+ thread = (IJavaThread ) frame .getThread ();
871+ }
872+ return thread ;
873+ }
874+
857875}
0 commit comments