Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 72507

Summary: Eclipse froze when expanding node in Variables view
Product: [Eclipse Project] JDT Reporter: Dirk Baeumer <dirk_baeumer>
Component: DebugAssignee: Luc Bourlier <eclipse>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: darin.eclipse, eclipse
Version: 3.1   
Target Milestone: 3.1 M3   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Attachments:
Description Flags
serializes monitor information retrieval
none
concurrent modification exception
none
JDIThread-20041013.patch none

Description Dirk Baeumer CLA 2004-08-24 10:56:21 EDT
I expanded an array list node in the variables view and Eclipse completely 
froze. 

============================= VM dump =========================================
Full thread dump Java HotSpot(TM) Client VM (1.4.2-b28 mixed mode):

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=2 tid=0x046fe3a0 
nid=0xa8c in Object.wait() [41df000..41dfd94]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run
(AbstractReconciler.java:176)
        - locked <0x10ae72a0> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"Packet Send Manager" prio=5 tid=0x049bfbd0 nid=0x848 in Object.wait() 
[67ef000..67efd94]
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:429)
        at 
org.eclipse.jdi.internal.connect.PacketSendManager.sendAvailablePackets
(PacketSendManager.java:94)
        - locked <0x18ee7728> (a 
org.eclipse.jdi.internal.connect.PacketSendManager)
        at org.eclipse.jdi.internal.connect.PacketSendManager.run
(PacketSendManager.java:54)
        at java.lang.Thread.run(Thread.java:534)

"Packet Receive Manager" prio=5 tid=0x046d12b0 nid=0xf9c runnable 
[676f000..676fd94]
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at java.net.SocketInputStream.read(SocketInputStream.java:182)
        at java.io.DataInputStream.readInt(DataInputStream.java:443)
        at org.eclipse.jdi.internal.jdwp.JdwpPacket.read(JdwpPacket.java:125)
        at 
org.eclipse.jdi.internal.connect.PacketReceiveManager.readAvailablePacket
(PacketReceiveManager.java:224)
        at org.eclipse.jdi.internal.connect.PacketReceiveManager.run
(PacketReceiveManager.java:70)
        at java.lang.Thread.run(Thread.java:534)

"ServerConnection" prio=7 tid=0x04a1f938 nid=0xabc runnable [66ef000..66efd94]
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:408)
        at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:450)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:182)
        - locked <0x18eed888> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.readLine(BufferedReader.java:299)
        - locked <0x18eed888> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
        at org.eclipse.jdt.internal.junit.ui.RemoteTestRunnerClient.readMessage
(RemoteTestRunnerClient.java:321)
        at org.eclipse.jdt.internal.junit.ui.RemoteTestRunnerClient.access$29
(RemoteTestRunnerClient.java:320)
        at 
org.eclipse.jdt.internal.junit.ui.RemoteTestRunnerClient$ServerConnection.run
(RemoteTestRunnerClient.java:250)

"Console Polling Thread" prio=7 tid=0x04b77ea8 nid=0x82c waiting on condition 
[666f000..666fd94]
        at java.lang.Thread.sleep(Native Method)
        at 
org.eclipse.debug.internal.ui.views.console.ConsoleDocumentPartitioner.pollAndS
leep(ConsoleDocumentPartitioner.java:5
64)
        at 
org.eclipse.debug.internal.ui.views.console.ConsoleDocumentPartitioner$1.run
(ConsoleDocumentPartitioner.java:548)
        at java.lang.Thread.run(Thread.java:534)

"Input Stream Monitor" prio=5 tid=0x04910730 nid=0xe18 in Object.wait() 
[65ef000..65efd94]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x18eeda28> (a java.lang.Object)
        at java.lang.Object.wait(Object.java:429)
        at org.eclipse.debug.internal.core.InputStreamMonitor.writeNext
(InputStreamMonitor.java:124)
        - locked <0x18eeda28> (a java.lang.Object)
        at org.eclipse.debug.internal.core.InputStreamMonitor.write
(InputStreamMonitor.java:99)
        at org.eclipse.debug.internal.core.InputStreamMonitor$1.run
