From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26799 invoked by alias); 24 Jan 2008 22:13:51 -0000 Received: (qmail 26770 invoked by uid 440); 24 Jan 2008 22:13:50 -0000 Date: Thu, 24 Jan 2008 22:13:00 -0000 Message-ID: <20080124221350.26753.qmail@sourceware.org> From: scox@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Add a -sysroot request option. Keep a per process sysroot. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: b1204beec55a35ac0c18d37519cd55c70bd33fb8 X-Git-Newrev: 731d52ca58b0f4fff40f44af122e7e7cd700d9b4 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-q1/txt/msg00120.txt.bz2 The branch, master has been updated via 731d52ca58b0f4fff40f44af122e7e7cd700d9b4 (commit) from b1204beec55a35ac0c18d37519cd55c70bd33fb8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 731d52ca58b0f4fff40f44af122e7e7cd700d9b4 Author: Stan Cox Date: Thu Jan 24 16:31:00 2008 -0500 Add a -sysroot request option. Keep a per process sysroot. * fhpd.java (main): Pass sysroot to request via -sysroot option. * DebugInfoFrame.java (getLine): Get sysroot via DwflCache.getSysroot. * DwflCache.java (Mod.sysroot): New. (sysrootMap): New. (getRelativeSysRoot): Change to use java.io.File. (getDwfl): Set Mod.sysroot. (setSysroot): New. (getSysroot): New. * AttachCommand.java (Options): New. Add -sysroot option. (interpret): Set sysroot. * CoreCommand.java: Likewise. * LoadCommand.java: Likewise. * ListCommand.java (interpret): Remove sysroot reference except for "list function". * DbgVariables.java (DbgVariables): Remove SYSROOT. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/bindir/ChangeLog | 4 + frysk-core/frysk/bindir/fhpd.java | 2 +- frysk-core/frysk/debuginfo/ChangeLog | 6 ++- frysk-core/frysk/debuginfo/DebugInfoFrame.java | 13 +--- frysk-core/frysk/dwfl/ChangeLog | 9 +++ frysk-core/frysk/dwfl/DwflCache.java | 84 +++++++++++++++--------- frysk-core/frysk/hpd/AttachCommand.java | 20 +++++- frysk-core/frysk/hpd/ChangeLog | 10 +++ frysk-core/frysk/hpd/CoreCommand.java | 21 +++++- frysk-core/frysk/hpd/DbgVariables.java | 3 +- frysk-core/frysk/hpd/ListCommand.java | 17 ++---- frysk-core/frysk/hpd/LoadCommand.java | 44 +++++++++---- frysk-core/frysk/hpd/StartCommand.java | 4 +- 13 files changed, 160 insertions(+), 77 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog index 09d1036..a2f3f7a 100644 --- a/frysk-core/frysk/bindir/ChangeLog +++ b/frysk-core/frysk/bindir/ChangeLog @@ -1,3 +1,7 @@ +2008-01-24 Stan Cox + + * fhpd.java (main): Pass sysroot to request via -sysroot option. + 2008-01-24 Andrew Cagney * TestFmaps.java: Update; CoreFileAtSignal renamed to diff --git a/frysk-core/frysk/bindir/fhpd.java b/frysk-core/frysk/bindir/fhpd.java index 9123d06..f42aab1 100644 --- a/frysk-core/frysk/bindir/fhpd.java +++ b/frysk-core/frysk/bindir/fhpd.java @@ -151,7 +151,7 @@ public class fhpd line +=" -noexe"; } if (sysroot != null) - line = line + " ; set SYSROOT " + sysroot; + line = line + " -sysroot " + sysroot; } catch (IOException ignore) {} diff --git a/frysk-core/frysk/debuginfo/ChangeLog b/frysk-core/frysk/debuginfo/ChangeLog index b2320e3..44c27b3 100644 --- a/frysk-core/frysk/debuginfo/ChangeLog +++ b/frysk-core/frysk/debuginfo/ChangeLog @@ -1,10 +1,14 @@ +2008-01-24 Stan Cox + + * DebugInfoFrame.java (getLine): Get sysroot via DwflCache.getSysroot. + 2008-01-24 Andrew Cagney * DwarfRegisterMapFactory.java: Update; Register moved to frysk.isa.registers. * LocationExpression.java: Ditto. * ObjectDeclarationSearchEngine.java: Ditto. - * RegisterPiece.java: Ditt. + * RegisterPiece.java: Ditto. 2008-01-23 Andrew Cagney diff --git a/frysk-core/frysk/debuginfo/DebugInfoFrame.java b/frysk-core/frysk/debuginfo/DebugInfoFrame.java index f1d8682..1cd2430 100644 --- a/frysk-core/frysk/debuginfo/DebugInfoFrame.java +++ b/frysk-core/frysk/debuginfo/DebugInfoFrame.java @@ -48,7 +48,6 @@ import lib.dwfl.Dwfl; import lib.dwfl.DwflDieBias; import lib.dwfl.DwflLine; import frysk.dwfl.DwflCache; -import frysk.hpd.DbgVariables; import frysk.rt.LineXXX; import frysk.scopes.SourceLocation; import frysk.scopes.Scope; @@ -176,21 +175,17 @@ public class DebugInfoFrame extends FrameDecorator { // be decremented by one. DwflLine dwflLine = dwfl.getSourceLine(getAdjustedAddress()); if (dwflLine != null) { + File sysroot = DwflCache.getSysroot(this.getTask()); File f = new File(dwflLine.getSourceFile()); if (! f.isAbsolute()) { // The file refers to a path relative to the // compilation directory; so prepend the path to // that directory in front of it. - File parent = new File(dwflLine.getCompilationDir()); + File parent = new File(sysroot, dwflLine.getCompilationDir()); f = new File(parent, dwflLine.getSourceFile()); } - else { - String sysroot = DbgVariables.getStringValue("SYSROOT"); - if (sysroot.length() > 0) { - File parent = new File(sysroot); - f = new File(parent, dwflLine.getSourceFile()); - } - } + else + f = new File(sysroot, f.getPath()); this.line = new SourceLocation(f, dwflLine.getLineNum(), dwflLine.getColumn()); } diff --git a/frysk-core/frysk/dwfl/ChangeLog b/frysk-core/frysk/dwfl/ChangeLog index 37c57c7..c3c1e1f 100644 --- a/frysk-core/frysk/dwfl/ChangeLog +++ b/frysk-core/frysk/dwfl/ChangeLog @@ -1,3 +1,12 @@ +2008-01-24 Stan Cox + + * DwflCache.java (Mod.sysroot): New. + (sysrootMap): New. + (getRelativeSysRoot): Change to use java.io.File. + (getDwfl): Set Mod.sysroot. + (setSysroot): New. + (getSysroot): New. + 2008-01-18 Phil Muldoon * DwflFactory.java (updateDwfl): Do not overrun map diff --git a/frysk-core/frysk/dwfl/DwflCache.java b/frysk-core/frysk/dwfl/DwflCache.java index 2788446..433e366 100644 --- a/frysk-core/frysk/dwfl/DwflCache.java +++ b/frysk-core/frysk/dwfl/DwflCache.java @@ -39,8 +39,9 @@ package frysk.dwfl; -import frysk.hpd.DbgVariables; import frysk.proc.Task; + +import java.io.File; import java.util.Iterator; import java.util.WeakHashMap; import java.util.logging.Level; @@ -60,9 +61,11 @@ public class DwflCache static private class Mod { final Dwfl dwfl; int count; - Mod(Dwfl dwfl, int count) { + File sysroot; + Mod(Dwfl dwfl, int count, File sysroot) { this.dwfl = dwfl; this.count = count; + this.sysroot = sysroot; } } @@ -72,6 +75,11 @@ public class DwflCache private static WeakHashMap modMap = new WeakHashMap(); /** + * Map from a Task's executable to its sysroot. + */ + private static WeakHashMap sysrootMap = new WeakHashMap(); + + /** * Cache of all Dwfl objects. */ private static WeakHashMap allDwfls = new WeakHashMap(); @@ -87,39 +95,26 @@ public class DwflCache * It would be helpful if it also looked in /an/absolute/path/program.debug * so it could be given /sys/root/dir/usr/lib/debug/usr/bin. Lacking that we * need to generate a relative path that has the same effect. - * XXX: Change to use java.io.File? * * @param pathname of executable * @return a path where elfutils can find program.debug for separate debuginfo. */ - private static String getSysRoot(String execPathParm) { - String sysRoot = DbgVariables.getStringValue("SYSROOT"); - if (sysRoot.length() == 0) - return "/usr/lib/debug"; - StringBuffer execPath = new StringBuffer(execPathParm); - StringBuffer relSysRoot = new StringBuffer("/.."); - execPath.replace(0, sysRoot.length(), ""); - int slashidx = execPath.lastIndexOf("/"); - execPath.replace(slashidx, execPath.length(),""); - String nonSysRootPath = new String(execPath.toString()); - slashidx = execPath.lastIndexOf("/"); - while (slashidx >= 0) { - while (execPath.substring(slashidx).compareTo("/..") == 0) { - execPath.replace(slashidx, execPath.length(), ""); - slashidx = execPath.lastIndexOf("/"); - execPath.replace(slashidx, execPath.length(), ""); - slashidx = execPath.lastIndexOf("/"); - } - execPath.replace(slashidx, execPath.length(), ""); - slashidx = execPath.lastIndexOf("/"); - if (slashidx != 0) - relSysRoot.append("/.."); + private static File getRelativeSysRoot(String execPathParm, File sysroot) { + if (sysroot.getPath().equals("/")) + return new File("/usr/lib/debug"); + + File execFile = new File(execPathParm); + File parent = new File(execFile.getParent()); + StringBuffer relativePath = new StringBuffer(""); + StringBuffer exePath = new StringBuffer(""); + while (! parent.getPath().equals(sysroot.getPath())) { + exePath.insert(0, "/" + parent.getName()); + relativePath.append("../"); + parent = new File(parent.getParent()); } - relSysRoot.deleteCharAt(0); - relSysRoot.append("/usr/lib/debug/"); - relSysRoot.append(nonSysRootPath); - return relSysRoot.toString(); + File debugFile = new File(relativePath + "/usr/lib/debug/" + exePath); + return debugFile; } /** @@ -132,12 +127,16 @@ public class DwflCache logger.log(Level.FINE, "entering createDwfl, task: {0}\n", task); // If there is no dwfl for this task create one. - String relativeSysRoot = getSysRoot(task.getProc().getExe()); if (!modMap.containsKey(task)) { logger.log(Level.FINEST, "creating new dwfl for task {0}\n", task); - Dwfl dwfl = new Dwfl(relativeSysRoot); + String sysroot = (String)sysrootMap.get(task.getProc().getCommand()); + if (sysroot == null) + sysroot = "/"; + File sysrootFile = new File(sysroot); + File relativeSysroot = getRelativeSysRoot(task.getProc().getExe(), sysrootFile); + Dwfl dwfl = new Dwfl(relativeSysroot.getPath()); DwflFactory.updateDwfl(dwfl, task); - Mod mod = new Mod(dwfl, task.getMod()); + Mod mod = new Mod(dwfl, task.getMod(), sysrootFile); modMap.put(task, mod); // For cleanup, also save dwfl using Mod as a key (just need a @@ -158,6 +157,27 @@ public class DwflCache return mod.dwfl; } + /** + * set the sysroot corresponding to a {@link frysk.proc.Task}. + * + * @param task is the task. + * @param sysroot is this task's sysroot. + */ + public static void setSysroot(Task task, String sysroot) { + sysrootMap.put(task.getProc().getCommand(), sysroot); + } + + /** + * return a sysroot File for a {@link frysk.proc.Task}. + * + * @param task is the task. + * @return the sysroot file. + */ + public static File getSysroot(Task task) { + Mod mod = (Mod) modMap.get(task); + return mod.sysroot; + } + public static void clear() { modMap.clear(); for (Iterator i = allDwfls.values().iterator(); i.hasNext();) { diff --git a/frysk-core/frysk/hpd/AttachCommand.java b/frysk-core/frysk/hpd/AttachCommand.java index ce960e6..8556e5b 100644 --- a/frysk-core/frysk/hpd/AttachCommand.java +++ b/frysk-core/frysk/hpd/AttachCommand.java @@ -39,6 +39,7 @@ package frysk.hpd; +import frysk.dwfl.DwflCache; import frysk.proc.Proc; import frysk.proc.ProcId; import frysk.proc.Manager; @@ -67,7 +68,7 @@ class AttachCommand extends ParameterizedCommand { AttachCommand() { super("Attach to a running process.", - "attach ...", + "attach ... [ -sysroot Path ]", ("The attach command causes the debugger to attach to an" + " existing process(es), making it possible to continue" + " the process' execution under debugger control. The" @@ -76,9 +77,25 @@ class AttachCommand extends ParameterizedCommand { + " operation. It is the user's responsibility to ensure" + " that the process(es) actually is executing the specified" + " executable.")); + add(new CommandOption("sysroot", "pathname to use as a sysroot", + "Pathname") { + void parse(String args, Object options) { + ((Options)options).sysroot = args; + } + }); } + + private static class Options { + String sysroot = "/"; + } + Object options() { + return new Options(); + } + public void interpret(CLI cli, Input cmd, Object options) { + Options o = (Options)options; + if (cmd.size() == 0) { throw new InvalidCommandException("Missing process ID"); } @@ -100,6 +117,7 @@ class AttachCommand extends ParameterizedCommand { cli.outWriter.println(pid); continue; } + DwflCache.setSysroot(findProc.proc.getMainTask(), o.sysroot); cli.doAttach(findProc.proc); } } diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog index e0e7292..db01d4f 100644 --- a/frysk-core/frysk/hpd/ChangeLog +++ b/frysk-core/frysk/hpd/ChangeLog @@ -1,3 +1,13 @@ +2008-01-24 Stan Cox + + * AttachCommand.java (Options): New. Add -sysroot option. + (interpret): Set sysroot. + * CoreCommand.java: Likewise. + * LoadCommand.java: Likewise. + * ListCommand.java (interpret): Remove sysroot reference except for + "list function". + * DbgVariables.java (DbgVariables): Remove SYSROOT. + 2008-01-24 Rick Moseley * StartRun.java: Print command line for start/run. diff --git a/frysk-core/frysk/hpd/CoreCommand.java b/frysk-core/frysk/hpd/CoreCommand.java index 20ccbc5..37ca2c1 100644 --- a/frysk-core/frysk/hpd/CoreCommand.java +++ b/frysk-core/frysk/hpd/CoreCommand.java @@ -46,6 +46,7 @@ import java.util.List; import frysk.debuginfo.DebugInfo; import frysk.debuginfo.DebugInfoFrame; import frysk.debuginfo.DebugInfoStackFactory; +import frysk.dwfl.DwflCache; import frysk.proc.Manager; import frysk.proc.Proc; import frysk.proc.Task; @@ -60,19 +61,32 @@ public class CoreCommand extends ParameterizedCommand { boolean noExeOption = false; CoreCommand() { - super("Load a Corefile.", "core [ ] [ -noexe ]", - "Opens, loads and models corefile."); + super("Load a Corefile.", "core [ ] [ -noexe ]" + + "[ -sysroot Path ]", "Opens, loads and models corefile."); add(new CommandOption("noexe", "Do not attempt to load executable ") { void parse(String argument, Object options) { noExeOption = true; } }); + add(new CommandOption("sysroot", "pathname to use as a sysroot", + "Pathname") { + void parse(String args, Object options) { + ((Options)options).sysroot = args; + } + }); + } + private static class Options { + String sysroot = "/"; + } + Object options() { + return new Options(); } void interpret(CLI cli, Input cmd, Object options) { - + Options o = (Options)options; + Proc coreProc; LinuxCoreHost coreHost = null; @@ -128,6 +142,7 @@ public class CoreCommand extends ParameterizedCommand { .createVirtualStackTrace(task); cli.setTaskFrame(task, frame); cli.setTaskDebugInfo(task, new DebugInfo(frame)); + DwflCache.setSysroot(task, o.sysroot); } // Finally, done. diff --git a/frysk-core/frysk/hpd/DbgVariables.java b/frysk-core/frysk/hpd/DbgVariables.java index 23df999..9516abc 100644 --- a/frysk-core/frysk/hpd/DbgVariables.java +++ b/frysk-core/frysk/hpd/DbgVariables.java @@ -113,7 +113,6 @@ public class DbgVariables { vars.put("MAX_LEVELS", new Value(VARTYPE_INT, new Integer(20))); vars.put("MAX_LIST", new Value(VARTYPE_INT, new Integer(20))); vars.put("PROMPT", new Value(VARTYPE_STRING, "(frysk) ")); - vars.put("SYSROOT", new Value(VARTYPE_STRING, "")); vars.put("SOURCE_PATH", new Value(VARTYPE_STRING, "")); vars.put("EXECUTABLE_PATH", new Value(VARTYPE_STRING, "./:" + System.getenv("PATH"))); } @@ -161,7 +160,7 @@ public class DbgVariables { return ((Integer)vars.get(var)).intValue(); } - public static String getStringValue(String var) { + public String getStringValue(String var) { if (vars.size() == 0) return ""; else diff --git a/frysk-core/frysk/hpd/ListCommand.java b/frysk-core/frysk/hpd/ListCommand.java index 13c10aa..72a4e24 100644 --- a/frysk-core/frysk/hpd/ListCommand.java +++ b/frysk-core/frysk/hpd/ListCommand.java @@ -52,6 +52,7 @@ import lib.dwfl.DwarfDie; import lib.dwfl.DwTag; import frysk.debuginfo.DebugInfoFrame; import frysk.debuginfo.DebugInfo; +import frysk.dwfl.DwflCache; import frysk.proc.Task; /** @@ -120,13 +121,10 @@ class ListCommand extends ParameterizedCommand { } if (funcDie.getTag().hashCode() == DwTag.SUBPROGRAM_) { line = (int)funcDie.getDeclLine(); - String sysRoot = DbgVariables.getStringValue("SYSROOT"); - if (sysRoot.length() > 0) { - File parent = new File(sysRoot); - file = new File(parent, funcDie.getDeclFile().getName()); - } - else - file = funcDie.getDeclFile(); + File sysroot = DwflCache.getSysroot(frame.getTask()); + file = funcDie.getDeclFile(); + if (file.isAbsolute()) + file = new File(sysroot.getPath(), file.getPath()); } else { cli.addMessage("function " + cmd.parameter(0) + " not found.", @@ -152,11 +150,6 @@ class ListCommand extends ParameterizedCommand { if (file == null) { if (frame.getLine() != SourceLocation.UNKNOWN) { file = (frame.getLine()).getFile(); - String sysRoot = DbgVariables.getStringValue("SYSROOT"); - if (sysRoot.length() > 0) { - File parent = new File(sysRoot); - file = new File(parent, file.getAbsolutePath()); - } if (file == null) { cli.addMessage("No symbol table is available.", Message.TYPE_NORMAL); diff --git a/frysk-core/frysk/hpd/LoadCommand.java b/frysk-core/frysk/hpd/LoadCommand.java index 0d2bb30..f2ff5ae 100644 --- a/frysk-core/frysk/hpd/LoadCommand.java +++ b/frysk-core/frysk/hpd/LoadCommand.java @@ -44,6 +44,7 @@ import java.util.Iterator; import frysk.debuginfo.DebugInfo; import frysk.debuginfo.DebugInfoFrame; import frysk.debuginfo.DebugInfoStackFactory; +import frysk.dwfl.DwflCache; import frysk.proc.Host; import frysk.proc.dead.LinuxExeHost; import frysk.proc.Manager; @@ -54,43 +55,58 @@ import java.util.List; /** * LoadCommand handles the "load path-to-executable" command on the fhpd * commandline. - * + * */ public class LoadCommand extends ParameterizedCommand { LoadCommand() { super("load", - "load path-to-executable", + "load path-to-executable [ -sysroot Path ]", "The load command lets the user examine information about" + " an executable file without actually running it. An" - + " executble must be loaded with this command before it" + + " executable must be loaded with this command before it" + " can be run with either the 'start' or 'run' command." + " No arguments are entered here, they are passed to the" + " process via the 'start'/'run' commands."); + add(new CommandOption("sysroot", "pathname to use as a sysroot", + "Pathname") { + void parse(String args, Object options) { + ((Options)options).sysroot = args; + } + }); + } + + private static class Options { + String sysroot = "/"; + } + Object options() { + return new Options(); } public void interpret(CLI cli, Input cmd, Object options) { + Options o = (Options)options; + if (cmd.size() > 2) { throw new InvalidCommandException("Too many parameters"); } else if (cmd.size() < 1) { - throw new InvalidCommandException("missing arguments"); - } - + throw new InvalidCommandException("missing arguments"); + } + File executableFile = new File(cmd.parameter(0)); if (!executableFile.exists() || !executableFile.canRead() || !executableFile.isFile()) { throw new InvalidCommandException - ("File does not exist or is not readable or is not a file."); hooks/post-receive -- frysk system monitor/debugger