From 9123a3a6461d0b349098344e601002373e0686dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 6 Dec 2015 10:18:37 +0100 Subject: [PATCH 1/3] Add watch stub... not working :-(, probably bug of adobe. --- .../decompiler/flash/gui/DebugPanel.java | 98 +++++++++++++++++-- .../decompiler/flash/gui/DebuggerHandler.java | 19 +++- src/com/jpexs/decompiler/flash/gui/Main.java | 7 ++ .../decompiler/flash/gui/abc/ABCPanel.java | 12 ++- .../flash/gui/locales/MainFrame.properties | 2 +- 5 files changed, 128 insertions(+), 10 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/DebugPanel.java b/src/com/jpexs/decompiler/flash/gui/DebugPanel.java index cef9729fb..5df50caed 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebugPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/DebugPanel.java @@ -26,11 +26,17 @@ import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; @@ -84,9 +90,79 @@ public class DebugPanel extends JPanel { public DebugPanel() { super(new BorderLayout()); - debugRegistersTable = new JTable(new ABCPanel.VariablesTableModel(new ArrayList<>())); - debugLocalsTable = new JTable(new ABCPanel.VariablesTableModel(new ArrayList<>())); - debugScopeTable = new JTable(new ABCPanel.VariablesTableModel(new ArrayList<>())); + debugRegistersTable = new JTable(new ABCPanel.VariablesTableModel(new ArrayList<>(), new ArrayList<>())); + debugLocalsTable = new JTable(new ABCPanel.VariablesTableModel(new ArrayList<>(), new ArrayList<>())); + + //Add watch feature, commented out. I tried it, but without success. I can't add watch in Flash Pro or FDB either. :-( + /* + //locales + debug.watch.add = Add watch to %name% + debug.watch.add.read = Read + debug.watch.add.write = Write + debug.watch.add.readwrite = Read+Write + + error.debug.watch.add = Cannot add watch to this variable. + + + MouseAdapter watchHandler = new MouseAdapter() { + + @Override + public void mousePressed(MouseEvent e) { + if (e.isPopupTrigger()) { + dopop(e); + } + } + + @Override + public void mouseReleased(MouseEvent e) { + if (e.isPopupTrigger()) { + dopop(e); + } + } + + private void dopop(MouseEvent e) { + if (debugLocalsTable.getSelectedRow() == -1) { + return; + } + Variable v = ((ABCPanel.VariablesTableModel) debugLocalsTable.getModel()).getVars().get(debugLocalsTable.getSelectedRow()); + final long v_id = ((ABCPanel.VariablesTableModel) debugLocalsTable.getModel()).getVarIds().get(debugLocalsTable.getSelectedRow()); + + JPopupMenu pm = new JPopupMenu(); + JMenu addWatchMenu = new JMenu(AppStrings.translate("debug.watch.add").replace("%name%", v.name)); + JMenuItem watchReadMenuItem = new JMenuItem(AppStrings.translate("debug.watch.add.read")); + watchReadMenuItem.addActionListener((ActionEvent e1) -> { + if (!Main.addWatch(v, v_id, true, false)) { + View.showMessageDialog(DebugPanel.this, AppStrings.translate("debug.watch.add"), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); + } + }); + JMenuItem watchWriteMenuItem = new JMenuItem(AppStrings.translate("debug.watch.add.write")); + watchWriteMenuItem.addActionListener((ActionEvent e1) -> { + if (!Main.addWatch(v, v_id, false, true)) { + View.showMessageDialog(DebugPanel.this, AppStrings.translate("debug.watch.add"), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); + } + }); + JMenuItem watchReadWriteMenuItem = new JMenuItem(AppStrings.translate("debug.watch.add.readwrite")); + watchReadWriteMenuItem.addActionListener((ActionEvent e1) -> { + if (!Main.addWatch(v, v_id, true, true)) { + View.showMessageDialog(DebugPanel.this, AppStrings.translate("debug.watch.add"), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); + } + }); + + addWatchMenu.add(watchReadMenuItem); + addWatchMenu.add(watchWriteMenuItem); + addWatchMenu.add(watchReadWriteMenuItem); + pm.add(addWatchMenu); + + pm.show(e.getComponent(), e.getX(), e.getY()); + } + }; + + debugLocalsTable.addMouseListener(watchHandler); + debugScopeTable.addMouseListener(watchHandler); + + */ + debugScopeTable = new JTable(new ABCPanel.VariablesTableModel(new ArrayList<>(), new ArrayList<>())); + callStackTable = new JTable(); stackTable = new JTable(); traceLogTextarea = new JTextArea(); @@ -190,12 +266,22 @@ public class DebugPanel extends JPanel { SelectedTab oldSel = selectedTab; InFrame f = Main.getDebugHandler().getFrame(); if (f != null) { - debugRegistersTable.setModel(new ABCPanel.VariablesTableModel(f.registers)); + + List regVarIds = new ArrayList<>(); + for (int i = 0; i < f.registers.size(); i++) { + regVarIds.add(0L); + } + debugRegistersTable.setModel(new ABCPanel.VariablesTableModel(f.registers, regVarIds)); List locals = new ArrayList<>(); locals.addAll(f.arguments); locals.addAll(f.variables); - debugLocalsTable.setModel(new ABCPanel.VariablesTableModel(locals)); - debugScopeTable.setModel(new ABCPanel.VariablesTableModel(f.scopeChain)); + + List localIds = new ArrayList<>(); + localIds.addAll(f.argumentIds); + localIds.addAll(f.variableIds); + + debugLocalsTable.setModel(new ABCPanel.VariablesTableModel(locals, localIds)); + debugScopeTable.setModel(new ABCPanel.VariablesTableModel(f.scopeChain, f.scopeChainIds)); } else { debugRegistersTable.setModel(new DefaultTableModel()); debugLocalsTable.setModel(new DefaultTableModel()); diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index 84c913381..bb004df96 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -21,6 +21,7 @@ import com.jpexs.debugger.flash.DebugMessageListener; import com.jpexs.debugger.flash.Debugger; import com.jpexs.debugger.flash.DebuggerCommands; import com.jpexs.debugger.flash.DebuggerConnection; +import com.jpexs.debugger.flash.Variable; import com.jpexs.debugger.flash.messages.in.InAskBreakpoints; import com.jpexs.debugger.flash.messages.in.InBreakAt; import com.jpexs.debugger.flash.messages.in.InBreakAtExt; @@ -29,6 +30,7 @@ import com.jpexs.debugger.flash.messages.in.InContinue; import com.jpexs.debugger.flash.messages.in.InFrame; import com.jpexs.debugger.flash.messages.in.InGetSwd; import com.jpexs.debugger.flash.messages.in.InGetSwf; +import com.jpexs.debugger.flash.messages.in.InGetVariable; import com.jpexs.debugger.flash.messages.in.InNumScript; import com.jpexs.debugger.flash.messages.in.InProcessTag; import com.jpexs.debugger.flash.messages.in.InScript; @@ -36,6 +38,7 @@ import com.jpexs.debugger.flash.messages.in.InSetBreakpoint; import com.jpexs.debugger.flash.messages.in.InSwfInfo; import com.jpexs.debugger.flash.messages.in.InTrace; import com.jpexs.debugger.flash.messages.in.InVersion; +import com.jpexs.debugger.flash.messages.out.OutAddWatch2; import com.jpexs.debugger.flash.messages.out.OutGetBreakReason; import com.jpexs.debugger.flash.messages.out.OutGetSwd; import com.jpexs.debugger.flash.messages.out.OutGetSwf; @@ -131,6 +134,17 @@ public class DebuggerHandler implements DebugConnectionListener { } } + private int watchTag = 1; + + public synchronized com.jpexs.debugger.flash.DebuggerCommands.Watch addWatch(Variable v, long v_id, boolean watchRead, boolean watchWrite) { + int tag = watchTag++; + try { + return commands.addWatch(v_id, v.name, (watchRead ? OutAddWatch2.FLAG_READ : 0) | (watchWrite ? OutAddWatch2.FLAG_WRITE : 0), tag); + } catch (IOException ex) { + return null; + } + } + public synchronized Set getBreakPoints(String scriptName, boolean onlyValid) { Set lines = new TreeSet<>(); if (confirmedPointMap.containsKey(scriptName)) { @@ -424,8 +438,8 @@ public class DebuggerHandler implements DebugConnectionListener { Main.getMainFrame().getPanel().updateMenu(); - //enlog(DebuggerConnection.class); - //enlog(DebuggerCommands.class); + enlog(DebuggerConnection.class); + enlog(DebuggerCommands.class); //enlog(DebuggerHandler.class); try { con.getMessage(InVersion.class); @@ -502,6 +516,7 @@ public class DebuggerHandler implements DebugConnectionListener { commands.setSetterTimeout(5000); boolean isAS3 = (Main.getMainFrame().getPanel().getCurrentSwf().isAS3()); + con.isAS3 = isAS3; //Widelines - only AS3, it hangs in AS1/2 and SWD does not support UI32 lines if (isAS3) { diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 3a9496c74..3809ce7ee 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -17,6 +17,8 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.debugger.flash.Debugger; +import com.jpexs.debugger.flash.DebuggerCommands; +import com.jpexs.debugger.flash.Variable; import com.jpexs.decompiler.flash.ApplicationInfo; import com.jpexs.decompiler.flash.EventListener; import com.jpexs.decompiler.flash.SWF; @@ -195,6 +197,11 @@ public class Main { return runProcess != null && !runProcessDebug; } + public static synchronized boolean addWatch(Variable v, long v_id, boolean watchRead, boolean watchWrite) { + DebuggerCommands.Watch w = getDebugHandler().addWatch(v, v_id, watchRead, watchWrite); + return w != null; + } + public static void runPlayer(String title, final String exePath, String file, String flashVars) { if (flashVars != null && !flashVars.isEmpty()) { file += "?" + flashVars; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index f031d922e..4433e28d7 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -269,9 +269,19 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener tableListeners = new ArrayList<>(); private List vars; + private List varIds; - public VariablesTableModel(List vars) { + public List getVarIds() { + return varIds; + } + + public List getVars() { + return new ArrayList<>(vars); + } + + public VariablesTableModel(List vars, List varIds) { this.vars = vars; + this.varIds = varIds; } @Override diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 5c829ab73..617205e0e 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -694,4 +694,4 @@ debug.break.reason.step = (Step) debug.break.reason.halt = (Halt) debug.break.reason.scriptLoaded = (Script loaded) -menu.file.start.debugpcode = Debug P-code \ No newline at end of file +menu.file.start.debugpcode = Debug P-code From 9f1a63139f6b4f0dbce9d108e329227899e08970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 6 Dec 2015 10:19:23 +0100 Subject: [PATCH 2/3] logging fix --- src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index bb004df96..c951dd3ce 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -438,8 +438,8 @@ public class DebuggerHandler implements DebugConnectionListener { Main.getMainFrame().getPanel().updateMenu(); - enlog(DebuggerConnection.class); - enlog(DebuggerCommands.class); + //enlog(DebuggerConnection.class); + //enlog(DebuggerCommands.class); //enlog(DebuggerHandler.class); try { con.getMessage(InVersion.class); From ebfd512f2c77b77ab9e0902b611163a3bebab557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 6 Dec 2015 10:22:20 +0100 Subject: [PATCH 3/3] debugger lib --- lib/flashdebugger.jar | Bin 247668 -> 249501 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/flashdebugger.jar b/lib/flashdebugger.jar index 7966868b17a9e4ab71d3f8b0f2ffaf53753e0488..8b7a7a60c7c407f4ea86707ecc72f5298aaab047 100644 GIT binary patch delta 21965 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 delta 21108 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 VfG`9rfxFk!ukeQ{Yp`0T{|7%HU1k6P