(InputStreamMonitor.java:75)
        at java.lang.Thread.run(Thread.java:534)

"Output Stream Monitor" prio=5 tid=0x04884050 nid=0xc34 runnable 
[65af000..65afd94]
        at java.io.FileInputStream.readBytes(Native Method)
        at java.io.FileInputStream.read(FileInputStream.java:177)
        at org.eclipse.debug.internal.core.OutputStreamMonitor.read
(OutputStreamMonitor.java:132)
        at org.eclipse.debug.internal.core.OutputStreamMonitor.access$1
(OutputStreamMonitor.java:124)
        at org.eclipse.debug.internal.core.OutputStreamMonitor$1.run
(OutputStreamMonitor.java:177)
        at java.lang.Thread.run(Thread.java:534)

"Output Stream Monitor" prio=5 tid=0x04880818 nid=0xf54 runnable 
[54ef000..54efd94]
        at java.io.FileInputStream.readBytes(Native Method)
        at java.io.FileInputStream.read(FileInputStream.java:194)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:220)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:277)
        - locked <0x18ef1b78> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(FilterInputStream.java:90)
        at org.eclipse.debug.internal.core.OutputStreamMonitor.read
(OutputStreamMonitor.java:132)
        at org.eclipse.debug.internal.core.OutputStreamMonitor.access$1
(OutputStreamMonitor.java:124)
        at org.eclipse.debug.internal.core.OutputStreamMonitor$1.run
(OutputStreamMonitor.java:177)
        at java.lang.Thread.run(Thread.java:534)

"Worker-181" prio=5 tid=0x048fbbb0 nid=0x824 in Object.wait() 
[445f000..445fd94]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.jdi.internal.connect.PacketReceiveManager.waitForPacketAvailable
(PacketReceiveManager.java:170)
        at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply
(PacketReceiveManager.java:136)
        - locked <0x18ee7580> (a 
org.eclipse.jdi.internal.connect.PacketReceiveManager)
        at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply
(PacketReceiveManager.java:158)
        at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:173)
        at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191)
        at org.eclipse.jdi.internal.ObjectReferenceImpl.invokeMethod
(ObjectReferenceImpl.java:344)
        at org.eclipse.jdt.internal.debug.core.model.JDIThread.invokeMethod
(JDIThread.java:810)
        at org.eclipse.jdt.internal.debug.core.model.JDIObjectValue.sendMessage
(JDIObjectValue.java:77)
        at 
org.eclipse.jdt.internal.debug.ui.JavaDetailFormattersManager$EvaluationListene
r.appendObjectDetail(JavaDetailFormatt
ersManager.java:581)
        at org.eclipse.jdt.internal.debug.ui.JavaDetailFormattersManager$1.run
(JavaDetailFormattersManager.java:462)
        at org.eclipse.jdt.internal.debug.core.model.JDIThread.runEvaluation
(JDIThread.java:659)
        at 
org.eclipse.jdt.internal.debug.ui.JavaDetailFormattersManager$EvaluationListene
r.valueToString(JavaDetailFormattersMa
nager.java:469)
        at 
org.eclipse.jdt.internal.debug.ui.JavaDetailFormattersManager.resolveFormatter
(JavaDetailFormattersManager.java:169)
        at 
org.eclipse.jdt.internal.debug.ui.JavaDetailFormattersManager.access$0
(JavaDetailFormattersManager.java:145)
        at org.eclipse.jdt.internal.debug.ui.JavaDetailFormattersManager$4.run
(JavaDetailFormattersManager.java:133)
        at org.eclipse.jdt.internal.debug.core.model.JDIThread$ThreadJob.run
(JDIThread.java:2511)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:66)

"Worker-176" prio=5 tid=0x049b85f0 nid=0x490 in Object.wait() 
[40ef000..40efd94]
        at java.lang.Object.wait(Native Method)
        at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:166)
        - locked <0x111c10b0> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.startJob
