Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ghidra takes a very long time to save on Linux compared to Windows #7258

Open
H-A-M-G-E-R opened this issue Dec 6, 2024 · 14 comments
Open
Assignees
Labels
Status: Triage Information is being gathered

Comments

@H-A-M-G-E-R
Copy link

H-A-M-G-E-R commented Dec 6, 2024

image
it would get stuck at this screen
using Ubuntu 24.04.1 LTS
and this fork/branch: https://github.com/H-A-M-G-E-R/ghidra/tree/switch-case-order (the only change i made is unrelated to this problem)
but also affects the 11.2.1 release
Windows 11 doesn't have this problem

@emteere
Copy link
Contributor

emteere commented Dec 6, 2024

We would need more information to diagnose this issue.

What is a very long time? seconds, minutes, hours, never finish the save?

It is very possible it is the way you are running it on Linux, your system setup, linux under WSL on windows, your file system setup, etc... We haven't had any other reports of this issue, so it is possible it is a local configuration problem.

Is this something new that just started to occur?

Are you running a release copy, or are you running under development/debug in eclipse?

You can cause Ghidra to dump the thread stack to see where it is spending time.

@emteere
Copy link
Contributor

emteere commented Dec 6, 2024

Please provide a thread listing using java's jstack tool when in the bad state.

From a terminal, execute:
jps to get the pid
jstack <pid>

@astrelsky
Copy link
Contributor

I can confirm that this does occur on windows too. It is not easily reproducible but I usually see it occur when I have huge programs open (several gb). It does not occur on every save.

@H-A-M-G-E-R
Copy link
Author

2024-12-06 13:04:53
Full thread dump OpenJDK 64-Bit Server VM (23.0.1+11-39 mixed mode):

Threads class SMR info:
_java_thread_list=0x00007ca6880a5c80, length=35, elements={
0x00007ca8b423b9c0, 0x00007ca8b423cf50, 0x00007ca8b423e850, 0x00007ca8b423fdc0,
0x00007ca8b4241360, 0x00007ca8b4242eb0, 0x00007ca8b42445c0, 0x00007ca8b42faeb0,
0x00007ca8b431e2a0, 0x00007ca8b43df200, 0x00007ca8b43e1ac0, 0x00007ca8b402b790,
0x00007ca8046321c0, 0x00007ca804919c30, 0x00007ca80491ad70, 0x00007ca77c053630,
0x00007ca77c6f2f40, 0x00007ca77c6f9ea0, 0x00007ca77c71f100, 0x00007ca70001bc90,
0x00007ca77d34cd60, 0x00007ca77ca894b0, 0x00007ca77ca67b10, 0x00007ca77cb3c7f0,
0x00007ca77d3d7b20, 0x00007ca77cde8a90, 0x00007ca77cdeb3b0, 0x00007ca77c9b8420,
0x00007ca77d3c51c0, 0x00007ca77cb24de0, 0x00007ca77cb4fdf0, 0x00007ca77caa2390,
0x00007ca858000f50, 0x00007ca77cb24280, 0x00007ca77c9051d0
}

"Reference Handler" #9 [2076897] daemon prio=10 os_prio=0 cpu=95.11ms elapsed=29302.75s tid=0x00007ca8b423b9c0 nid=2076897 waiting on condition  [0x00007ca8901fe000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.ref.Reference.waitForReferencePendingList([email protected]/Native Method)
	at java.lang.ref.Reference.processPendingReferences([email protected]/Reference.java:246)
	at java.lang.ref.Reference$ReferenceHandler.run([email protected]/Reference.java:208)

"Finalizer" #10 [2076898] daemon prio=8 os_prio=0 cpu=6.06ms elapsed=29302.75s tid=0x00007ca8b423cf50 nid=2076898 in Object.wait()  [0x00007ca8900fe000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.lang.Object.wait([email protected]/Object.java:352)
	at java.lang.ref.NativeReferenceQueue.await([email protected]/NativeReferenceQueue.java:48)
	at java.lang.ref.ReferenceQueue.remove0([email protected]/ReferenceQueue.java:166)
	at java.lang.ref.NativeReferenceQueue.remove([email protected]/NativeReferenceQueue.java:89)
	- locked <0x000000070e3c0c40> (a java.lang.ref.NativeReferenceQueue$Lock)
	at java.lang.ref.Finalizer$FinalizerThread.run([email protected]/Finalizer.java:173)

