From ff4dde62ae2e0262f1e4ba7ca309e7eaa1224b6b Mon Sep 17 00:00:00 2001 From: "Jan S." Date: Fri, 27 Feb 2026 17:49:04 +0100 Subject: [PATCH] fix(gui): use UI thread for refreshStackFrameList in debugger view (PR #2807) * fix(gui): use UI thread for refreshStackFrameList in debugger view * call `resetAllDebuggingInfo` also from UI thread --------- Co-authored-by: Skylot <118523+skylot@users.noreply.github.com> --- .../gui/device/debugger/DebugController.java | 4 ++-- .../jadx/gui/ui/panel/JDebuggerPanel.java | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/device/debugger/DebugController.java b/jadx-gui/src/main/java/jadx/gui/device/debugger/DebugController.java index 595b1e6c5..30dbcc591 100644 --- a/jadx-gui/src/main/java/jadx/gui/device/debugger/DebugController.java +++ b/jadx-gui/src/main/java/jadx/gui/device/debugger/DebugController.java @@ -905,8 +905,8 @@ public final class DebugController implements SmaliDebugger.SuspendListener, IDe private void resetAllInfo() { isSuspended = true; toBeUpdatedTreeNode = null; - debuggerPanel.resetAllDebuggingInfo(); cur.reset(); + UiUtils.uiRun(debuggerPanel::resetAllDebuggingInfo); } private List getRuntimeDebugInfo(FrameNode frame) { @@ -1367,7 +1367,7 @@ public final class DebugController implements SmaliDebugger.SuspendListener, IDe } } - private static class FieldTreeNode extends RuntimeValueTreeNode { + static class FieldTreeNode extends RuntimeValueTreeNode { private static final long serialVersionUID = -1111111202103122235L; private final RuntimeField field; diff --git a/jadx-gui/src/main/java/jadx/gui/ui/panel/JDebuggerPanel.java b/jadx-gui/src/main/java/jadx/gui/ui/panel/JDebuggerPanel.java index bab34d23d..a252252ce 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/panel/JDebuggerPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/panel/JDebuggerPanel.java @@ -448,6 +448,7 @@ public class JDebuggerPanel extends JPanel { } public void resetAllDebuggingInfo() { + UiUtils.uiThreadGuard(); clearFrameAndThreadList(); resetRegTreeNodes(); resetThisTreeNodes(); @@ -483,13 +484,15 @@ public class JDebuggerPanel extends JPanel { } public void refreshStackFrameList(List elements) { - if (elements.size() > 0) { - DefaultListModel model = - (DefaultListModel) stackFrameList.getModel(); - elements.forEach(model::addElement); - stackFrameList.setFont(mainWindow.getSettings().getCodeFont()); - } - SwingUtilities.invokeLater(stackFrameList::repaint); + UiUtils.uiRun(() -> { + if (!elements.isEmpty()) { + DefaultListModel model = + (DefaultListModel) stackFrameList.getModel(); + model.addAll(elements); + stackFrameList.setFont(mainWindow.getSettings().getCodeFont()); + } + stackFrameList.repaint(); + }); } public void refreshRegisterTree() { @@ -578,7 +581,7 @@ public class JDebuggerPanel extends JPanel { @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(64); sb.append(getName()); String val = getValue(); if (val != null) {