(WorkerPool.java:193)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:59)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=2 tid=0x049b8b50 
nid=0x4fc in Object.wait() [53ef000..53efd94]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run
(AbstractReconciler.java:176)
        - locked <0x16c43120> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"Worker-173" prio=5 tid=0x04a12a18 nid=0x118 runnable [441f000..441fd94]
        at java.lang.Win32Process.waitFor(Native Method)
        at org.eclipse.debug.core.model.RuntimeProcess$ProcessMonitorJob.run
(RuntimeProcess.java:362)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:66)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=2 tid=0x048eecd8 
nid=0xccc in Object.wait() [45af000..45afd94]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run
(AbstractReconciler.java:176)
        - locked <0x163d3bf0> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=2 tid=0x03b72e00 
nid=0xa34 in Object.wait() [662f000..662fd94]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run
(AbstractReconciler.java:176)
        - locked <0x15e17450> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=5 tid=0x048c7288 
nid=0xd50 in Object.wait() [66af000..66afd94]
        at java.lang.Object.wait(Native Method)
        at 
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run
(AbstractReconciler.java:176)
        - locked <0x15d4b800> (a 
org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"Java indexing" daemon prio=4 tid=0x03c755c8 nid=0xed4 in Object.wait() 
[429f000..429fd94]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x12209af0> (a 
org.eclipse.jdt.internal.core.search.indexing.IndexManager)
        at java.lang.Object.wait(Object.java:429)
        at org.eclipse.jdt.internal.core.search.processing.JobManager.run
(JobManager.java:338)
        - locked <0x12209af0> (a 
org.eclipse.jdt.internal.core.search.indexing.IndexManager)
        at java.lang.Thread.run(Thread.java:534)

"Reference Cleaner - 2" prio=7 tid=0x02e26d00 nid=0x1bc in Object.wait() 
[3f9f000..3f9fd94]
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
        - locked <0x11929720> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
        at 
org.eclipse.jface.action.ActionContributionItem$ImageCache$ReferenceCleanerThre
ad.run(ActionContributionItem.java:216
)

"Reference Cleaner - 1" prio=7 tid=0x02dc8920 nid=0x454 in Object.wait() 
[3f5f000..3f5fd94]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x11929790> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
        - locked <0x11929790> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
        at 
org.eclipse.jface.action.ActionContributionItem$ImageCache$ReferenceCleanerThre
ad.run(ActionContributionItem.java:216
)

"Start Level Event Dispatcher" daemon prio=5 tid=0x02e72558 nid=0xa58 in 
Object.wait() [2f9f000..2f9fd94]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x10fc3fd8> (a 
org.eclipse.osgi.framework.eventmgr.EventThread)
        at java.lang.Object.wait(Object.java:429)
        at org.eclipse.osgi.framework.eventmgr.EventThread.getNextEvent
(EventThread.java:162)
        - locked <0x10fc3fd8> (a 
org.eclipse.osgi.framework.eventmgr.EventThread)
        at org.eclipse.osgi.framework.eventmgr.EventThread.run
(EventThread.java:100)

"Framework Event Dispatcher" daemon prio=5 tid=0x02e72908 nid=0xfac in 
Object.wait() [2f5f000..2f5fd94]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x10fc4120> (a 
org.eclipse.osgi.framework.eventmgr.EventThread)
        at java.lang.Object.wait(Object.java:429)
        at org.eclipse.osgi.framework.eventmgr.EventThread.getNextEvent
(EventThread.java:162)
        - locked <0x10fc4120> (a 
org.eclipse.osgi.framework.eventmgr.EventThread)
        at org.eclipse.osgi.framework.eventmgr.EventThread.run
(EventThread.java:100)

"Signal Dispatcher" daemon prio=10 tid=0x0003dc80 nid=0x598 waiting on 
condition [0..0]

"Finalizer" daemon prio=9 tid=0x009c08d8 nid=0xec4 in Object.wait() 
[2c1f000..2c1fd94]
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
        - locked <0x10f977b0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x009bf4a8 nid=0x9cc in Object.wait() 
[2bdf000..2bdfd94]
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:429)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115)
        - locked <0x10f97648> (a java.lang.ref.Reference$Lock)

