public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Simplify corefile task creation (work with latest bash).
@ 2008-02-21  3:34 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-02-21  3:34 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  90ee18a041aa5c6d3306ac716d6bda587d0bb7c0 (commit)
      from  caffa28dbf44f934103b9f00eeea11e15ce97581 (commit)

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

- Log -----------------------------------------------------------------
commit 90ee18a041aa5c6d3306ac716d6bda587d0bb7c0
Author: Andrew Cagney <cagney@redhat.com>
Date:   Wed Feb 20 22:33:44 2008 -0500

    Simplify corefile task creation (work with latest bash).
    
    frysk-core/frysk/bindir/ChangeLog
    2008-02-20  Andrew Cagney  <cagney@redhat.com>
    
    	* TestFexe.java: Prevent bash execing fexe.
    
    frysk-core/frysk/proc/dead/ChangeLog
    2008-02-20  Andrew Cagney  <cagney@redhat.com>
    
    	* LinuxCoreProc.java (constructAuxv(ElfData)): New.
    	(constructTasks(ElfData,ISA)): Replace sendRefresh.
    
    frysk-sys/frysk/rsl/ChangeLog
    2008-02-20  Andrew Cagney  <cagney@redhat.com>
    
    	* Log.java: Include the TID.PID in the log message.

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

Summary of changes:
 frysk-core/frysk/bindir/ChangeLog             |    4 +
 frysk-core/frysk/bindir/TestFexe.java         |   12 ++-
 frysk-core/frysk/proc/dead/ChangeLog          |    3 +
 frysk-core/frysk/proc/dead/LinuxCoreProc.java |  184 ++++++++++++-------------
 frysk-sys/frysk/rsl/ChangeLog                 |    4 +
 frysk-sys/frysk/rsl/Log.java                  |   20 ++-
 6 files changed, 125 insertions(+), 102 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
index 5ead415..4c50ee9 100644
--- a/frysk-core/frysk/bindir/ChangeLog
+++ b/frysk-core/frysk/bindir/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-20  Andrew Cagney  <cagney@redhat.com>
+
+	* TestFexe.java: Prevent bash execing fexe.
+
 2008-02-20  Teresa Thomas  <tthomas@redhat.com>
 
 	* fexe.java: Refactor to use ProcStopUtil.
diff --git a/frysk-core/frysk/bindir/TestFexe.java b/frysk-core/frysk/bindir/TestFexe.java
index 53b6f77..50c5c23 100644
--- a/frysk-core/frysk/bindir/TestFexe.java
+++ b/frysk-core/frysk/bindir/TestFexe.java
@@ -47,7 +47,15 @@ import java.io.File;
 public class TestFexe extends TestLib {
     public void testExeOfPid() {
 	File fexe = Config.getBinFile("fexe");
-	TearDownExpect e = new TearDownExpect(fexe.getAbsolutePath () + " $$");
-	e.expect(fexe + "\r\n");
+	// XXX: Some versions of bash (e.g., bash-3.2-20.fc8.x86_64)
+	// will exec, instead of fork, a program if it is the only
+	// command.  This leads to $$ pointing at the fexe process.
+	// Work around it by forcing bash to execute two commands.
+	TearDownExpect e = new TearDownExpect(new String[] {
+		"/bin/bash",
+		"-c",
+		fexe.getAbsolutePath() + " $$ ; echo \"\""
+	    });
+	e.expect("/bin/bash" + "\r\n");
     }
 }
diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog
index e818f2b..a98393b 100644
--- a/frysk-core/frysk/proc/dead/ChangeLog
+++ b/frysk-core/frysk/proc/dead/ChangeLog
@@ -1,5 +1,8 @@
 2008-02-20  Andrew Cagney  <cagney@redhat.com>
 
+	* LinuxCoreProc.java (constructAuxv(ElfData)): New.
+	(constructTasks(ElfData,ISA)): Replace sendRefresh.
+
 	* LinuxCoreFactory.java: New file. Code from LinuxCoreHost,
 	LinuxCoreProc, and LinuxCoreTask.
 	
