Better line start detection

Fixed debug info injection
This commit is contained in:
Jindra Petřík
2015-11-17 09:24:42 +01:00
parent 632e5156c8
commit 4a4e0e4898
547 changed files with 2058 additions and 1911 deletions

View File

@@ -386,7 +386,7 @@ public class AdvancedSettingsDialog extends AppDialog {
p.setMaximumSize(new Dimension(Integer.MAX_VALUE, tf.getPreferredSize().height));
p.add(tf, BorderLayout.CENTER);
JButton butSelect = new JButton(View.getIcon("folderopen16"));
butSelect.setToolTipText(AppStrings.translate("FileChooser.openButtonText"));
butSelect.setToolTipText(ResourceBundle.getBundle(AppStrings.getResourcePath(MainFrame.class)).getString("FileChooser.openButtonText"));
butSelect.setMargin(new Insets(2, 2, 2, 2));
butSelect.addActionListener((ActionEvent e) -> {
tf.setText(selectConfigFile(item, tf.getText(), confFile.value()));

View File

@@ -21,13 +21,19 @@ 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;
import com.jpexs.debugger.flash.messages.in.InBreakReason;
import com.jpexs.debugger.flash.messages.in.InContinue;
import com.jpexs.debugger.flash.messages.in.InFrame;
import com.jpexs.debugger.flash.messages.in.InNumScript;
import com.jpexs.debugger.flash.messages.in.InScript;
import com.jpexs.debugger.flash.messages.in.InSetBreakpoint;
import com.jpexs.debugger.flash.messages.in.InSwfInfo;
import com.jpexs.debugger.flash.messages.in.InVersion;
import com.jpexs.debugger.flash.messages.out.OutGetBreakReason;
import com.jpexs.decompiler.flash.abc.ClassPath;
import com.jpexs.decompiler.flash.abc.ScriptPack;
import com.jpexs.decompiler.graph.DottedChain;
@@ -55,6 +61,61 @@ public class DebuggerHandler implements DebugConnectionListener {
private Map<Integer, ClassPath> modulePaths = new HashMap<>();
private Map<ClassPath, Integer> classToModule = new HashMap<>();
private InFrame frame;
public static interface VariableChangedListener {
public void variablesChanged();
}
private List<VariableChangedListener> listeners = new ArrayList<>();
public void addVariableChangedListener(VariableChangedListener l) {
listeners.add(l);
}
public void removeVariableChangedListener(VariableChangedListener l) {
listeners.remove(l);
}
public void setVariableValue(int index, String value) {
//variables.get(index).value = value
//TODO:
}
public int getNumVariables() {
if (frame == null) {
return 0;
}
return frame.variables.size();
}
public Variable getFrameVariable() {
if (frame == null) {
return null;
}
return frame.frame;
}
public Variable getVariable(int index) {
if (frame == null) {
return null;
}
return frame.variables.get(index);
}
public int getNumRegisters() {
if (frame == null) {
return 0;
}
return frame.registers.size();
}
public Variable getRegister(int index) {
return frame.registers.get(index);
}
public int moduleIdOf(ScriptPack pack) {
if (classToModule.containsKey(pack.getClassPath())) {
return classToModule.get(pack.getClassPath());
@@ -89,6 +150,16 @@ public class DebuggerHandler implements DebugConnectionListener {
return commands;
}
private static void enlog(Class<?> cls) {
Level level = Level.FINEST;
Logger mylog = Logger.getLogger(cls.getName());
mylog.setLevel(level);
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(level);
mylog.addHandler(ch);
}
@Override
public void connected(DebuggerConnection con) {
@@ -98,15 +169,14 @@ public class DebuggerHandler implements DebugConnectionListener {
Main.getMainFrame().getPanel().updateMenu();
Level level = Level.FINER;
Logger rootLog = Logger.getLogger(Debugger.class.getName());
rootLog.setLevel(level);
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(level);
rootLog.addHandler(ch);
//rootLog.getHandlers()[0].setLevel(level);
//enlog(DebuggerConnection.class);
//enlog(DebuggerCommands.class);
try {
//rootLog.getHandlers()[0].setLevel(level);
con.getMessage(InVersion.class);
} catch (IOException ex) {
Logger.getLogger(DebuggerHandler.class.getName()).log(Level.SEVERE, null, ex);
}
commands = new DebuggerCommands(con);
try {
commands.stopWarning();
@@ -163,13 +233,33 @@ public class DebuggerHandler implements DebugConnectionListener {
synchronized (DebuggerHandler.this) {
paused = true;
}
Main.getMainFrame().getPanel().updateMenu();
Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "break at {0}:{1}", new Object[]{moduleNames.get(message.file), message.line});
if (!modulePaths.containsKey(message.file)) {
return;
View.execInEventDispatchLater(new Runnable() {
@Override
public void run() {
Main.getMainFrame().getPanel().updateMenu();
Logger.getLogger(DebuggerHandler.class.getName()).log(Level.INFO, "break at {0}:{1}", new Object[]{moduleNames.get(message.file), message.line});
if (!modulePaths.containsKey(message.file)) {
return;
}
String cls = modulePaths.get(message.file).toString();
try {
InBreakAtExt bex = con.getMessage(InBreakAtExt.class);
InBreakReason ibr = con.sendMessage(new OutGetBreakReason(con), InBreakReason.class);
frame = commands.getFrame(0);
for (VariableChangedListener l : listeners) {
l.variablesChanged();
}
} catch (IOException ex) {
//ignore
}
Main.getMainFrame().getPanel().debuggerBreakAt(Main.getMainFrame().getPanel().getCurrentSwf(), cls, message.line);
}
}
String cls = modulePaths.get(message.file).toString();
Main.getMainFrame().getPanel().debuggerBreakAt(Main.getMainFrame().getPanel().getCurrentSwf(), cls, message.line);
);
//dc.sendContinue();
}
});
@@ -187,7 +277,9 @@ public class DebuggerHandler implements DebugConnectionListener {
}
}
}
Main.getMainFrame().getPanel().refreshBreakPoints();
Main.getMainFrame()
.getPanel().refreshBreakPoints();
connected = true;
} catch (IOException ex) {
connected = false;

View File

@@ -16,6 +16,7 @@
*/
package com.jpexs.decompiler.flash.gui.abc;
import com.jpexs.debugger.flash.Variable;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.abc.ABC;
import com.jpexs.decompiler.flash.abc.ClassPath;
@@ -40,6 +41,7 @@ import com.jpexs.decompiler.flash.abc.usages.TraitMultinameUsage;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.gui.AppDialog;
import com.jpexs.decompiler.flash.gui.AppStrings;
import com.jpexs.decompiler.flash.gui.DebuggerHandler;
import com.jpexs.decompiler.flash.gui.HeaderLabel;
import com.jpexs.decompiler.flash.gui.Main;
import com.jpexs.decompiler.flash.gui.MainPanel;
@@ -81,6 +83,7 @@ import java.awt.event.MouseMotionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
@@ -98,7 +101,10 @@ import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.text.Highlighter;
import javax.swing.tree.TreePath;
import jsyntaxpane.SyntaxDocument;
@@ -143,6 +149,8 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
public final JLabel scriptNameLabel;
private JTable debugVariablesTable;
private final JLabel experimentalLabel = new JLabel(AppStrings.translate("action.edit.experimental"));
private final JButton editDecompiledButton = new JButton(AppStrings.translate("button.edit"), View.getIcon("edit16"));
@@ -256,6 +264,114 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
decompiledTextArea.clearScript();
}
public static class VariablesTableModel implements TableModel {
DebuggerHandler.VariableChangedListener varChangeListener;
List<TableModelListener> tableListeners = new ArrayList<>();
public VariablesTableModel() {
varChangeListener = new DebuggerHandler.VariableChangedListener() {
private int oldNum = 0;
@Override
public void variablesChanged() {
for (int i = 0; i < oldNum; i++) {
for (TableModelListener l : tableListeners) {
l.tableChanged(new TableModelEvent(VariablesTableModel.this, i, i, 0, TableModelEvent.DELETE));
}
}
oldNum = 1 + Main.getDebugHandler().getNumVariables() + Main.getDebugHandler().getNumRegisters();
for (TableModelListener l : tableListeners) {
l.tableChanged(new TableModelEvent(VariablesTableModel.this, 0, oldNum - 1, 0, TableModelEvent.INSERT));
}
}
};
Main.getDebugHandler().addVariableChangedListener(varChangeListener);
}
@Override
public int getRowCount() {
return (Main.getDebugHandler().getFrameVariable() == null ? 0 : 1) + Main.getDebugHandler().getNumRegisters() + Main.getDebugHandler().getNumVariables();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
return "Name";
case 1:
return "Type";
case 2:
return "Value";
default:
return null;
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 1;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
int numReg = Main.getDebugHandler().getNumRegisters();
Variable v;
if (rowIndex == 0) {
v = Main.getDebugHandler().getFrameVariable();
} else if (rowIndex >= numReg + 1) {
v = Main.getDebugHandler().getVariable(rowIndex - 1 - numReg);
} else {
v = Main.getDebugHandler().getRegister(rowIndex - 1);
}
switch (columnIndex) {
case 0:
return v.name;
case 1:
String typeStr = v.getTypeAsStr();
if ("Object".equals(typeStr)) {
typeStr = v.className;
}
if ("Object".equals(typeStr)) {
typeStr = v.typeName;
}
return typeStr;
case 2:
return v.getValueAsStr();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Main.getDebugHandler().setVariableValue(rowIndex, "" + aValue);
}
@Override
public void addTableModelListener(TableModelListener l) {
tableListeners.add(l);
}
@Override
public void removeTableModelListener(TableModelListener l) {
tableListeners.remove(l);
}
}
public ABCPanel(MainPanel mainPanel) {
this.mainPanel = mainPanel;
@@ -331,8 +447,11 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<ABC
detailPanel = new DetailPanel(this);
JPanel panB = new JPanel();
panB.setLayout(new BorderLayout());
panB.add(decPanel, BorderLayout.CENTER);
panB.add(decLabel, BorderLayout.NORTH);
panB.add(decPanel, BorderLayout.CENTER);
debugVariablesTable = new JTable(new VariablesTableModel());
panB.add(debugVariablesTable, BorderLayout.SOUTH);
decLabel.setHorizontalAlignment(SwingConstants.CENTER);
//decLabel.setBorder(new BevelBorder(BevelBorder.RAISED));
splitPane = new JPersistentSplitPane(JSplitPane.HORIZONTAL_SPLIT, panB, detailPanel, Configuration.guiAvm2SplitPaneDividerLocationPercent);

View File

@@ -53,7 +53,6 @@ import java.util.Timer;
import java.util.TimerTask;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import jsyntaxpane.DefaultSyntaxKit;
import jsyntaxpane.SyntaxDocument;
import jsyntaxpane.Token;
import jsyntaxpane.TokenType;