"main" prio=5 tid=0x00035a18 nid=0x138 in Object.wait() [7e000..7fc3c]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x148cd8a0> (a 
org.eclipse.jdt.internal.debug.core.logicalstructures.CollectionStructureType)
        at java.lang.Object.wait(Object.java:429)
        at 
org.eclipse.jdt.internal.debug.core.logicalstructures.LogicalObjectStructureInt
erfaceType.getLogicalStructure(Logical
ObjectStructureInterfaceType.java:132)
        - locked <0x148cd8a0> (a 
org.eclipse.jdt.internal.debug.core.logicalstructures.CollectionStructureType)
        - locked <0x148cd8a0> (a 
org.eclipse.jdt.internal.debug.core.logicalstructures.CollectionStructureType)
        at 
org.eclipse.debug.internal.core.LogicalStructureType.getLogicalStructure
(LogicalStructureType.java:91)
        at 
org.eclipse.debug.internal.ui.views.variables.VariablesViewContentProvider.getL
ogicalValue(VariablesViewContentProvid
er.java:222)
        at 
org.eclipse.debug.internal.ui.views.variables.VariablesViewContentProvider.getV
alueChildren(VariablesViewContentProvi
der.java:124)
        at 
org.eclipse.debug.internal.ui.views.variables.VariablesViewContentProvider.getM
odelSpecificChildren(VariablesViewCont
entProvider.java:109)
        at 
org.eclipse.debug.internal.ui.views.variables.VariablesViewContentProvider.getC
hildren(VariablesViewContentProvider.j
ava:89)
        at org.eclipse.jface.viewers.AbstractTreeViewer.getRawChildren
(AbstractTreeViewer.java:748)
        at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren
(StructuredViewer.java:497)
        at org.eclipse.jface.viewers.StructuredViewer.getSortedChildren
(StructuredViewer.java:612)
        at org.eclipse.jface.viewers.AbstractTreeViewer$1.run
(AbstractTreeViewer.java:379)
        at org.eclipse.swt.custom.BusyIndicator.showWhile
(BusyIndicator.java:69)
        at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren
(AbstractTreeViewer.java:361)
        at org.eclipse.jface.viewers.AbstractTreeViewer.handleTreeExpand
(AbstractTreeViewer.java:797)
        at org.eclipse.jface.viewers.AbstractTreeViewer$4.treeExpanded
(AbstractTreeViewer.java:808)
        at org.eclipse.swt.widgets.TypedListener.handleEvent
(TypedListener.java:179)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:820)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:805)
        at org.eclipse.swt.widgets.Tree.wmNotifyChild(Tree.java:2074)
        at org.eclipse.swt.widgets.Control.WM_NOTIFY(Control.java:4002)
        at org.eclipse.swt.widgets.Composite.WM_NOTIFY(Composite.java:722)
        at org.eclipse.swt.widgets.Control.windowProc(Control.java:3019)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:3338)
        at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)
        at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:1391)
        at org.eclipse.swt.widgets.Tree.callWindowProc(Tree.java:170)
        at org.eclipse.swt.widgets.Tree.WM_LBUTTONDOWN(Tree.java:1668)
        at org.eclipse.swt.widgets.Control.windowProc(Control.java:3001)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:3338)
        at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
        at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1467)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2429)
        at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1435)
        at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1406)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench
(Workbench.java:263)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:144)
        at org.eclipse.ui.internal.ide.IDEApplication.run
(IDEApplication.java:102)
        at org.eclipse.core.internal.runtime.PlatformActivator$1.run
(PlatformActivator.java:335)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run
(EclipseStarter.java:273)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run
(EclipseStarter.java:129)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.eclipse.core.launcher.Main.basicRun(Main.java:183)
        at org.eclipse.core.launcher.Main.run(Main.java:644)
        at org.eclipse.core.launcher.Main.main(Main.java:628)

"VM Thread" prio=5 tid=0x009fb720 nid=0xb58 runnable

