public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: frysk-core/frysk/hpd/ChangeLog
Date: Tue, 26 Feb 2008 16:54:00 -0000	[thread overview]
Message-ID: <20080226165454.22041.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  4454bcc2dd04291821f28d4e17044ab2d1d659b6 (commit)
      from  491d4ec7ba3a8e3878cca1c9f916ca7069d79469 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 4454bcc2dd04291821f28d4e17044ab2d1d659b6
Author: Andrew Cagney <cagney@redhat.com>
Date:   Tue Feb 26 11:42:11 2008 -0500

    frysk-core/frysk/hpd/ChangeLog
    2008-02-25  Andrew Cagney  <cagney@redhat.com>
    
    	* CoreCommand.java: Use LinuxCoreFactory.
    	(getHost(File,File.boolean)): Delete; replaced by LinuxCoreFactory.
    	(parseCommandLine(Input)): Fold into interpret.
    
    frysk-core/frysk/proc/ChangeLog
    2008-02-26  Andrew Cagney  <cagney@redhat.com>
    
    	* ProcBlockAction.java: Use LinuxCoreFactory.
    
    frysk-core/frysk/proc/dead/ChangeLog
    2008-02-26  Andrew Cagney  <cagney@redhat.com>
    
    	* LinuxCoreInfo.java: New.  Fold in LinuxCoreFactory,
    	LinuxCoreHost, LinuxCoreProc, and LinuxCoreTask.
    	* SOLibMapBuilder.java (construct(Elf,File,long)): New.
    	(openElf(File)): Delete.
    	* TestLinuxCore.java: Update.
    	* LinuxCoreFactory.java: Update.
    	* LinuxCoreHost.java: Update.
    	* LinuxCoreProc.java: Update.
    	* LinuxCoreTask.java: Update.
    
    frysk-core/frysk/util/ChangeLog
    2008-02-26  Andrew Cagney  <cagney@redhat.com>
    
    	* Util.java: Use LinuxCoreFactory.
    	* TestCoredumpAction.java: Ditto.
    	* TestStackTraceAction.java: Ditto.
    
    frysk-sys/frysk/rsl/ChangeLog
    2008-02-26  Andrew Cagney  <cagney@redhat.com>
    
    	* Log.java: Add more log methods.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/hpd/ChangeLog                   |    4 +
 frysk-core/frysk/hpd/CoreCommand.java            |  196 +++----
 frysk-core/frysk/proc/ChangeLog                  |    4 +
 frysk-core/frysk/proc/ProcBlockAction.java       |   33 +-
 frysk-core/frysk/proc/dead/ChangeLog             |   12 +
 frysk-core/frysk/proc/dead/LinuxCoreFactory.java |   94 +--
 frysk-core/frysk/proc/dead/LinuxCoreHost.java    |  167 +-----
 frysk-core/frysk/proc/dead/LinuxCoreInfo.java    |  685 +++++++++++++++++++
 frysk-core/frysk/proc/dead/LinuxCoreProc.java    |  769 +---------------------
 frysk-core/frysk/proc/dead/SOLibMapBuilder.java  |   24 +-
 frysk-core/frysk/proc/dead/TestLinuxCore.java    |  242 +++----
 frysk-core/frysk/util/ChangeLog                  |    6 +
 frysk-core/frysk/util/TestCoredumpAction.java    |   27 +-
 frysk-core/frysk/util/TestStackTraceAction.java  |    8 +-
 frysk-core/frysk/util/Util.java                  |   11 +-
 frysk-sys/frysk/rsl/ChangeLog                    |    2 +
 frysk-sys/frysk/rsl/Log.java                     |   10 +
 17 files changed, 992 insertions(+), 1302 deletions(-)
 create mode 100644 frysk-core/frysk/proc/dead/LinuxCoreInfo.java

First 500 lines of diff:
diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog
index 5bf8a8a..9410dcb 100644
--- a/frysk-core/frysk/hpd/ChangeLog
+++ b/frysk-core/frysk/hpd/ChangeLog
@@ -9,6 +9,10 @@
 
 2008-02-25  Andrew Cagney  <cagney@redhat.com>
 
+	* CoreCommand.java: Use LinuxCoreFactory.
+	(getHost(File,File.boolean)): Delete; replaced by LinuxCoreFactory.
+	(parseCommandLine(Input)): Fold into interpret.
+
 	* LoadCommand.java: Use LinuxExeFactory.
 
 2008-02-21  Nurdin Premji  <npremji@redhat.com>