"Signal Dispatcher" #11 [2076899] daemon prio=9 os_prio=0 cpu=0.34ms elapsed=29302.75s tid=0x00007ca8b423e850 nid=2076899 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #12 [2076900] daemon prio=9 os_prio=0 cpu=792.77ms elapsed=29302.75s tid=0x00007ca8b423fdc0 nid=2076900 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #13 [2076901] daemon prio=9 os_prio=0 cpu=2265.89ms elapsed=29302.75s tid=0x00007ca8b4241360 nid=2076901 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #14 [2076902] daemon prio=9 os_prio=0 cpu=33954.08ms elapsed=29302.75s tid=0x00007ca8b4242eb0 nid=2076902 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #22 [2076903] daemon prio=9 os_prio=0 cpu=5687.37ms elapsed=29302.75s tid=0x00007ca8b42445c0 nid=2076903 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Common-Cleaner" #26 [2076907] daemon prio=8 os_prio=0 cpu=32.02ms elapsed=29302.73s tid=0x00007ca8b42faeb0 nid=2076907 waiting on condition  [0x00007ca8877fe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x000000070e3c8bd0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos([email protected]/LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1852)
	at java.lang.ref.ReferenceQueue.await([email protected]/ReferenceQueue.java:79)
	at java.lang.ref.ReferenceQueue.remove0([email protected]/ReferenceQueue.java:151)
	at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:229)
	at jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:140)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)
	at jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:186)