"VM Periodic Task Thread" prio=10 tid=0x009fc4a0 nid=0x708 waiting on condition
"Suspend Checker Thread" prio=10 tid=0x0003d338 nid=0xd5c runnable
Comment 1 Darin Wright CLA 2004-08-24 14:52:17 EDT
Do you have a way to reproduce this. It looks like an evaluation to produce 
a 'toString()' in the details area and an evaluation to produce the logical 
structure are running. The logical structure evaluations is waiting for its 
evaluation to finish which is blocking the UI thread.

I'm not sure it is a deadlock, or just a temporary "block".
Comment 2 Dirk Baeumer CLA 2004-08-25 04:53:28 EDT
Unfortunatelly no steps to reproduce. I killed Eclipse and restarted it and 
could happly debug and inspect the code then.
Comment 3 Darin Wright CLA 2004-10-13 11:19:31 EDT
From the thread dump, it looks like the logical structure computation was 
simply not complete. Blocking the UI thread should be avoided with background 
content generation.

*** This bug has been marked as a duplicate of 44724 ***
Comment 4 Darin Wright CLA 2004-10-13 16:35:54 EDT
And then... it happenned to me...
Comment 5 Darin Wright CLA 2004-10-13 16:37:42 EDT
Stack of relevant threads:

Thread [main] (Suspended)
	Object.wait(long) line: not available [native method]
	CollectionStructureType(Object).wait() line: 429
	CollectionStructureType
(LogicalObjectStructureInterfaceType).getLogicalStructure(IValue) line: 132
	LogicalStructureType.getLogicalStructure(IValue) line: 91
	VariablesViewContentProvider.getLogicalValue(IValue) line: 222
	VariablesViewContentProvider.getValueChildren(IDebugElement, IValue) 
line: 124
	VariablesViewContentProvider.getModelSpecificChildren(IDebugElement, 
IValue) line: 109
	VariablesViewContentProvider.getChildren(Object) line: 89
	VariablesViewer(AbstractTreeViewer).getRawChildren(Object) line: 738
	VariablesViewer(StructuredViewer).getFilteredChildren(Object) line: 663
	VariablesViewer(StructuredViewer).getSortedChildren(Object) line: 778
	VariablesViewer(AbstractTreeViewer).updateChildren(Widget, Object, 
Object[], boolean) line: 1504
	VariablesViewer(AbstractTreeViewer).internalRefreshStruct(Widget, 
Object, boolean) line: 1081
	VariablesViewer(AbstractTreeViewer).internalRefreshStruct(Widget, 
Object, boolean) line: 1088
	VariablesViewer(AbstractTreeViewer).internalRefreshStruct(Widget, 
Object, boolean) line: 1088
	VariablesViewer(AbstractTreeViewer).internalRefresh(Widget, Object, 
boolean, boolean) line: 1058
	VariablesViewer(AbstractTreeViewer).internalRefresh(Object, boolean) 
line: 1023
	VariablesViewer(AbstractTreeViewer).internalRefresh(Object) line: 1010
	StructuredViewer$7.run() line: 1127
	VariablesViewer(StructuredViewer).preservingSelection(Runnable) line: 
1064
	VariablesViewer(StructuredViewer).refresh(Object) line: 1125
	VariablesViewer(StructuredViewer).refresh() line: 1084
	VariablesViewer.refresh() line: 69
	VariablesViewEventHandler(AbstractDebugEventHandler).refresh() line: 
146
	VariablesViewEventHandler.doHandleChangeEvent(DebugEvent) line: 116
	VariablesViewEventHandler.doHandleDebugEvents(DebugEvent[]) line: 46
	AbstractDebugEventHandler$1.run() line: 70
	RunnableLock.run() line: 35
	UISynchronizer(Synchronizer).runAsyncMessages() line: 108
	Display.runAsyncMessages() line: 2761
	Display.readAndDispatch() line: 2446
	Workbench.runEventLoop(Window$IExceptionHandler, Display) line: 1443
	Workbench.runUI() line: 1414
	Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 271
	PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 144
	IDEApplication.run(Object) line: 102
	PlatformActivator$1.run(Object) line: 335
	EclipseStarter.run(Object) line: 273
	EclipseStarter.run(String[], Runnable) line: 129
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
	Method.invoke(Object, Object[]) line: 324
	Main.basicRun(String[]) line: 185
	Main.run(String[]) line: 684
	Main.main(String[]) line: 668