diff --git a/frysk-core/frysk/proc/dead/LinuxCoreProc.java b/frysk-core/frysk/proc/dead/LinuxCoreProc.java
index 4f62d03..2e53c75 100644
--- a/frysk-core/frysk/proc/dead/LinuxCoreProc.java
+++ b/frysk-core/frysk/proc/dead/LinuxCoreProc.java
@@ -55,7 +55,6 @@ import frysk.sys.proc.AuxvBuilder;
 import java.util.Iterator;
 import java.io.File;
 import java.util.ArrayList;
-import frysk.proc.Task;
 import frysk.proc.Auxv;
 import frysk.proc.MemoryMap;
 import frysk.isa.ISA;
@@ -64,7 +63,6 @@ import frysk.rsl.Log;
 
 public class LinuxCoreProc extends DeadProc {
   
-    private ElfData elfData = null;
     private ElfPrpsinfo elfProc = null;
     private CorefileByteBuffer memory = null;
     private File corefileBackEnd = null;
@@ -77,12 +75,12 @@ public class LinuxCoreProc extends DeadProc {
     private static final Log fine = Log.fine(LinuxCoreProc.class);
 
 
-    public LinuxCoreProc(ElfData data, LinuxCoreHost host, int pid) {
+    public LinuxCoreProc(ElfData noteSection, LinuxCoreHost host, int pid) {
 	super(host, null, pid);
-	this.elfData = data;
-	this.elfProc = ElfPrpsinfo.decode(elfData);
+	this.elfProc = ElfPrpsinfo.decode(noteSection);
 	this.corefileBackEnd = host.coreFile;
-	fine.log(this, "LinuxCoreProc elfData", data, "host", host, "pid", pid);
+	fine.log(this, "LinuxCoreProc noteSection", noteSection,
+		 "host", host, "pid", pid);
 
 	// Executable is null (non-specified), find the executable
 	// as it is written in the corefile. 
@@ -93,8 +91,75 @@ public class LinuxCoreProc extends DeadProc {
 	
 	}
 	this.exefileBackEnd = host.exeFile;
+	this.auxv = constructAuxv(noteSection);
+	constructTasks(noteSection);
     }	
 
+    public void sendRefresh() {
+	// Do nothing; already done.
+    }
+
+    /**
+     * Find and create the core tasks.
+     */
+    private void constructTasks(ElfData noteSection) {
+ 	ISA isa = ElfMap.getISA(noteSection.getParent().getEHeader());
+	ElfPrstatus elfTasks[] = null;
+	ElfPrFPRegSet elfFPRegs[] = null;
+	ElfPrXFPRegSet elfXFPRegs[] = null;
+	int fpCount = 0;
+
+	// Decode both task and floating point registers
+	elfTasks = ElfPrstatus.decode(noteSection);
+	elfFPRegs = ElfPrFPRegSet.decode(noteSection);
+	elfXFPRegs = ElfPrXFPRegSet.decode(noteSection);
+    
+	// Two methods of whether Floating Point note data exists.
+	// In userland generated core-dumps there is no way to test
+	// if floating point data operations have actually occurred, so
+	// programs like fcore/gcore will always write NT_FPREGSET note data
+	// per thread regardless. On kernel generated corefiles, the
+	// kernel micro-optimizes whether NT_FPREGSET note data is written
+	// per thread by analyzing to see if that thread has performed
+	// Floating Point operations. If it has, it will write
+	// NT_FPREGSET, and if it hasn't it won't.
+
+	// Account for both these scenarios, here.
+    
+	if (elfFPRegs.length == elfTasks.length) {
+	    // The number of NT_FPREGSET note objects is equal to the
+	    // the number of NT_PRSTATUS note objects, then no do not
+	    // account for mismatch.
+	    for (int i=0; i<elfTasks.length; i++) {
+		// xfpregsets accompany fp registers on a 1:1 basis
+		// but only on some architectures.
+		ElfPrXFPRegSet xregSet = null;
+		if (elfXFPRegs.length > 0)
+		    xregSet = elfXFPRegs[i];
+		new LinuxCoreTask(LinuxCoreProc.this, elfTasks[i], elfFPRegs[i],
+				  xregSet, isa);
+	    }
+	} else {
+	    // Otherwise add only NT_FPREGSET data if pr_fpvalid is >
+	    // 0. This value is not reliable on userland kernels (gdb
+	    // always sets it to 0) so if we are here, this is a
+	    // micro-optimized kernel where that flag is set
+	    // correctly.
+	    for (int i=0; i<elfTasks.length; i++) {
+		if (elfTasks[i].getPrFPValid() > 0) {
+		    // xfpregsets accompany fp registers on a 1:1
+		    // basis but only on some architectures.
+		    ElfPrXFPRegSet xregSet = null;
+		    if (elfXFPRegs.length > 0)
+			xregSet = elfXFPRegs[fpCount];
+		    new LinuxCoreTask(LinuxCoreProc.this, elfTasks[i], elfFPRegs[fpCount], xregSet, isa);
+		    fpCount++;
+		} else
+		    new LinuxCoreTask(LinuxCoreProc.this, elfTasks[i],  null, null, isa);
+	    }
+	}
+    }
+
     public String getCommand() {
 	fine.log(this,"getCommand()", elfProc.getPrFname());
 	return elfProc.getPrFname();
@@ -160,73 +225,6 @@ public class LinuxCoreProc extends DeadProc {
 	return memory;
     }
 
-    public void sendRefresh() {
-	// Find tasks. Refresh is a misnomer here as 
-	// Corefiles will never spawn new tasks beyond the
-	// original refresh, or will lose them. 
-
-	ElfPrstatus elfTasks[] = null;
-	ElfPrFPRegSet elfFPRegs[] = null;
-	ElfPrXFPRegSet elfXFPRegs[] = null;
-	int fpCount = 0;
-
-	// Decode both task and floating point registers
-	elfTasks = ElfPrstatus.decode(elfData);
-	elfFPRegs = ElfPrFPRegSet.decode(elfData);
-	elfXFPRegs = ElfPrXFPRegSet.decode(elfData);
-    
-	ISA isa = ElfMap.getISA(elfData.getParent().getEHeader());
-
-	// Two methods of whether Floating Point note data exists.
-	// In userland generated core-dumps there is no way to test
-	// if floating point data operations have actually occurred, so
-	// programs like fcore/gcore will always write NT_FPREGSET note data
-	// per thread regardless. On kernel generated corefiles, the
-	// kernel micro-optimizes whether NT_FPREGSET note data is written
-	// per thread by analyzing to see if that thread has performed
-	// Floating Point operations. If it has, it will write
-	// NT_FPREGSET, and if it hasn't it won't.
-
-	// Account for both these scenarios, here.
-    
-	Task newTask = null;
-    
-	// If the number of NT_FPREGSET note objects is equal to the
-	// the number of NT_PRSTATUS note objects, then no do not account
-	// for mismatch. 
-	if (elfFPRegs.length == elfTasks.length)
-	    for (int i=0; i<elfTasks.length; i++) {
-		// xfpregsets accompany fp registers on a 1:1  basis
-		// but only on some architectures.
-		ElfPrXFPRegSet xregSet = null;
-		if (elfXFPRegs.length > 0)
-		    xregSet = elfXFPRegs[i];
-		newTask = new LinuxCoreTask(LinuxCoreProc.this, elfTasks[i], elfFPRegs[i], xregSet, isa);
-	    } else {
-	    // Otherwise add only NT_FPREGSET data if pr_fpvalid is > 0. This
-	    // value is not reliable on userland kernels (gdb always sets it
-	    // to 0) so if we are here, this is a micro-optimized kernel where
-	    // that flag is set correctly.
-	    for (int i=0; i<elfTasks.length; i++) {
-	    
-		if (elfTasks[i].getPrFPValid() > 0) {
-
-		    // xfpregsets accompany fp registers on a 1:1  basis
-		    // but only on some architectures.
-		    ElfPrXFPRegSet xregSet = null;
-		    if (elfXFPRegs.length > 0)
-			xregSet = elfXFPRegs[fpCount];
-		    newTask = new LinuxCoreTask(LinuxCoreProc.this, elfTasks[i], elfFPRegs[fpCount], xregSet, isa);
-		    fpCount++;
-		} else
-		    newTask = new LinuxCoreTask(LinuxCoreProc.this, elfTasks[i],  null, null, isa);
-	    
-	    }
-	}
-	newTask.getClass();
-    }
-
-
     private MemoryMap[] memoryMaps;
     public MemoryMap[] getMaps () {
 	fine.log(this,"getMaps()");
@@ -267,31 +265,29 @@ public class LinuxCoreProc extends DeadProc {
 	return memoryMaps;
     }
 
-    private Auxv[] auxv;
     public Auxv[] getAuxv() {
+	return auxv;
+    }
+    private Auxv[] auxv;
 
+    private Auxv[] constructAuxv(ElfData noteSection) {
 	fine.log(this,"getAuxv()", Log.CALLER);
-
-	if (auxv == null) {
-	    fine.log(this,"Auxv is null, building");
-	    final ElfPrAuxv prAuxv =  ElfPrAuxv.decode(elfData);
-	    class BuildAuxv extends AuxvBuilder {
-		Auxv[] vec;
-		public void buildBuffer (byte[] auxv) {
-		}
-		public void buildDimensions (int wordSize, boolean bigEndian,
-					     int length) {
-		    vec = new Auxv[length];
-		}
-		public void buildAuxiliary (int index, int type, long val) {
-		    vec[index] = new Auxv (type, val);
-		}
+	final ElfPrAuxv prAuxv =  ElfPrAuxv.decode(noteSection);
+	class BuildAuxv extends AuxvBuilder {
+	    Auxv[] vec;
+	    public void buildBuffer (byte[] auxv) {
 	    }
-	    BuildAuxv auxv = new BuildAuxv ();
-	    auxv.construct (prAuxv.getAuxvBuffer());
-	    this.auxv = auxv.vec;
-	} else {fine.log(this,"Returning cached Auxv");}
-	return auxv;
+	    public void buildDimensions (int wordSize, boolean bigEndian,
+					 int length) {
+		vec = new Auxv[length];
+	    }
+	    public void buildAuxiliary (int index, int type, long val) {
+		vec[index] = new Auxv (type, val);
+	    }
+	}
+	BuildAuxv auxv = new BuildAuxv ();
+	auxv.construct (prAuxv.getAuxvBuffer());
+	return auxv.vec;
     }
 
     /**
diff --git a/frysk-sys/frysk/rsl/ChangeLog b/frysk-sys/frysk/rsl/ChangeLog
index 27e24e2..73b33c2 100644
--- a/frysk-sys/frysk/rsl/ChangeLog
+++ b/frysk-sys/frysk/rsl/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-20  Andrew Cagney  <cagney@redhat.com>
+
+	* Log.java: Include the TID.PID in the log message.
+
 2008-02-15  Andrew Cagney  <cagney@redhat.com>
 
 	* Log.java: Add more log methods and boolean support.
diff --git a/frysk-sys/frysk/rsl/Log.java b/frysk-sys/frysk/rsl/Log.java
index 5e6f677..0a3e3eb 100644
--- a/frysk-sys/frysk/rsl/Log.java
+++ b/frysk-sys/frysk/rsl/Log.java
@@ -39,6 +39,8 @@
 
 package frysk.rsl;
 
+import frysk.sys.Tid;
+import frysk.sys.Pid;
 import inua.util.PrintWriter;
 import java.io.PrintStream;
 import java.text.MessageFormat;
@@ -129,7 +131,7 @@ public final class Log {
 
     private static final long startTime = System.currentTimeMillis();
 
-    private void prefixTime() {
+    private void prefixTimeAndPid() {
 	long time = System.currentTimeMillis() - startTime;
 	long millis = time % 1000;
 	time = time / 1000;
@@ -140,8 +142,10 @@ public final class Log {
 	long hrs = time % 24;
 	time = time / 24;
 	long days = time;
-	out.print(days);
-	out.print(' ');
+	if (days > 0) {
+	    out.print(days);
+	    out.print(' ');
+	}
 	out.print(2, '0', hrs);
 	out.print(':');
 	out.print(2, '0', mins);
@@ -150,17 +154,21 @@ public final class Log {
 	out.print('.');
 	out.print(3, '0', millis);
 	out.print(' ');
+	out.print(Pid.get());
+	out.print('.');
+	out.print(Tid.get());
+	out.print(' ');
     }
 
     private void prefix() {
-	prefixTime();
+	prefixTimeAndPid();
 	out.print(path);
 	out.print(":");
     }
 
     private void prefix(Object o) {
-	prefixTime();
-	out.print(" [");
+	prefixTimeAndPid();
+	out.print("[");
 	out.print(o.toString());
 	out.print("]:");
     }


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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-02-21  3:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-21  3:34 [SCM] master: Simplify corefile task creation (work with latest bash) cagney

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).