"Notification Thread" #27 [2076908] daemon prio=9 os_prio=0 cpu=0.05ms elapsed=29302.71s tid=0x00007ca8b431e2a0 nid=2076908 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Java2D Disposer" #29 [2076909] daemon prio=10 os_prio=0 cpu=27.95ms elapsed=29302.63s tid=0x00007ca8b43df200 nid=2076909 waiting on condition  [0x00007ca887103000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x000000070e3c10b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.lang.ref.ReferenceQueue.await([email protected]/ReferenceQueue.java:75)
	at java.lang.ref.ReferenceQueue.remove0([email protected]/ReferenceQueue.java:166)
	at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:246)
	at sun.java2d.Disposer.run([email protected]/Disposer.java:145)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"AWT-XAWT" #30 [2076910] daemon prio=6 os_prio=0 cpu=9893.45ms elapsed=29302.63s tid=0x00007ca8b43e1ac0 nid=2076910 runnable  [0x00007ca887003000]
   java.lang.Thread.State: RUNNABLE
	at sun.awt.X11.XToolkit.waitForEvents([email protected]/Native Method)
	at sun.awt.X11.XToolkit.run([email protected]/XToolkit.java:687)
	at sun.awt.X11.XToolkit.run([email protected]/XToolkit.java:651)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"DestroyJavaVM" #32 [2076889] prio=5 os_prio=0 cpu=190.52ms elapsed=29302.53s tid=0x00007ca8b402b790 nid=2076889 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Log4j2-TF-3-Scheduled-1" #47 [2076927] daemon prio=5 os_prio=0 cpu=120.47ms elapsed=29302.22s tid=0x00007ca8046321c0 nid=2076927 waiting on condition  [0x00007ca8867ff000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x000000070e800078> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos([email protected]/LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos([email protected]/AbstractQueuedSynchronizer.java:1763)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take([email protected]/ScheduledThreadPoolExecutor.java:1182)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take([email protected]/ScheduledThreadPoolExecutor.java:899)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"AWT-Shutdown" #57 [2076936] prio=5 os_prio=0 cpu=5.11ms elapsed=29301.87s tid=0x00007ca804919c30 nid=2076936 in Object.wait()  [0x00007ca885551000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.lang.Object.wait([email protected]/Object.java:352)
	at sun.awt.AWTAutoShutdown.run([email protected]/AWTAutoShutdown.java:291)
	- locked <0x000000071777e8a8> (a java.lang.Object)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"AWT-EventQueue-0" #56 [2076937] prio=6 os_prio=0 cpu=92844.30ms elapsed=29301.87s tid=0x00007ca80491ad70 nid=2076937 waiting for monitor entry  [0x00007ca88544f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at db.DBHandle.isChanged(DBHandle.java:752)
	- waiting to lock <0x000000071857f2e0> (a db.DBHandle)
	at ghidra.framework.data.DomainObjectAdapterDB.isChanged(DomainObjectAdapterDB.java:442)
	at ghidra.app.plugin.core.progmgr.MultiProgramManager.checkForUnsavedPrograms(MultiProgramManager.java:400)
	at ghidra.app.plugin.core.progmgr.MultiProgramManager.lambda$new$0(MultiProgramManager.java:74)
	at ghidra.app.plugin.core.progmgr.MultiProgramManager$$Lambda/0x00000000898ecd90.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch([email protected]/InvocationEvent.java:318)
	at java.awt.EventQueue.dispatchEventImpl([email protected]/EventQueue.java:773)
	at java.awt.EventQueue$4.run([email protected]/EventQueue.java:720)
	at java.awt.EventQueue$4.run([email protected]/EventQueue.java:714)
	at java.security.AccessController.executePrivileged([email protected]/AccessController.java:778)
	at java.security.AccessController.doPrivileged([email protected]/AccessController.java:400)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege([email protected]/ProtectionDomain.java:87)
	at java.awt.EventQueue.dispatchEvent([email protected]/EventQueue.java:742)
	at java.awt.EventDispatchThread.pumpOneEventForFilters([email protected]/EventDispatchThread.java:203)
	at java.awt.EventDispatchThread.pumpEventsForFilter([email protected]/EventDispatchThread.java:124)
	at java.awt.EventDispatchThread.pumpEventsForFilter([email protected]/EventDispatchThread.java:117)
	at java.awt.WaitDispatchSupport$2.run([email protected]/WaitDispatchSupport.java:191)
	at java.awt.WaitDispatchSupport$4.run([email protected]/WaitDispatchSupport.java:236)
	at java.awt.WaitDispatchSupport$4.run([email protected]/WaitDispatchSupport.java:234)
	at java.security.AccessController.executePrivileged([email protected]/AccessController.java:778)
	at java.security.AccessController.doPrivileged([email protected]/AccessController.java:319)
	at java.awt.WaitDispatchSupport.enter([email protected]/WaitDispatchSupport.java:234)
	at java.awt.Dialog.show([email protected]/Dialog.java:1079)
	at java.awt.Component.show([email protected]/Component.java:1728)
	at java.awt.Component.setVisible([email protected]/Component.java:1675)
	at java.awt.Window.setVisible([email protected]/Window.java:1036)
	at java.awt.Dialog.setVisible([email protected]/Dialog.java:1015)
	at docking.DockingDialog.setVisible(DockingDialog.java:363)
	at docking.DockingWindowManager.lambda$doShowDialog$5(DockingWindowManager.java:1817)
	at docking.DockingWindowManager$$Lambda/0x00000000896c28a0.run(Unknown Source)
	at ghidra.util.Swing.doRun(Swing.java:292)
	at ghidra.util.Swing.runNow(Swing.java:208)
	at ghidra.util.Swing.runNow(Swing.java:163)
	at docking.DockingWindowManager.doShowDialog(DockingWindowManager.java:1821)
	at docking.DockingWindowManager.showDialog(DockingWindowManager.java:1769)
	at ghidra.util.task.TaskDialog.lambda$doShow$7(TaskDialog.java:373)
	at ghidra.util.task.TaskDialog$$Lambda/0x00000000896c2678.run(Unknown Source)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.util.task.TaskDialog.doShow(TaskDialog.java:370)
	at ghidra.util.task.TaskDialog.doShowModal(TaskDialog.java:350)
	at ghidra.util.task.TaskDialog.show(TaskDialog.java:324)
	at ghidra.util.task.TaskRunner.lambda$showTaskDialog$1(TaskRunner.java:123)
	at ghidra.util.task.TaskRunner$$Lambda/0x00000000896c5750.run(Unknown Source)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.util.task.TaskRunner.showTaskDialog(TaskRunner.java:120)
	at ghidra.util.task.TaskRunner.run(TaskRunner.java:54)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:219)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:201)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:187)
	at ghidra.app.plugin.core.progmgr.ProgramSaveManager.save(ProgramSaveManager.java:214)
	at ghidra.app.plugin.core.progmgr.ProgramSaveManager.saveProgram(ProgramSaveManager.java:200)
	at ghidra.app.plugin.core.progmgr.ProgramManagerPlugin.lambda$saveProgram$17(ProgramManagerPlugin.java:742)
	at ghidra.app.plugin.core.progmgr.ProgramManagerPlugin$$Lambda/0x0000000089de2498.run(Unknown Source)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.app.plugin.core.progmgr.ProgramManagerPlugin.saveProgram(ProgramManagerPlugin.java:742)
	at ghidra.app.plugin.core.progmgr.SaveProgramAction.actionPerformed(SaveProgramAction.java:63)
	at ghidra.app.plugin.core.progmgr.AbstractProgramNameSwitchingAction.actionPerformed(AbstractProgramNameSwitchingAction.java:71)
	at docking.ExecutableAction.execute(ExecutableAction.java:40)
	at docking.action.MultipleKeyAction.actionPerformed(MultipleKeyAction.java:152)
	at javax.swing.SwingUtilities.notifyAction([email protected]/SwingUtilities.java:1810)
	at docking.KeyBindingOverrideKeyEventDispatcher.actionInProgress(KeyBindingOverrideKeyEventDispatcher.java:222)
	at docking.KeyBindingOverrideKeyEventDispatcher.dispatchKeyEvent(KeyBindingOverrideKeyEventDispatcher.java:119)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent([email protected]/DefaultKeyboardFocusManager.java:1141)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions([email protected]/DefaultKeyboardFocusManager.java:1020)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent([email protected]/DefaultKeyboardFocusManager.java:848)
	at java.awt.Component.dispatchEventImpl([email protected]/Component.java:4877)
	at java.awt.Container.dispatchEventImpl([email protected]/Container.java:2324)
	at java.awt.Window.dispatchEventImpl([email protected]/Window.java:2780)
	at java.awt.Component.dispatchEvent([email protected]/Component.java:4828)
	at java.awt.EventQueue.dispatchEventImpl([email protected]/EventQueue.java:775)
	at java.awt.EventQueue$4.run([email protected]/EventQueue.java:720)
	at java.awt.EventQueue$4.run([email protected]/EventQueue.java:714)
	at java.security.AccessController.executePrivileged([email protected]/AccessController.java:778)
	at java.security.AccessController.doPrivileged([email protected]/AccessController.java:400)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege([email protected]/ProtectionDomain.java:87)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege([email protected]/ProtectionDomain.java:98)
	at java.awt.EventQueue$5.run([email protected]/EventQueue.java:747)
	at java.awt.EventQueue$5.run([email protected]/EventQueue.java:745)
	at java.security.AccessController.executePrivileged([email protected]/AccessController.java:778)
	at java.security.AccessController.doPrivileged([email protected]/AccessController.java:400)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege([email protected]/ProtectionDomain.java:87)
	at java.awt.EventQueue.dispatchEvent([email protected]/EventQueue.java:744)
	at java.awt.EventDispatchThread.pumpOneEventForFilters([email protected]/EventDispatchThread.java:203)
	at java.awt.EventDispatchThread.pumpEventsForFilter([email protected]/EventDispatchThread.java:124)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy([email protected]/EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents([email protected]/EventDispatchThread.java:109)
	at java.awt.EventDispatchThread.pumpEvents([email protected]/EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.run([email protected]/EventDispatchThread.java:90)

"TimerQueue" #58 [2076938] daemon prio=5 os_prio=0 cpu=73183.10ms elapsed=29301.78s tid=0x00007ca77c053630 nid=2076938 waiting on condition  [0x00007ca885351000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000717781308> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos([email protected]/LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos([email protected]/AbstractQueuedSynchronizer.java:1763)
	at java.util.concurrent.DelayQueue.take([email protected]/DelayQueue.java:255)
	at javax.swing.TimerQueue.run([email protected]/TimerQueue.java:165)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"GhidraSwinglessTimer" #62 [2076949] daemon prio=6 os_prio=0 cpu=2.35ms elapsed=29300.26s tid=0x00007ca77c6f2f40 nid=2076949 in Object.wait()  [0x00007ca884c5c000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.util.TimerThread.mainLoop([email protected]/Timer.java:569)
	- locked <0x000000071075f638> (a java.util.TaskQueue)
	at java.util.TimerThread.run([email protected]/Timer.java:522)

"File System Listener" #66 [2076953] daemon prio=6 os_prio=0 cpu=0.11ms elapsed=29300.25s tid=0x00007ca77c6f9ea0 nid=2076953 waiting on condition  [0x00007ca884b5c000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x00000007107630c0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at ghidra.framework.store.FileSystemEventManager$FileSystemEventProcessingThread.run(FileSystemEventManager.java:227)

"SwingWorker-pool-4-thread-1" #67 [2076960] daemon prio=5 os_prio=0 cpu=1.33ms elapsed=29300.23s tid=0x00007ca77c71f100 nid=2076960 waiting on condition  [0x00007ca884a5c000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"JNA Cleaner" #83 [2076986] daemon prio=5 os_prio=0 cpu=97.42ms elapsed=29296.00s tid=0x00007ca70001bc90 nid=2076986 waiting on condition  [0x00007ca87bcfe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000715cd81d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos([email protected]/LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1852)
	at java.lang.ref.ReferenceQueue.await([email protected]/ReferenceQueue.java:79)
	at java.lang.ref.ReferenceQueue.remove0([email protected]/ReferenceQueue.java:151)
	at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:229)
	at com.sun.jna.internal.Cleaner$CleanerThread.run(Cleaner.java:154)

"GTimer" #106 [2077011] daemon prio=6 os_prio=0 cpu=187.23ms elapsed=29294.43s tid=0x00007ca77d34cd60 nid=2077011 in Object.wait()  [0x00007ca87a5fe000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.util.TimerThread.mainLoop([email protected]/Timer.java:569)
	- locked <0x0000000715cd8ca0> (a java.util.TaskQueue)
	at java.util.TimerThread.run([email protected]/Timer.java:522)

"SwingWorker-pool-4-thread-2" #245 [2096770] daemon prio=5 os_prio=0 cpu=0.48ms elapsed=25032.05s tid=0x00007ca77ca894b0 nid=2096770 waiting on condition  [0x00007ca8846cb000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-3" #259 [2099082] daemon prio=5 os_prio=0 cpu=0.57ms elapsed=24236.77s tid=0x00007ca77ca67b10 nid=2099082 waiting on condition  [0x00007ca8847cb000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-4" #338 [2123352] daemon prio=5 os_prio=0 cpu=0.53ms elapsed=16498.47s tid=0x00007ca77cb3c7f0 nid=2123352 waiting on condition  [0x00007ca8842cb000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-5" #363 [2124212] daemon prio=5 os_prio=0 cpu=0.40ms elapsed=16266.81s tid=0x00007ca77d3d7b20 nid=2124212 waiting on condition  [0x00007ca87bdfe000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-6" #393 [2124803] daemon prio=5 os_prio=0 cpu=0.34ms elapsed=16098.47s tid=0x00007ca77cde8a90 nid=2124803 waiting on condition  [0x00007ca884d5c000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-7" #411 [2125808] daemon prio=5 os_prio=0 cpu=0.42ms elapsed=15821.82s tid=0x00007ca77cdeb3b0 nid=2125808 waiting on condition  [0x00007ca87a9fe000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-8" #424 [2126948] daemon prio=5 os_prio=0 cpu=0.71ms elapsed=15452.79s tid=0x00007ca77c9b8420 nid=2126948 waiting on condition  [0x00007ca886f03000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"SwingWorker-pool-4-thread-9" #439 [2129028] daemon prio=5 os_prio=0 cpu=0.32ms elapsed=14765.05s tid=0x00007ca77d3c51c0 nid=2129028 waiting on condition  [0x00007ca87b3fe000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"FelixDispatchQueue" #496 [2168999] prio=6 os_prio=0 cpu=0.33ms elapsed=228.37s tid=0x00007ca77cb24de0 nid=2168999 in Object.wait()  [0x00007ca885c57000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.lang.Object.wait([email protected]/Object.java:352)
	at org.apache.felix.framework.EventDispatcher.run(EventDispatcher.java:1122)
	- locked <0x0000000715cda228> (a java.util.ArrayList)
	at org.apache.felix.framework.EventDispatcher.access$000(EventDispatcher.java:54)
	at org.apache.felix.framework.EventDispatcher$1.run(EventDispatcher.java:102)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"FelixFrameworkWiring" #502 [2169005] daemon prio=6 os_prio=0 cpu=0.21ms elapsed=228.32s tid=0x00007ca77cb4fdf0 nid=2169005 in Object.wait()  [0x00007ca8843cb000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.lang.Object.wait([email protected]/Object.java:352)
	at org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:169)
	- locked <0x000000070ff73d10> (a java.util.ArrayList)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"FelixStartLevel" #503 [2169006] daemon prio=6 os_prio=0 cpu=0.12ms elapsed=228.32s tid=0x00007ca77caa2390 nid=2169006 in Object.wait()  [0x00007ca887afe000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0([email protected]/Native Method)
	- waiting on <no object reference available>
	at java.lang.Object.wait([email protected]/Object.java:378)
	at java.lang.Object.wait([email protected]/Object.java:352)
	at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:274)
	- locked <0x000000070ff76e48> (a java.util.ArrayList)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"Attach Listener" #532 [2169437] daemon prio=9 os_prio=0 cpu=0.49ms elapsed=151.58s tid=0x00007ca858000f50 nid=2169437 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"SwingWorker-pool-4-thread-10" #537 [2169689] daemon prio=5 os_prio=0 cpu=0.53ms elapsed=72.18s tid=0x00007ca77cb24280 nid=2169689 waiting on condition  [0x00007ca87b5fe000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
	- parking to wait for  <0x0000000710766b30> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:371)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block([email protected]/AbstractQueuedSynchronizer.java:519)
	at java.util.concurrent.ForkJoinPool.unmanagedBlock([email protected]/ForkJoinPool.java:4021)
	at java.util.concurrent.ForkJoinPool.managedBlock([email protected]/ForkJoinPool.java:3967)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:1712)
	at java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:435)
	at java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1070)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"Task - Save Program" #538 [2169890] daemon prio=5 os_prio=0 cpu=13.18ms elapsed=14.96s tid=0x00007ca77c9051d0 nid=2169890 runnable  [0x00007ca88495c000]
   java.lang.Thread.State: RUNNABLE
	at java.io.RandomAccessFile.write0([email protected]/Native Method)
	at java.io.RandomAccessFile.implWrite([email protected]/RandomAccessFile.java:605)
	at java.io.RandomAccessFile.write([email protected]/RandomAccessFile.java:599)
	at java.io.RandomAccessFile.writeByte([email protected]/RandomAccessFile.java:1157)
	at db.buffers.LocalBufferFile.putFreeBlock(LocalBufferFile.java:569)
	at db.buffers.LocalManagedBufferFile.putFreeBlock(LocalManagedBufferFile.java:268)
	at db.buffers.LocalBufferFile.writeHeader(LocalBufferFile.java:490)
	at db.buffers.LocalBufferFile.flush(LocalBufferFile.java:753)
	at db.buffers.LocalManagedBufferFile.setReadOnly(LocalManagedBufferFile.java:359)
	- locked <0x000000071b9247e0> (a db.buffers.LocalManagedBufferFile)
	at db.buffers.LocalManagedBufferFile.saveCompleted(LocalManagedBufferFile.java:707)
	- locked <0x0000000718580d28> (a db.buffers.LocalManagedBufferFile)
	at db.buffers.BufferMgr.save(BufferMgr.java:1891)
	- locked <0x000000071857f328> (a db.buffers.BufferMgr)
	- locked <0x0000000718581190> (a java.lang.Object)
	at db.DBHandle.save(DBHandle.java:789)
	- locked <0x000000071857f2e0> (a db.DBHandle)
	at ghidra.framework.data.DomainObjectAdapterDB.save(DomainObjectAdapterDB.java:517)
	- locked <0x000000071857dfc0> (a ghidra.program.database.ProgramDB)
	at ghidra.framework.data.GhidraFile.save(GhidraFile.java:261)
	at ghidra.app.plugin.core.progmgr.ProgramSaveManager$SaveFileTask.run(ProgramSaveManager.java:490)
	at ghidra.util.task.Task.monitoredRun(Task.java:134)
	at ghidra.util.task.TaskRunner.lambda$startTaskThread$0(TaskRunner.java:106)
	at ghidra.util.task.TaskRunner$$Lambda/0x00000000896c5528.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith([email protected]/Thread.java:1588)
	at java.lang.Thread.run([email protected]/Thread.java:1575)