Thread [Worker-13] (Suspended)
	Object.wait(long) line: not available [native method]
	PacketReceiveManager.waitForPacketAvailable(long) line: 170
	PacketReceiveManager.getReply(int, long) line: 136
	PacketReceiveManager.getReply(JdwpCommandPacket) line: 158
	ObjectReferenceImpl(MirrorImpl).requestVM(int, byte[]) line: 173
	ObjectReferenceImpl(MirrorImpl).requestVM(int, ByteArrayOutputStream) 
line: 191
	ObjectReferenceImpl.invokeMethod(ThreadReference, Method, List, int) 
line: 344
	JDIThread.invokeMethod(ClassType, ObjectReference, Method, List, 
boolean) line: 810
	JDIObjectValue.sendMessage(String, String, IJavaValue[], IJavaThread, 
boolean) line: 79
	CollectionStructureType$1.run(IJavaThread, IProgressMonitor) line: 32
	JDIThread.runEvaluation(IEvaluationRunnable, IProgressMonitor, int, 
boolean) line: 659
	LogicalObjectStructureInterfaceType$1.run() line: 119
	JDIThread$ThreadJob.run(IProgressMonitor) line: 2511
	Worker.run() line: 66

Thread [Worker-8] (Suspended)
	Object.wait(long) line: not available [native method]
	PacketReceiveManager.waitForPacketAvailable(long) line: 170
	PacketReceiveManager.getReply(int, long) line: 136
	PacketReceiveManager.getReply(JdwpCommandPacket) line: 158
	ThreadReferenceImpl(MirrorImpl).requestVM(int, byte[]) line: 173
	ThreadReferenceImpl(MirrorImpl).requestVM(int, ByteArrayOutputStream) 
line: 191
	ThreadReferenceImpl(MirrorImpl).requestVM(int, ObjectReferenceImpl) 
line: 206
	ThreadReferenceImpl.ownedMonitors() line: 296
	JDIThread.getOwnedMonitors() line: 2415
	JavaMonitorThread.update() line: 164
	JavaMonitorThread.refresh() line: 249
	ThreadMonitorManager$RefreshAndDetectDeadlock.run() line: 165
	DebugPlugin$AsynchJob.run(IProgressMonitor) line: 876
	Worker.run() line: 66


Thread [org.eclipse.jdt.debug: JDI Event Dispatcher] (Suspended)
	Object.wait(long) line: not available [native method]
	PacketReceiveManager(Object).wait() line: 429
	PacketReceiveManager.waitForPacketAvailable(long) line: 168
	PacketReceiveManager.getCommand(int, long) line: 93
	EventQueueImpl(MirrorImpl).getCommandVM(int, long) line: 276
	EventQueueImpl.remove(long) line: 63
	EventQueueImpl.remove() line: 48
	EventDispatcher.run() line: 213
	Thread.run() line: 534

Comment 6 Darin Wright CLA 2004-10-13 17:13:19 EDT
The problem I am seeing seems related to the "new" monitor information in the 
debug view. If I turn off the monitor info, the hang does not ocurr. However, 
when we ask for monitor info and a method invocation at the same time, neither 
request seems to return.
Comment 7 Darin Wright CLA 2004-10-13 17:49:44 EDT
Created attachment 15148 [details]
serializes monitor information retrieval
Comment 8 Darin Wright CLA 2004-10-13 17:50:51 EDT
Created attachment 15149 [details]
concurrent modification exception

I found that we had an infinite loop and concurrent modification exceptions
when I ran with my jdt-debug-ui patch. This fixes that problem.
Comment 9 Darin Wright CLA 2004-10-13 17:52:48 EDT
Luc, please see if you agree with these patches. The test case to see problems 
is:

