From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30423 invoked by alias); 19 Feb 2008 13:56:40 -0000 Received: (qmail 30395 invoked by uid 9514); 19 Feb 2008 13:56:39 -0000 Date: Tue, 19 Feb 2008 13:56:00 -0000 Message-ID: <20080219135639.30380.qmail@sourceware.org> From: pmuldoon@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Set -stackonly option in corefiles. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 17fb5b9b3faefee0f4190a7f3de42feaba15f16b X-Git-Newrev: 764c4238327cee1cd0bb5f682d7cef444e14e0f9 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/msg00225.txt.bz2 The branch, master has been updated via 764c4238327cee1cd0bb5f682d7cef444e14e0f9 (commit) from 17fb5b9b3faefee0f4190a7f3de42feaba15f16b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 764c4238327cee1cd0bb5f682d7cef444e14e0f9 Author: Phil Muldoon Date: Tue Feb 19 13:56:28 2008 +0000 Set -stackonly option in corefiles. 2008-02-19 Phil Muldoon * CoredumpAction.java: Add stacjOnly parameter. * TestCoredumpAction.java (testStackOnlyMap): New. 2008-02-19 Phil Muldoon * fcore.xml: Add -stack option. * fcore.java (dumpPids): Add stackOnly parameter. (addOptions): Ditto. 2008-02-19 Phil Muldoon * LinuxElfCorefile.java (buildMap): Add stackOnly logic test. (setStackOnly): New. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/bindir/ChangeLog | 6 ++ frysk-core/frysk/bindir/fcore.java | 28 ++++++- frysk-core/frysk/bindir/fcore.xml | 11 ++- frysk-core/frysk/isa/corefiles/ChangeLog | 6 ++ .../frysk/isa/corefiles/LinuxElfCorefile.java | 25 ++++++ frysk-core/frysk/util/ChangeLog | 6 ++ frysk-core/frysk/util/CoredumpAction.java | 9 ++- frysk-core/frysk/util/TestCoredumpAction.java | 91 +++++++++++++++++++- 8 files changed, 174 insertions(+), 8 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog index 5fb4cf3..a35ab8d 100644 --- a/frysk-core/frysk/bindir/ChangeLog +++ b/frysk-core/frysk/bindir/ChangeLog @@ -1,3 +1,9 @@ +2008-02-19 Phil Muldoon + + * fcore.xml: Add -stack option. + * fcore.java (dumpPids): Add stackOnly parameter. + (addOptions): Ditto. + 2008-02-15 Sami Wagiaalla * fstack.java: Added printing of virtual frames to -c. diff --git a/frysk-core/frysk/bindir/fcore.java b/frysk-core/frysk/bindir/fcore.java index 0a41bff..6a92ba4 100644 --- a/frysk-core/frysk/bindir/fcore.java +++ b/frysk-core/frysk/bindir/fcore.java @@ -60,6 +60,8 @@ public class fcore private static boolean writeAllMaps = false; + private static boolean stackOnly = false; + private static CoredumpAction stacker; protected static final Logger logger = Logger.getLogger("frysk"); @@ -90,7 +92,8 @@ public class fcore public static void dumpPid(Proc proc) { stacker = new CoredumpAction(proc, filename, new AbandonCoreEvent(proc), - writeAllMaps); + writeAllMaps, + stackOnly); new ProcBlockAction(proc, stacker); Manager.eventLoop.run(); } @@ -116,7 +119,7 @@ public class fcore addOptions(parser); - parser.setHeader("Usage: fcore [-a] [-o filename] [-c level] [-l level] "); + parser.setHeader("Usage: fcore [-a] [-stack] [-o filename] [-c level] [-l level] "); parser.parse(args); @@ -134,6 +137,25 @@ public class fcore private static void addOptions (CommandlineParser parser) { + parser.add(new Option("stack", 's', + " Writes only stack segment, and elides all "+ + "other maps.") + { + public void parsed (String mapsValue) throws OptionException + { + try + { + stackOnly = true; + + } + catch (IllegalArgumentException e) + { + throw new OptionException("Invalid maps parameter " + mapsValue); + } + + } + }); + parser.add(new Option("allmaps", 'a', " Writes all readable maps. Does not elide" + " or omit any readable map. Caution: could" @@ -145,7 +167,7 @@ public class fcore try { writeAllMaps = true; - + stackOnly = false; } catch (IllegalArgumentException e) { diff --git a/frysk-core/frysk/bindir/fcore.xml b/frysk-core/frysk/bindir/fcore.xml index 619c8ff..04ca062 100644 --- a/frysk-core/frysk/bindir/fcore.xml +++ b/frysk-core/frysk/bindir/fcore.xml @@ -4,7 +4,7 @@ This file is part of the program FRYSK. - Copyright 2006, Red Hat Inc. + Copyright 2006, 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 @@ -72,6 +72,9 @@ + + + @@ -104,6 +107,12 @@ + + + Writes only the stack segment. Elide all other segments. + + + Specifies the name of the core file. Default is core. diff --git a/frysk-core/frysk/isa/corefiles/ChangeLog b/frysk-core/frysk/isa/corefiles/ChangeLog index 1ba5a85..f7308cd 100644 --- a/frysk-core/frysk/isa/corefiles/ChangeLog +++ b/frysk-core/frysk/isa/corefiles/ChangeLog @@ -1,3 +1,9 @@ +2008-02-19 Phil Muldoon + + * LinuxElfCorefile.java (buildMap): Add stackOnly + logic test. + (setStackOnly): New. + 2008-02-15 Phil Muldoon * PPC64LinuxElfCorefile.java (writeNotePrpsinfo): Fix diff --git a/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java index 4eb8d03..1bda4b3 100644 --- a/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java +++ b/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java @@ -71,6 +71,8 @@ public abstract class LinuxElfCorefile { Task[] blockedTasks; boolean writeAllMaps = false; + + boolean stackOnly = true; Elf linuxElfCorefileImage = null; @@ -100,6 +102,20 @@ public abstract class LinuxElfCorefile { this.writeAllMaps = maps; } + + /** + * + * Defines whether to write only the stack segment and elide all others. + * + * @param maps - True if attempt to write all maps, false to follow + * map writing convention. + * + */ + + public void setStackOnly(boolean stackOnly) { + this.stackOnly = stackOnly; + } + /** * * Set the name of the corefile to be constructed. This should be @@ -540,6 +556,15 @@ public abstract class LinuxElfCorefile { writeMap = true; } } + + if (stackOnly) { + if (sfilename.equals("[stack]")) + writeMap = true; + else + writeMap = false; + } + + // Get empty progam segment header corresponding to this entry. // PT_NOTE's program header entry takes the index: 0. So we should // begin from 1. diff --git a/frysk-core/frysk/util/ChangeLog b/frysk-core/frysk/util/ChangeLog index 00da2d8..763b1ec 100644 --- a/frysk-core/frysk/util/ChangeLog +++ b/frysk-core/frysk/util/ChangeLog @@ -1,3 +1,9 @@ +2008-02-19 Phil Muldoon + + * CoredumpAction.java: Add stacjOnly parameter. + * TestCoredumpAction.java (testStackOnlyMap): New. + + 2008-02-14 Andrew Cagney * CommandlineParser.java (parsePids(Proc[])): Replace diff --git a/frysk-core/frysk/util/CoredumpAction.java b/frysk-core/frysk/util/CoredumpAction.java index 5ae0aa6..b17ca81 100644 --- a/frysk-core/frysk/util/CoredumpAction.java +++ b/frysk-core/frysk/util/CoredumpAction.java @@ -72,6 +72,8 @@ public class CoredumpAction implements ProcObserver.ProcAction { private boolean writeAllMaps = false; + private boolean stackOnly = false; + private LinuxElfCorefile coreFile; int taskArraySize = 1; @@ -107,11 +109,11 @@ public class CoredumpAction implements ProcObserver.ProcAction { * @param writeAllMaps - Should all maps be written. */ public CoredumpAction(Proc proc, String filename, Event theEvent, - boolean writeAllMaps) { + boolean writeAllMaps, boolean stackOnly) { this(proc, theEvent, writeAllMaps); this.filename = filename; - + this.stackOnly = stackOnly; } /* (non-Javadoc) @@ -154,7 +156,8 @@ public class CoredumpAction implements ProcObserver.ProcAction { } else { coreFile.setName(this.filename); - coreFile.setWriteAllMaps(writeAllMaps); + coreFile.setWriteAllMaps(this.writeAllMaps); + coreFile.setStackOnly(this.stackOnly); try { coreFile.constructCorefile(); diff --git a/frysk-core/frysk/util/TestCoredumpAction.java b/frysk-core/frysk/util/TestCoredumpAction.java index d97bf55..8cf78d4 100644 --- a/frysk-core/frysk/util/TestCoredumpAction.java +++ b/frysk-core/frysk/util/TestCoredumpAction.java @@ -51,6 +51,7 @@ import lib.dwfl.ElfEMachine; import lib.dwfl.ElfException; import lib.dwfl.ElfFileException; import lib.dwfl.ElfKind; +import lib.dwfl.ElfPHeader; import frysk.event.Event; import frysk.event.RequestStopEvent; import frysk.isa.ISA; @@ -232,7 +233,70 @@ public class TestCoredumpAction testCore.delete(); } -/** + + public void testStackOnlyMap () + { + Proc ackProc = giveMeAProc(); + MemoryMap stackMap = null; + MemoryMap coreMap = null; + // Create a corefile from process + String coreFileName = constructStackOnlyCore(ackProc); + File testCore = new File(coreFileName); + + assertTrue("Checking core file " + coreFileName + " exists.", + testCore.exists()); + + // Model the corefile, and get the Process. + LinuxCoreHost lcoreHost = new LinuxCoreHost(Manager.eventLoop, + testCore,new File(ackProc.getExe())); + + assertNotNull("Checking core file Host", lcoreHost); + + // Get corefile process + Proc coreProc = lcoreHost.getSoleProcFIXME(); + assertNotNull("Checking core file process", coreProc); + + MemoryMap[] coreMaps = coreProc.getMaps(); + MemoryMap[] liveMaps = ackProc.getMaps(); + + for(int i=0; i 0) + segCount++; + } + testElf.close(); + + assertEquals("stack only corefile segCount +stack +notes != 2",segCount,2); + } + + + /** * Given a Proc object, generate a core file from that given proc. * * @param ackProc - proc object to generate core from. @@ -256,6 +320,31 @@ public class TestCoredumpAction return coreDump.getConstructedFileName(); } + /** + * Given a Proc object, generate a core file from that given proc. + * + * @param ackProc - proc object to generate core from. + * @return - name of constructed core file. + */ + private String constructStackOnlyCore (final Proc ackProc) + { + + CoredumpAction coreDump = null; + coreDump = new CoredumpAction(ackProc, "core", + new Event() { + public void execute () { + ackProc. + requestAbandonAndRunEvent( + new RequestStopEvent( + Manager.eventLoop)); + } + }, false, true); + + new ProcBlockAction(ackProc, coreDump); + assertRunUntilStop("Running event loop for core file"); + return coreDump.getConstructedFileName(); + } + /** * Generate a process suitable for attaching to (ie detached when returned). hooks/post-receive -- frysk system monitor/debugger