"GC Thread#15" os_prio=0 cpu=279.96ms elapsed=29301.88s tid=0x00007ca86c01dd40 nid=2076935 runnable  

"GC Thread#14" os_prio=0 cpu=282.77ms elapsed=29301.88s tid=0x00007ca86c01d1d0 nid=2076934 runnable  

"GC Thread#13" os_prio=0 cpu=275.86ms elapsed=29301.88s tid=0x00007ca86c01c6a0 nid=2076933 runnable  

"GC Thread#12" os_prio=0 cpu=265.24ms elapsed=29301.88s tid=0x00007ca86c01bbb0 nid=2076932 runnable  

"GC Thread#11" os_prio=0 cpu=272.28ms elapsed=29301.88s tid=0x00007ca86c01b1c0 nid=2076931 runnable  

"GC Thread#10" os_prio=0 cpu=265.67ms elapsed=29301.88s tid=0x00007ca86c01aa30 nid=2076930 runnable  

"G1 Conc#3" os_prio=0 cpu=1255.48ms elapsed=29302.23s tid=0x00007ca88c002370 nid=2076926 runnable  

"G1 Conc#2" os_prio=0 cpu=1247.33ms elapsed=29302.23s tid=0x00007ca88c001830 nid=2076925 runnable  

"G1 Conc#1" os_prio=0 cpu=1241.08ms elapsed=29302.23s tid=0x00007ca88c000cf0 nid=2076924 runnable  