(1) Breakpoint on line 28 of VectorTests
(2) Turn on logical structures
(3) Turn on Monitor information
(4) Debug to breakpoint
(5) expand fFull to see logical strucuture

> Boom
Comment 10 Darin Wright CLA 2004-10-13 17:56:30 EDT
With these patches, the following problem still occurrs: the logical 
structures never catch up (i.e. never update, always show "...") since the 
monitor manager is continually refreshing and firing a change event. The 
variables view continually updates. 

If I then try to turn off the monitor into via the drop down in the debug 
view, Eclipse hangs.
Comment 11 Luc Bourlier CLA 2004-10-13 19:35:20 EDT
Created attachment 15153 [details]
JDIThread-20041013.patch

I prefer this patch instead of the one from comment 8, for the current
modification problem. It's what it was supposed to be, but the synchronized
block was missing.
I don't see the infinite loop in the current code.
Comment 12 Luc Bourlier CLA 2004-10-13 20:03:56 EDT
humm ... I think we should move this in an other bug report, the original
problem had nothing to do with the thread and monitor support.

Anyway, I cannot reproduce the problem with the test case. But I suppose it
depends of the order of the listener, and other things like that ...

It currently refreshes for any resume or suspend event, we could filter out the
evaluation events.
There was a few errors in the code to determine if there was change in the
thread and monitor model (bug 76220), it was sending too many debug change
events. I fixed it.
I noticed the variables view totaly refresh for any debug change events. Is
there any reason for that, couldn't we filter the events the view really cares
about ?
Comment 13 Darin Wright CLA 2004-10-14 08:40:32 EDT
Sorry, I did not explain the similarity well. I found that a concurrent 
modification exception was being caught in JDIThread.ThreadJob.run(...), which 
made for an infinite loop. The call to iter.next() caused a concurrent 
modification exception, which we caught, and then looped for ever:

for (Iterator iter= runnables.iterator(); iter.hasNext() && !
fJDIThread.isTerminated() && !monitor.isCanceled();) {
	try {
		((Runnable) iter.next()).run();
	} catch (Exception e) {
		if (failed == null) {
			failed = new MultiStatus
(JDIDebugPlugin.getUniqueIdentifier(), JDIDebugPlugin.INTERNAL_ERROR, 
JDIDebugModelMessages.getString("JDIThread.0"), null); //$NON-NLS-1$
		}
		failed.add(new Status(IStatus.ERROR, 
JDIDebugPlugin.getUniqueIdentifier(), JDIDebugPlugin.INTERNAL_ERROR, 
JDIDebugModelMessages.getString("JDIThread.0"), e)); //$NON-NLS-1$
	}
	monitor.worked(1);
}

I don't know why the exception occurred yet (looking at the code, it appears 
safe), but changing the code to copy the runnables into an array that I loop 
thru, rather than using an iterator made things happy. See my patch to 
JDIThread.
Comment 14 Darin Wright CLA 2004-10-14 09:04:58 EDT
With the fix to bug 76220, I can no longer reproduce the infinite loop/update 
problem. However, I did see a potential cause for the concurrent modification 
exception - when executing the runnables in JDIThread.ThreadJob, we 
synchronize on fRunnables to copy the runnables to evaluate, but we did not 
synchronize on fRunnables when adding a new runnable to the queue. I have 
released this fix to JDIThread.

So, this bug simply deals with the blocked thread retreiving the logical 
structure for an element, which now appears to be fixed with proper 
synchronization on evaluating runnables (which before could get into an 
infinite loop when there was a concurrent modification exception).

The problem of using the UI thread to compute logical strucutres will be dealt 
with in bug 44724.

Please verify my changes to JDIThread.
Comment 15 Darin Wright CLA 2004-10-14 11:11:44 EDT
Modified my fix. The synchronization was still flawed because we change the 
underlying object being synch'd on. Instead, I keep the same vector of 
runnables and clear it. The code the exeuctues the runnables copies the 
contents to an array, and then clears the runnables from the vector (which is 
synchronized with additions to the vector).
Comment 16 Luc Bourlier CLA 2004-10-14 14:33:18 EDT
Verified.