From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32219 invoked by alias); 23 Jun 2008 21:38:47 -0000 Received: (qmail 32193 invoked by uid 9519); 23 Jun 2008 21:38:47 -0000 Date: Mon, 23 Jun 2008 21:38:00 -0000 Message-ID: <20080623213847.32178.qmail@sourceware.org> From: rmoseley@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Add "load" command to UI. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 5539327049ca4af57908f6bd0e90196a20378395 X-Git-Newrev: f9e790bb9dea8d3d188cbcc995bc7fed8d42ff0e Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00397.txt.bz2 The branch, master has been updated via f9e790bb9dea8d3d188cbcc995bc7fed8d42ff0e (commit) from 5539327049ca4af57908f6bd0e90196a20378395 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit f9e790bb9dea8d3d188cbcc995bc7fed8d42ff0e Author: Rick Moseley Date: Mon Jun 23 16:35:31 2008 -0500 Add "load" command to UI. * SourceBuffer.java: Call getEntryPoint to get address. * SourceWindow.java: Add "load" capability. * SourceWindowFactory.java: Add loadExecutable method. * DynamicSegment.java: Make getEntryPoint public. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/solib/ChangeLog | 5 + frysk-core/frysk/solib/DynamicSegment.java | 4 +- frysk-gui/frysk/gui/srcwin/ChangeLog | 6 + frysk-gui/frysk/gui/srcwin/SourceBuffer.java | 10 ++ frysk-gui/frysk/gui/srcwin/SourceWindow.java | 139 +++++++++++++++++--- .../frysk/gui/srcwin/SourceWindowFactory.java | 33 ++++-- 6 files changed, 167 insertions(+), 30 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/solib/ChangeLog b/frysk-core/frysk/solib/ChangeLog index c1f7205..529a5a1 100644 --- a/frysk-core/frysk/solib/ChangeLog +++ b/frysk-core/frysk/solib/ChangeLog @@ -1,3 +1,8 @@ +2008-06-23 Rick Moseley + + * DynamicSegment.java: Made getEntryPoint public. + + 2008-03-10 Andrew Cagney * MemoryMapFactory.java: Update to match MemoryMap. diff --git a/frysk-core/frysk/solib/DynamicSegment.java b/frysk-core/frysk/solib/DynamicSegment.java index e773894..d9a98c5 100644 --- a/frysk-core/frysk/solib/DynamicSegment.java +++ b/frysk-core/frysk/solib/DynamicSegment.java @@ -51,7 +51,7 @@ import frysk.proc.Auxv; * to extract the information are all closed. */ -class DynamicSegment { +public class DynamicSegment { private static final Log fine = Log.fine(DynamicSegment.class); final long addr; @@ -99,7 +99,7 @@ class DynamicSegment { * Helper function to locate and report the backing Executables * entry point */ - private static long getEntryPoint(Elf exeElf) { + public static long getEntryPoint(Elf exeElf) { fine.log("getEntryPoint", exeElf); ElfEHeader eHeader = exeElf.getEHeader(); if (eHeader == null) diff --git a/frysk-gui/frysk/gui/srcwin/ChangeLog b/frysk-gui/frysk/gui/srcwin/ChangeLog index 1c0eb0d..fe5f98f 100644 --- a/frysk-gui/frysk/gui/srcwin/ChangeLog +++ b/frysk-gui/frysk/gui/srcwin/ChangeLog @@ -1,3 +1,9 @@ +2008-06-23 Rick Moseley + + * SourceBuffer.java: Call getEntryPoint to get address. + * SourceWindow.java: Add "load" capability. + * SourceWindowFactory.java: Add loadExecutable method. + 2008-06-10 Andrew Cagney * CurrentStackView.java (STACK_OPTIONS): New. Pass to diff --git a/frysk-gui/frysk/gui/srcwin/SourceBuffer.java b/frysk-gui/frysk/gui/srcwin/SourceBuffer.java index 0957b49..5950415 100644 --- a/frysk-gui/frysk/gui/srcwin/SourceBuffer.java +++ b/frysk-gui/frysk/gui/srcwin/SourceBuffer.java @@ -50,6 +50,8 @@ import java.util.List; import lib.dwfl.Disassembler; import lib.dwfl.Instruction; +import lib.dwfl.Elf; +import lib.dwfl.ElfCommand; import org.gnu.gdk.Color; import org.gnu.glib.JGException; @@ -80,6 +82,7 @@ import frysk.gui.srcwin.prefs.SyntaxPreference.SyntaxPreferenceListener; import frysk.proc.Task; import frysk.rt.LineXXX; import frysk.scopes.SourceLocation; +import frysk.solib.DynamicSegment; import frysk.value.Value; /** @@ -850,10 +853,17 @@ public class SourceBuffer extends TextBuffer { task.getMemory()); long address = frame.getAddress(); + // If the address is 0, use the entry point as the address to disassemble + if (address == 0) { + Elf elf = new Elf(task.getProc().getExeFile().getFile(), + ElfCommand.ELF_C_READ); + address = DynamicSegment.getEntryPoint(elf); + } this.deleteText(this.getStartIter(), this.getEndIter()); List instructionsList = diss.disassembleInstructions(address, 40); + Iterator iter = instructionsList.iterator(); while (iter.hasNext()) { diff --git a/frysk-gui/frysk/gui/srcwin/SourceWindow.java b/frysk-gui/frysk/gui/srcwin/SourceWindow.java index dfc8124..06a7a9e 100644 --- a/frysk-gui/frysk/gui/srcwin/SourceWindow.java +++ b/frysk-gui/frysk/gui/srcwin/SourceWindow.java @@ -167,6 +167,8 @@ public class SourceWindow extends Window { private Action close; private Action open_core; + + private Action open_load; private Action open_executable; @@ -580,7 +582,7 @@ public class SourceWindow extends Window { /** * Populates the stack browser window * - * @param frames An array of DebugInfoFrames used to popuate information + * @param frames An array of DebugInfoFrames used to populate information * inside the stack frame window. */ public void populateStackBrowser(DebugInfoFrame[][] frames) { @@ -886,7 +888,8 @@ public class SourceWindow extends Window { Proc[] newSwProc = new Proc[numProcs]; DOMFactory.clearDOMSourceMap(this.swProc[this.current]); - this.steppingEngine.detachProc(this.swProc[this.current], kill); + if (this.swProc[this.current].getPid() != 0) + this.steppingEngine.detachProc(this.swProc[this.current], kill); int j = 0; for (int i = 0; i < oldSize; i++) { @@ -916,7 +919,7 @@ public class SourceWindow extends Window { /*********************************************************************** * Getters and Setters **********************************************************************/ - + public Proc getSwProc() { if (this.swProc.length > 0) return this.swProc[this.current]; @@ -986,7 +989,7 @@ public class SourceWindow extends Window { this.open_core = new Action("open", "Examine core file...", "Examine core file", GtkStockItem.OPEN.getString()); this.open_core.setAccelGroup(ag); - this.open_core.setAccelPath("/File/Examine core file..."); + this.open_core.setAccelPath("/Processes/Examine core file..."); this.open_core.addListener(new org.gnu.gtk.event.ActionListener() { public void actionEvent(ActionEvent action) { // SourceWindow.this.glade.getWidget(SOURCE_WINDOW).destroy(); @@ -1023,7 +1026,7 @@ public class SourceWindow extends Window { // to // select a file name public void fileActivated(FileChooserEvent event) { - examineCoreFile(chooser.getFilename()); + examineCoreFile(); } }); setDefaultIcon(IconManager.windowIcon); @@ -1036,15 +1039,84 @@ public class SourceWindow extends Window { // The OK button was clicked, go open a source window for this // core file else if (response == ResponseType.OK.getValue()) { - examineCoreFile(chooser.getFilename()); + examineCoreFile(); chooser.destroy(); } } }); - AccelMap.changeEntry("/File/Examine core file...", + AccelMap.changeEntry("/Processes/Examine core file...", KeyValue.o, ModifierType.CONTROL_MASK, true); this.open_core.connectAccelerator(); + + // Load executable action + this.open_load = new Action("Load an executable", + "Load a process...", "Load a process from a file", + GtkStockItem.OPEN.getString()); + this.open_load.setAccelGroup(ag); + this.open_load + .setAccelPath("/Processes/Load a process..."); + this.open_load.addListener(new ActionListener() { + public void actionEvent(ActionEvent action) { + try { + glade_fc = new LibGlade(Prefix.gladeFile(FILECHOOSER_GLADE).getAbsolutePath(), null); + fc = (FileChooserDialog) glade_fc + .getWidget("frysk_filechooserdialog"); + fc.addListener(new LifeCycleListener() { + public void lifeCycleEvent(LifeCycleEvent event) { + } + + public boolean lifeCycleQuery(LifeCycleEvent event) { + if (event.isOfType(LifeCycleEvent.Type.DELETE) + || event + .isOfType(LifeCycleEvent.Type.DESTROY)) + fc.destroy(); + return false; + } + }); + fc.addListener(new FileChooserListener() { + public void currentFolderChanged(FileChooserEvent event) { + } + + public void selectionChanged(FileChooserEvent event) { + } + + public void updatePreview(FileChooserEvent event) { + } + + // This method is called when the "Enter" key is pressed + // to + // select a file name in the chooser + public void fileActivated(FileChooserEvent event) { + loadExecutableFile(); + } + }); + fc.setIcon(IconManager.windowIcon); + fc.setDefaultResponse(FileChooserEvent.Type.FILE_ACTIVATED + .getID()); + fc.setCurrentFolder(System.getProperty("user.home")); + CheckButton term_activate = (CheckButton) glade_fc + .getWidget("term_activate"); + term_activate.setSensitive(false); + gtk_widget_set_size_request(fc.getHandle(), 300, 600); + int response = fc.open(); + // "OK" key has been clicked + if (response == ResponseType.OK.getValue()) + loadExecutableFile(); + // "Cancel" key has been clicked + if (response == ResponseType.CANCEL.getValue()) + fc.destroy(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + + AccelMap.changeEntry("/Processes/Load executable file...", + KeyValue.l, ModifierType.CONTROL_MASK, true); + this.open_load.connectAccelerator(); + + // Close action this.close = new Action("close", "Close", "Close Window", GtkStockItem.CLOSE.getString()); @@ -1345,9 +1417,11 @@ public class SourceWindow extends Window { fc.setDefaultResponse(FileChooserEvent.Type.FILE_ACTIVATED .getID()); fc.setCurrentFolder(System.getProperty("user.home")); - gtk_widget_set_size_request(fc.getHandle(), 300, 300); + CheckButton term_activate = (CheckButton) glade_fc + .getWidget("term_activate"); + term_activate.setSensitive(false); + gtk_widget_set_size_request(fc.getHandle(), 300, 1000); int response = fc.open(); - gtk_widget_set_size_request(fc.getHandle(), 300, 300); // "OK" key has been clicked if (response == ResponseType.OK.getValue()) activateProc(); @@ -1570,17 +1644,41 @@ public class SourceWindow extends Window { } /** - * This method will activate a window to allow the user to exemaine a + * This method will activate a window to allow the user to examine a * core file * * @param filename - * String containing the path to the core file * */ - private void examineCoreFile(String filename) { + private void examineCoreFile() { + Entry task_options = (Entry) glade_fc.getWidget("task_options"); + String task_opt = task_options.getText(); + String filename = fc.getFilename(); + fc.destroy(); + String[] stds = { "/dev/null", "/dev/null", "/dev/null" }; + addProc(filename, "", task_opt, stds[0], stds[1], stds[2]); SourceWindowFactory.attachToCore(new File(filename)); - this.destroy(); } + + /** + * This method will activate a window to allow the user to load an + * executable file + * + * @param filename - + * String containing the path to the executable file + * + */ + private void loadExecutableFile() { + Entry task_options = (Entry) glade_fc.getWidget("task_options"); + String task_opt = task_options.getText(); + String filename = fc.getFilename(); + fc.destroy(); + String[] stds = { "/dev/null", "/dev/null", "/dev/null" }; + addProc(filename, "", task_opt, stds[0], stds[1], stds[2]); + SourceWindowFactory.loadExecutable(new File(filename), null); + //this.destroy(); +} /** * Creates the toolbar menus with initialized Actions. @@ -1589,11 +1687,14 @@ public class SourceWindow extends Window { // File menu MenuItem menu = new MenuItem("File", true); - // MenuItem mi = (MenuItem) this.open_core.createMenuItem(); + /* MenuItem mi = (MenuItem) this.open_core.createMenuItem(); + Menu tmp = new Menu(); + tmp.append(mi); + mi = (MenuItem) this.open_load.createMenuItem(); + tmp.append(mi); + mi = new MenuItem(); // Separator + tmp.append(mi); */ Menu tmp = new Menu(); - // tmp.append(mi); - // mi = new MenuItem(); // Separator - // tmp.append(mi); MenuItem mi = (MenuItem) this.close.createMenuItem(); tmp.append(mi); @@ -1686,14 +1787,16 @@ public class SourceWindow extends Window { menu = new MenuItem("Processes", false); tmp = new Menu(); - mi = (MenuItem) this.open_executable.createMenuItem(); + mi = (MenuItem) this.attach_proc.createMenuItem(); tmp.append(mi); mi = new MenuItem(); // Separator tmp.append(mi); - mi = (MenuItem) this.attach_proc.createMenuItem(); + mi = (MenuItem) this.open_executable.createMenuItem(); tmp.append(mi); mi = (MenuItem) this.open_core.createMenuItem(); tmp.append(mi); + mi = (MenuItem) this.open_load.createMenuItem(); + tmp.append(mi); menu.setSubmenu(tmp); ((MenuBar) this.glade.getWidget("menubar")).append(menu); diff --git a/frysk-gui/frysk/gui/srcwin/SourceWindowFactory.java b/frysk-gui/frysk/gui/srcwin/SourceWindowFactory.java index e662bb7..652ee6c 100644 --- a/frysk-gui/frysk/gui/srcwin/SourceWindowFactory.java +++ b/frysk-gui/frysk/gui/srcwin/SourceWindowFactory.java @@ -51,6 +51,7 @@ import org.gnu.gtk.event.LifeCycleListener; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import frysk.proc.dead.LinuxCoreFactory; +import frysk.proc.dead.LinuxExeFactory; import frysk.config.Prefix; import frysk.proc.TaskAttachedObserverXXX; import frysk.debuginfo.DebugInfoFrame; @@ -140,16 +141,28 @@ public class SourceWindowFactory public static void attachToCore(File coreFile) { Proc proc = LinuxCoreFactory.createProc(coreFile); - LinkedList tasks = proc.getTasks(); - DebugInfoFrame[] framez = new DebugInfoFrame[tasks.size()]; - Iterator iter = tasks.iterator(); - for (int i = 0; iter.hasNext(); i++) - { - Task task = (Task) iter.next(); - framez[i] = DebugInfoStackFactory.createDebugInfoStackTrace(task); - } - createSourceWindow(framez); - } + LinkedList tasks = proc.getTasks(); + DebugInfoFrame[] framez = new DebugInfoFrame[tasks.size()]; + Iterator iter = tasks.iterator(); + for (int i = 0; iter.hasNext(); i++) { + Task task = (Task) iter.next(); + framez[i] = DebugInfoStackFactory.createDebugInfoStackTrace(task); + } + createSourceWindow(framez); + } + + public static void loadExecutable(File exeFile, String[] args) { + Proc proc = LinuxExeFactory.createProc(exeFile, args); + + LinkedList tasks = proc.getTasks(); + DebugInfoFrame[] framez = new DebugInfoFrame[tasks.size()]; + Iterator iter = tasks.iterator(); + for (int i = 0; iter.hasNext(); i++) { + Task task = (Task) iter.next(); + framez[i] = DebugInfoStackFactory.createDebugInfoStackTrace(task); + } + createSourceWindow(framez); + } public static AttachedObserver startNewProc(String file, String env_variables, String options, String stdin, String stdout, String stderr) hooks/post-receive -- frysk system monitor/debugger