"GC Thread#9" os_prio=0 cpu=358.75ms elapsed=29302.25s tid=0x00007ca86c017fb0 nid=2076923 runnable  

"GC Thread#8" os_prio=0 cpu=274.03ms elapsed=29302.25s tid=0x00007ca86c0175c0 nid=2076922 runnable  

"GC Thread#7" os_prio=0 cpu=260.51ms elapsed=29302.25s tid=0x00007ca86c00f810 nid=2076921 runnable  

"GC Thread#6" os_prio=0 cpu=271.81ms elapsed=29302.25s tid=0x00007ca86c00eea0 nid=2076920 runnable  

"GC Thread#5" os_prio=0 cpu=285.72ms elapsed=29302.25s tid=0x00007ca86c014e30 nid=2076919 runnable  

"GC Thread#4" os_prio=0 cpu=296.13ms elapsed=29302.49s tid=0x00007ca86c00c7a0 nid=2076917 runnable  

"GC Thread#3" os_prio=0 cpu=292.61ms elapsed=29302.49s tid=0x00007ca86c00bc70 nid=2076916 runnable  

"GC Thread#2" os_prio=0 cpu=273.38ms elapsed=29302.49s tid=0x00007ca86c00b140 nid=2076915 runnable  

"GC Thread#1" os_prio=0 cpu=301.69ms elapsed=29302.49s tid=0x00007ca86c00a610 nid=2076914 runnable  

