From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1112 invoked by alias); 21 Feb 2008 03:34:55 -0000 Received: (qmail 1085 invoked by uid 367); 21 Feb 2008 03:34:53 -0000 Date: Thu, 21 Feb 2008 03:34:00 -0000 Message-ID: <20080221033453.1070.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Simplify corefile task creation (work with latest bash). X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: caffa28dbf44f934103b9f00eeea11e15ce97581 X-Git-Newrev: 90ee18a041aa5c6d3306ac716d6bda587d0bb7c0 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/msg00237.txt.bz2 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 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 * TestFexe.java: Prevent bash execing fexe. frysk-core/frysk/proc/dead/ChangeLog 2008-02-20 Andrew Cagney * LinuxCoreProc.java (constructAuxv(ElfData)): New. (constructTasks(ElfData,ISA)): Replace sendRefresh. frysk-sys/frysk/rsl/ChangeLog 2008-02-20 Andrew Cagney * 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 + + * TestFexe.java: Prevent bash execing fexe. + 2008-02-20 Teresa Thomas * 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 + * 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 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 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 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 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 + + * Log.java: Include the TID.PID in the log message. + 2008-02-15 Andrew Cagney * 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