diff --git a/frysk-core/frysk/hpd/CoreCommand.java b/frysk-core/frysk/hpd/CoreCommand.java
index 37ca2c1..f7dbfc0 100644
--- a/frysk-core/frysk/hpd/CoreCommand.java
+++ b/frysk-core/frysk/hpd/CoreCommand.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2007, 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -47,138 +47,98 @@ 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;
-import frysk.proc.dead.LinuxCoreHost;
+import frysk.proc.dead.LinuxCoreFactory;
+import java.io.IOException;
+import frysk.proc.dead.LinuxCoreProc;
 
 public class CoreCommand extends ParameterizedCommand {
 
-	File coreFile = null;
-
-	File exeFile = null;
-
-	boolean noExeOption = false;
-
-	CoreCommand() {
-		super("Load a Corefile.", "core <core-file> [ <executable> ] [ -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;
-
-		// If > 2 parameter, then too many parameters.
-		if (cmd.size() > 2) {
-			throw new InvalidCommandException(
-					"Too many parameters, a maximum of two should be specified.");
-		}
-
-		// If < 1 parameter, then not enough parameters.
-		if (cmd.size() < 1) {
-			throw new InvalidCommandException(
-					"Please specify a corefile with the core command");
-		}
-
-		// Command line seems, sane parse.
-		parseCommandLine(cmd);
-
-		// Does the corefile exist?
-		if ((!coreFile.exists()) || (!coreFile.canRead()
-			|| coreFile.isDirectory()))
-			throw new InvalidCommandException(
-					"No core file found, or cannot read corefile");
-
-		// Build Core. Move any exceptions up to cli and print to user.
-		coreHost = getHost(coreFile, exeFile, noExeOption);
-
-		// Get the core proc.
-		coreProc = coreHost.getSoleProcFIXME();
-
-		// Error out if no exe found, and -noexe option specified
-		if ((noExeOption == false) && (coreHost.getStatus().hasExe == false)) {
-			cli.addMessage(
-					"Could not find executable: '"
-					+ coreProc.getExe()+  "' specified for corefile. "
-					+ "You can specify one with the core command. E.g: core core.file yourexefile. Alternatively "
-					+ "you can tell fhpd to ignore the executable with -noexe. E.g core core.file -noexe. No "
-					+ "corefile has been loaded at this time.",
-					Message.TYPE_ERROR);
-			return;
-		}
+    private static class Options {
+	boolean loadMetaData = true;
+	String sysroot = "/";
+    }
+    Object options() {
+	return new Options();
+    }
 
-		// All checks are done. Host is built. Now start reserving space in the sets
-		int procID = cli.idManager.reserveProcID();
-		cli.idManager.manageProc(coreProc, procID);
-		
+    CoreCommand() {
+	super("Load a Corefile.",
+	      "core <core-file> [ <executable> ] [ -noexe ]"
+	      + "[ -sysroot Path ]", "Opens, loads and models corefile.");
 
-		// Build debug info for each task and frame.
-		Iterator foo = cli.targetset.getTasks();
-		while (foo.hasNext()) {
-			Task task = (Task) foo.next();
-			DebugInfoFrame frame = DebugInfoStackFactory
-					.createVirtualStackTrace(task);
-			cli.setTaskFrame(task, frame);
-			cli.setTaskDebugInfo(task, new DebugInfo(frame));
-			DwflCache.setSysroot(task, o.sysroot);
+	add(new CommandOption("noexe", "Do not attempt to load executable ") {
+		void parse(String argument, Object options) {
+		    ((Options)options).loadMetaData = false;
 		}
-
-		// Finally, done.
-		cli.addMessage("Attached to core file: " + cmd.parameter(0),
-				Message.TYPE_NORMAL);
-		// See if there was an executable specified
-		if (coreHost.getStatus().hasExe == false)
-		    return;
-		synchronized (cli) {
-		    cli.getCoreProcs().put(coreProc, new Integer(procID));
+	    });
+	add(new CommandOption("sysroot", "pathname to use as a sysroot",
+			      "Pathname") {
+		void parse(String args, Object options) {
+		    ((Options)options).sysroot = args;
 		}
+	    });
+    }
 
+    void interpret(CLI cli, Input cmd, Object optionsObject) {
+	Options options = (Options)optionsObject;
+	File coreFile;
+	File exeFile;
+
+	switch (cmd.size()) {
+	case 0:
+	    throw new InvalidCommandException
+		("Please specify a corefile with the core command");
+	case 1:
+	    // <core>
+	    coreFile = new File(cmd.parameter(0));
+	    exeFile = null;
+	    break;
+	case 2:
+	    coreFile = new File(cmd.parameter(0));
+	    exeFile = new File(cmd.parameter(1));
+	    break;
+	default:
+	    throw new InvalidCommandException
+		("Too many parameters, a maximum of two should be specified.");
 	}
 
-	// Build Correct Host on options.
-	private LinuxCoreHost getHost(File coreFile, File executable, boolean loadExe) {
-		LinuxCoreHost coreHost = null;
-		if (executable == null)
-			if (!loadExe)
-				coreHost = new LinuxCoreHost(Manager.eventLoop, coreFile);
-			else
-				coreHost = new LinuxCoreHost(Manager.eventLoop, coreFile, null);
-		else
-			coreHost = new LinuxCoreHost(Manager.eventLoop, coreFile, executable);
+	// Make paths canonical (keeps elfutils working).
+	try {
+	    coreFile = coreFile.getCanonicalFile();
+	    if (exeFile != null)
+		exeFile = exeFile.getCanonicalFile();
+	} catch (IOException e) {
+	    throw new RuntimeException(e);
+	}
 
-		return coreHost;
+	// Build Core. Move any exceptions up to cli and print to user.
+	LinuxCoreProc coreProc
+	    = LinuxCoreFactory.createProc(coreFile, exeFile,
+					  options.loadMetaData);
+
+	// All checks are done. Host is built. Now start reserving
+	// space in the sets.
+	int procID = cli.idManager.reserveProcID();
+	cli.idManager.manageProc(coreProc, procID);
+
+	// Build debug info for each task and frame.
+	for (Iterator i = cli.targetset.getTasks(); i.hasNext(); ) {
+	    Task task = (Task) i.next();
+	    DebugInfoFrame frame = DebugInfoStackFactory
+		.createVirtualStackTrace(task);
+	    cli.setTaskFrame(task, frame);
+	    cli.setTaskDebugInfo(task, new DebugInfo(frame));
+	    DwflCache.setSysroot(task, options.sysroot);
 	}
 
-	// Parse the option commandline
-	private void parseCommandLine(Input cli) {
-		coreFile = new File(cli.parameter(0));
-		if (cli.size() == 1)
-			return;
-		else
-			exeFile = new File(cli.parameter(1));
+	// Finally, done.
+	cli.addMessage("Attached to core file: " + cmd.parameter(0),
+		       Message.TYPE_NORMAL);
+	synchronized (cli) {
+	    cli.getCoreProcs().put(coreProc, new Integer(procID));
 	}
+    }
 
     int completer(CLI cli, Input input, int cursor, List completions) {
 	return CompletionFactory.completeFileName(cli, input, cursor,
diff --git a/frysk-core/frysk/proc/ChangeLog b/frysk-core/frysk/proc/ChangeLog
index d0e9ac2..cf89fb9 100644
--- a/frysk-core/frysk/proc/ChangeLog
+++ b/frysk-core/frysk/proc/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-26  Andrew Cagney  <cagney@redhat.com>
+
+	* ProcBlockAction.java: Use LinuxCoreFactory.
+
 2008-02-20  Phil Muldoon  <pmuldoon@redhat.com>
 
 	* TaskObserver.java: Add watch interface.
diff --git a/frysk-core/frysk/proc/ProcBlockAction.java b/frysk-core/frysk/proc/ProcBlockAction.java
index dadbcc3..52c6f24 100644
--- a/frysk-core/frysk/proc/ProcBlockAction.java
+++ b/frysk-core/frysk/proc/ProcBlockAction.java
@@ -47,7 +47,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import frysk.isa.signals.Signal;
 import frysk.event.Event;
-import frysk.proc.dead.LinuxCoreHost;
+import frysk.proc.dead.LinuxCoreFactory;
 
 /**
  * This class blocks all of the threads in a process and performs a
@@ -167,26 +167,17 @@ public class ProcBlockAction
 	    });
     }
   
-  public ProcBlockAction (File coreFile) {
-    LinuxCoreHost core = new LinuxCoreHost(Manager.eventLoop, coreFile);
-
-    Manager.eventLoop.runPending();
-    proc = core.getSoleProcFIXME();
-    if (proc == null)
-        throw new RuntimeException("No proc in this corefile");
-
-    taskList = proc.getTasks();
-    
-    Iterator iterator = taskList.iterator();
-    
-    while (iterator.hasNext())
-      {
-        Task task = (Task) iterator.next();
-        action.existingTask(task);
-      }
-    
-    action.allExistingTasksCompleted();
-  }
+    public ProcBlockAction(File coreFile) {
+	Proc proc = LinuxCoreFactory.createProc(coreFile);
+	if (proc == null)
+	    throw new RuntimeException("No proc in this corefile");
+	taskList = proc.getTasks();
+	for (Iterator i = taskList.iterator(); i.hasNext(); ) {
+	    Task task = (Task) i.next();
+	    action.existingTask(task);
+	}
+	action.allExistingTasksCompleted();
+    }
 
   private void requestAdd ()
   {
diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog
index ac109e9..a94b903 100644
--- a/frysk-core/frysk/proc/dead/ChangeLog
+++ b/frysk-core/frysk/proc/dead/ChangeLog
@@ -1,3 +1,15 @@
+2008-02-26  Andrew Cagney  <cagney@redhat.com>
+
+	* LinuxCoreInfo.java: New.  Fold in LinuxCoreFactory,
+	LinuxCoreHost, LinuxCoreProc, and LinuxCoreTask.
+	* SOLibMapBuilder.java (construct(Elf,File,long)): New.
+	(openElf(File)): Delete.
+	* TestLinuxCore.java: Update.
+	* LinuxCoreFactory.java: Update.
+	* LinuxCoreHost.java: Update.
+	* LinuxCoreProc.java: Update.
+	* LinuxCoreTask.java: Update.
+
 2008-02-26  Phil Muldoon  <pmuldoon@redhat.com>
 
 	* CorefileBytebuffer.java (peek): Account for segments
diff --git a/frysk-core/frysk/proc/dead/LinuxCoreFactory.java b/frysk-core/frysk/proc/dead/LinuxCoreFactory.java
index 1cb6eca..e291cf8 100644
--- a/frysk-core/frysk/proc/dead/LinuxCoreFactory.java
+++ b/frysk-core/frysk/proc/dead/LinuxCoreFactory.java
@@ -40,14 +40,6 @@
 package frysk.proc.dead;
 
 import java.io.File;
-import lib.dwfl.Elf;
-import lib.dwfl.ElfCommand;
-import lib.dwfl.ElfData;
-import lib.dwfl.ElfEHeader;
-import lib.dwfl.ElfPHeader;
-import lib.dwfl.ElfPrpsinfo;
-import frysk.proc.Proc;
-import frysk.rsl.Log;
 
 /**
  * Data needed to construct a core file; shared between the core Host,
@@ -55,11 +47,6 @@ import frysk.rsl.Log;
  */
 
 public class LinuxCoreFactory {
-    private static final Log fine = Log.fine(LinuxCoreFactory.class);
-
-    static Elf core;
-    static Elf exe;
-
     /**
      * Construct the core file; if the EXE is non-null use it for
      * meta-data; otherwise use the executable extracted from the
@@ -67,63 +54,28 @@ public class LinuxCoreFactory {
      *
      * All File paths <b>must</b> be canonical.
      */
-    public static Proc create(File coreFile, File exeFile,
-			      boolean includeMetaData) {
-	try {
-	    // Open the core file; validate it.
-	    core = new Elf(coreFile, ElfCommand.ELF_C_READ);
-	    ElfEHeader eHeader = core.getEHeader();
-	    if (eHeader.type != ElfEHeader.PHEADER_ET_CORE) {
-		throw new RuntimeException("'" + coreFile
-					   + "' is not a corefile.");
-	    }
-	
-	    // Find the note section; there is only ever one note
-	    // section and it must be present.
-	    ElfData noteData = null;
-	    for (int i = 0; i < eHeader.phnum; i++) {
-		// Test if pheader is of types notes..
-		ElfPHeader pHeader = core.getPHeader(i);
-		if (pHeader.type == ElfPHeader.PTYPE_NOTE) {
-		    // if so, copy, break an leave.
-		    noteData = core.getRawData(pHeader.offset,
-					       pHeader.filesz);
-		    break;
-		}
-	    }
-	    if (noteData == null)
-		throw new RuntimeException("'" + coreFile
-					   + "' is corrupt; no note section");
-	    
-	    // Extract the pr/ps information from the note.
-	    ElfPrpsinfo prpsInfo = ElfPrpsinfo.decode(noteData);
-	    String[] args = prpsInfo.getPrPsargs().split(" ");
-	    fine.log("args", args);
-
-	    if (exeFile == null) {
-		// Only place to find full path + exe is in the args
-		// list. Remove ./ if present.
-		if (args.length > 0) {
-		    if (args[0].startsWith("./"))
-			exeFile = new File(args[0].substring(2));
-		    else
-			exeFile = new File(args[0]);
-		} else {
-		    exeFile = new File(prpsInfo.getPrFname());
-		}
-		fine.log("exe from core", exeFile);
-	    } else {
-		fine.log("exe for core", exeFile);
-	    }
-	    if (includeMetaData)
-		exe = new Elf(exeFile, ElfCommand.ELF_C_READ);
-
-	    return null;
-	} finally { 
-	    if (core != null)
-		core.close();
-	    if (exe != null)
-		exe.close();
-	}
+    public static LinuxCoreProc createProc(File coreFile, File exeFile,
+					   boolean extendedMetaData) {
+	LinuxCoreInfo core = new LinuxCoreInfo(coreFile, exeFile,
+					       extendedMetaData);
+	LinuxCoreHost host = new LinuxCoreHost(core);
+	return host.getProc();
+    }
+    /**
+     * Construct a core file without extended meta data.
+     *
+     * All File paths <b>must</b> be canonical.
+     */
+    public static LinuxCoreProc createProc(File coreFile) {
+	return createProc(coreFile, null, false);
+    }
+    /**
+     * Construct a core file with extended meta data taken from the
+     * executable.
+     *
+     * All File paths <b>must</b> be canonical.
+     */
+    public static LinuxCoreProc createProc(File coreFile, File exeFile) {
+	return createProc(coreFile, exeFile, true);
     }
 }
diff --git a/frysk-core/frysk/proc/dead/LinuxCoreHost.java b/frysk-core/frysk/proc/dead/LinuxCoreHost.java
index feaeeba..1807ec1 100644
--- a/frysk-core/frysk/proc/dead/LinuxCoreHost.java
+++ b/frysk-core/frysk/proc/dead/LinuxCoreHost.java
@@ -39,170 +39,25 @@
 
 package frysk.proc.dead;
 
-import frysk.event.EventLoop;
-import java.util.LinkedList;
-import java.util.List;
 import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-import lib.dwfl.Elf;
-import lib.dwfl.ElfCommand;
-import lib.dwfl.ElfData;
-import lib.dwfl.ElfEHeader;
-import lib.dwfl.ElfPHeader;
-import lib.dwfl.ElfPrpsinfo;
-import frysk.proc.Proc;
-import frysk.proc.ProcId;
 
 public class LinuxCoreHost extends DeadHost {
+    private final LinuxCoreProc proc;
+    private final File coreFile;
 
-    CorefileStatus status = new CorefileStatus();
-
-    boolean hasRefreshed = false;
-
-    boolean exeSetToNull = false;
-
-    protected File coreFile = null;
-
-    protected File exeFile = null;
-
-    Elf corefileElf;
-
-    EventLoop eventLoop;
-
-    private LinuxCoreHost(EventLoop eventLoop, File coreFile, boolean doRefresh) {
-
-	try {
-	    this.coreFile = coreFile.getCanonicalFile();
-	} catch (IOException e) {
-	    throw new RuntimeException(e);
-	}
-	this.eventLoop = eventLoop;
-	this.corefileElf = new Elf(coreFile, ElfCommand.ELF_C_READ);
-
-	if ((corefileElf.getEHeader() == null) || 
-	    (corefileElf.getEHeader().type != ElfEHeader.PHEADER_ET_CORE)) {
-	    this.corefileElf.close();
-	    throw new RuntimeException("'" + this.getName()


hooks/post-receive
--
frysk system monitor/debugger


             reply	other threads:[~2008-02-26 16:54 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-26 16:54 cagney [this message]
  -- strict thread matches above, loose matches on Subject: below --
2008-06-06 19:31 swagiaal
2008-03-17 19:09 cagney
2008-03-03 23:09 cagney
2008-02-25 17:17 cagney
2008-01-08 21:41 cagney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080226165454.22041.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).