"VM Thread" os_prio=0 cpu=162.01ms elapsed=29302.76s tid=0x00007ca8b41cb750 nid=2076896 runnable  

"VM Periodic Task Thread" os_prio=0 cpu=10767.90ms elapsed=29302.78s tid=0x00007ca8b416d5a0 nid=2076895 waiting on condition  

"G1 Service" os_prio=0 cpu=854.41ms elapsed=29302.78s tid=0x00007ca8b415d760 nid=2076894 runnable  

"G1 Refine#0" os_prio=0 cpu=6074.35ms elapsed=29302.78s tid=0x00007ca8b415c7a0 nid=2076893 runnable  

"G1 Conc#0" os_prio=0 cpu=1253.62ms elapsed=29302.78s tid=0x00007ca8b40a9440 nid=2076892 runnable  

"G1 Main Marker" os_prio=0 cpu=31.08ms elapsed=29302.78s tid=0x00007ca8b40a8470 nid=2076891 runnable  

"GC Thread#0" os_prio=0 cpu=297.81ms elapsed=29302.78s tid=0x00007ca8b4093ee0 nid=2076890 runnable  

JNI global refs: 108, weak refs: 1189

@emteere
Copy link
Contributor

emteere commented Dec 6, 2024

Actually not deadlocked. It is writing.
Is your DB file huge?
It could be an inefficiency in the file write, possibly when you've made alot of changes to the program.

If you were to bring up the same program with just a simple change, would it happen again?
Do you have multiple programs up?

Does it stay this way forever, or eventually save? How long v.s. windows if it does save.

@astrelsky
Copy link
Contributor

Actually not deadlocked. It is writing.
Is your DB file huge?
It could be an inefficiency in the file write, possibly when you've made alot of changes to the program.

If you were to bring up the same program with just a simple change, would it happen again?
Do you have multiple programs up?

Does it stay this way forever, or eventually save? How long v.s. windows if it does save.

I'm not sure if it's the same as the op, but for me it's usually trivial like changing a single label or data (I'm a paranoid saver)

@H-A-M-G-E-R
Copy link
Author

H-A-M-G-E-R commented Dec 6, 2024

only made one tiny change and it still took a long time to save
it didn't get stuck forever
the mf.rep file is 1.2 GB while the Metroid Fusion rom is only 8 MB in size
sometimes it takes a near-instant to save while others take very long

@emteere
Copy link
Contributor

emteere commented Dec 7, 2024

Since this is a sporadic issue, it can be hard to diagnose.
One strange thing above is the amount of time the thread writing the file has taken is 13ms.

1.2GB does seem rather large for an 8MB orignal binary, unless there are multiple programs in the .rep.
How big are the .gbf files in the .rep? They will be down several levels.

Possible there is some sort of bad feedback interaction between the backup save and the actual save on exit. It seems like two threads saving the program are involved. One is checking if the program has changed, and the other is writing it.

I've used visualvm to diagnose these types of issues, but it can be hard to pick out the real issue, and your issues seems sproadic. You could also dump the stack wiith jstack repetitively to see if anything becomes apparent with the two threads.

@H-A-M-G-E-R
Copy link
Author

i dumped the stack in #7258 (comment)

@emteere
Copy link
Contributor

emteere commented Dec 9, 2024

I meant repeatedly dump the stack 2-3 times every 20 seconds or so while it is in this state.
Really just to see where it is spending it's time and how it changes.
Might give some more clues.

visualvm is a better way to do it because it is recording, but there is a learning curve and easy to misinterpret the results. Plus you can't attach them to the ticket.

@ghidra1
Copy link
Collaborator

ghidra1 commented Dec 9, 2024

The issue appears to be purely based on a database save operation which is taking too long. The save is done by a modal task which will prevent the user from interacting with most of the GUI (other than task cancel button if present). Unfortunately, the save operation triggered an undo stack collapse which notified the MultiProgramListener which is attempting to update its undo/redo action state. This is blocked and in turn is blocking the swing thread which prevents subsequent task monitor updates or the ability to cancel save task. This should all free-up once the save actually completes. I will see if the undoStackChanged notification can be deferred until after the save operation has completed to avoid this GUI blocking in this case.

@ghidra1
Copy link
Collaborator

ghidra1 commented Dec 9, 2024

It is also interesting that the file has been completely written and is in the final steps of transitioning the buffer file to read-only. If at any point in the database's life a large amount of data was removed (e.g., initialized memory blocks) this could cause a large number of free buffers to exist. Every time the file is saved the free buffer chain is updated. That may account for why it was caught in the state where it is updating the free-buffer chain within the buffer file.

@ghidra1
Copy link
Collaborator

ghidra1 commented Dec 9, 2024

I will see if the undoStackChanged notification can be deferred until after the save operation has completed to avoid this GUI blocking in this case.

I verified that it is unlikely that the notifyUndoStackChanged was triggered by the save operation prior to its completion. It may have been triggered by something prior to the start of the save operation if change and save were initiated by a script (e.g., rapid fire change followed by save).

@ghidra1
Copy link
Collaborator

ghidra1 commented Dec 9, 2024

I will look into removing synchronized from DBHandle.isChanged() which may help to avoid the swing thread blocking issue. Although, it may get hung-up somewhere else after isChanged returns since all context-sensitive actions will attempt to adjust their enablement. I have not reproduced your situation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Triage Information is being gathered
Projects
None yet
Development

No branches or pull requests

5 participants