public inbox for frysk@sourceware.org
 help / color / mirror / Atom feed
* Re: [SCM]  master: Add --segment=<regex> dumping strategy. Delete  --stackonly dumping strategy.
       [not found] <20080228212550.18079.qmail@sourceware.org>
@ 2008-02-29 11:08 ` Phil Muldoon
  0 siblings, 0 replies; only message in thread
From: Phil Muldoon @ 2008-02-29 11:08 UTC (permalink / raw)
  To: frysk

This commit adds a selective map dumping feature to fcore via the 
-segments option. So for example.

    sleep 100 &

    [1] 7480

    fcore -segments=”stack|heap|vdso|($^)” 7480

Will dump the segments that match the programÂ’s: stack, heap, its 
virtual dynamic shared object (vdso) and any maps without a name (maps 
not backed with a file). The segment's argument is treated as regex and 
is run through a Pattern Matcher to match map name. Please note this is 
Java's version of regex and may differ from the the regex you know and 
love. See:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

Specifically the section to how this differs from Perl 5 regex.

If people find this useful, we can look in the future to adding other 
selective criteria.

Subsequently I removed the --stackonly option. The default mode of fcore 
has not changed, and is to emulate kernel map dumping strategy.

Regards

Phil

pmuldoon@sourceware.org wrote:
> The branch, master has been updated
>        via  058aac11987b42390a7a179274227d4735d41f19 (commit)
>       from  1b5a098d45d2565f472285dde9d990b90c33460a (commit)
>
> Those revisions listed above that are new to this repository have
> not appeared on any other notification email.
>
> - Log -----------------------------------------------------------------
> commit 058aac11987b42390a7a179274227d4735d41f19
> Author: Phil Muldoon <pmuldoon@redhat.com>
> Date:   Thu Feb 28 21:24:56 2008 +0000
>
>     Add --segment=<regex> dumping strategy. Delete --stackonly dumping strategy.
>     
>     2008-02-28  Phil Muldoon  <pmuldoon@redhat.com>
>     
>             * fcore.xml: Add --segments option. Delete
>             --stackonly option.
>             * fcore.java (addOptions): Delete stack only option.
>             Add segments option.
>     
>     2008-02-28  Phil Muldoon  <pmuldoon@redhat.com>
>     
>             * TestLinuxElfCorefile.java (constructStackOnlyCore): Delete.
>             (testStackOnlyMap): Delete.
>             (testRegexSelectedMap): New.
>             (giveMeABlockedProc): Delete comments and remove unecessary
>             proc creations.
>     
>             * LinuxElfCorefile.java (setStackOnly): Delete.
>             (buildMap): Add in regex code. Implement selective
>     
>     2008-02-28  Phil Muldoon  <pmuldoon@redhat.com>
>     
>             * CoredumpAction.java: Remove stack only
>             constructor.
>
> -----------------------------------------------------------------------
>
> Summary of changes:
>  frysk-core/frysk/bindir/ChangeLog                  |    7 ++
>  frysk-core/frysk/bindir/fcore.java                 |  112 +++++++++++---------
>  frysk-core/frysk/bindir/fcore.xml                  |    4 +-
>  frysk-core/frysk/isa/corefiles/ChangeLog           |   10 ++
>  .../frysk/isa/corefiles/LinuxElfCorefile.java      |   61 ++++++-----
>  .../frysk/isa/corefiles/TestLinuxElfCorefile.java  |   76 ++++++--------
>  frysk-core/frysk/testbed/ChangeLog                 |    5 +
>  frysk-core/frysk/testbed/CoredumpAction.java       |   17 ---
>  8 files changed, 147 insertions(+), 145 deletions(-)
>
> First 500 lines of diff:
> diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
> index c2f4788..2f6f7a1 100644
> --- a/frysk-core/frysk/bindir/ChangeLog
> +++ b/frysk-core/frysk/bindir/ChangeLog
> @@ -1,3 +1,10 @@
> +2008-02-28  Phil Muldoon  <pmuldoon@redhat.com>
> +
> +	* fcore.xml: Add --segments option. Delete
> +	--stackonly option.
> +	* fcore.java (addOptions): Delete stack only option.
> +	Add segments option.
> +
>  2008-02-28  Teresa Thomas  <tthomas@redhat.com>
>  
>  	* fdebugrpm.sh: Show error message if fdebuginfo install 
> diff --git a/frysk-core/frysk/bindir/fcore.java b/frysk-core/frysk/bindir/fcore.java
> index a6a2239..dc81c90 100644
> --- a/frysk-core/frysk/bindir/fcore.java
> +++ b/frysk-core/frysk/bindir/fcore.java
> @@ -54,9 +54,11 @@ import gnu.classpath.tools.getopt.OptionException;
>  
>  public class fcore
>  {
> +    private static String matchingRegEx = "";
>      private static String filename = "core";  
>      private static boolean writeAllMaps = false;
> -    private static boolean stackOnly = false;
> +
> +    private static int mapOptionCount = 0;
>      protected static final Logger logger = Logger.getLogger("frysk");
>    
>      /**
> @@ -79,54 +81,55 @@ public class fcore
>       */
>      private static void addOptions (ProcStopUtil fcore)
>      {
> -	fcore.addOption(new Option("stackonly", '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);
> -		}
> -
> -	    }
> -	});
>  
>        fcore.addOption(new Option( "allmaps", 'a',
>  	                          " Writes all readable maps. Does not elide"
>  	                        + " or omit any readable map. Caution: could"
>  	                        + " take considerable amount of time to"
>  	                        + " construct core file.")
> -      {
> -	  public void parsed (String mapsValue) throws OptionException {
> -	      try {
> -		  writeAllMaps = true;
> -		  stackOnly = false;
> -	      } catch (IllegalArgumentException e) {
> -		  throw new OptionException("Invalid maps parameter " + mapsValue);
> +	  {
> +	      public void parsed (String mapsValue) throws OptionException {
> +		  try {
> +		      writeAllMaps = true;
> +		      mapOptionCount++;
> +		  } catch (IllegalArgumentException e) {
> +		      throw new OptionException("Invalid maps parameter " + mapsValue);
> +		  }
> +		  
>  	      }
> -
> -	  }
> -      });
> +	  });
> +      
> +      fcore.addOption(new Option("segments", 's',
> +				 "Define what segments to include via regex.",
> +				 "RegEx") {
> +	      public void parsed(String regEx) throws OptionException {
> +		  try {
> +		      mapOptionCount++;
> +		      matchingRegEx = regEx;
> +                    } catch (IllegalArgumentException e) {
> +		      throw new OptionException("Invalid match parameter "
> +						+ matchingRegEx);
> +		  }
> +	      }
> +	  });
> +      
> +      
>  
>        fcore.addOption(new Option( "outputfile", 'o',
>  	                          " Sets the name (not extension) of the core"
>  	                        + " file. Default is core.{pid}. The extension"
> -	                        + " will always be the pid.", "<filename>")
> -      {
> -	  public void parsed (String filenameValue) throws OptionException
> +				  + " will always be the pid.", "<filename>")
>  	  {
> -	      try {
> +	      public void parsed (String filenameValue) throws OptionException {
> +		  try {
>  		  filename = filenameValue;
> +		  }
> +		  catch (IllegalArgumentException e) {
> +		      throw new OptionException(  "Invalid output filename: "
> +						  + filenameValue);
> +		  }
>  	      }
> -	      catch (IllegalArgumentException e) {
> -		  throw new OptionException(  "Invalid output filename: "
> -			                    + filenameValue);
> -	      }
> -	  }
> -      });
> +	  });
>      }
>      
>      /**
> @@ -136,24 +139,31 @@ public class fcore
>      {
>  	public void executeLive(Proc proc) {
>  	    
> -	    Task[] tasks = (Task[]) proc.getTasks().toArray
> -	                   (new Task[proc.getTasks().size()]);
> -	    LinuxElfCorefile coreFile = LinuxElfCorefileFactory.
> -	                                getCorefile(proc, tasks);
> +	    
>  	  
> -	    if (coreFile == null) {
> -		System.err.println (  "Architecture not supported or "
> -			            + "LinuxElfCorefileFactory returned null");
> -	    } else {
> -		coreFile.setName(filename);
> -		coreFile.setWriteAllMaps(writeAllMaps);
> -		coreFile.setStackOnly(stackOnly);
> -
> -		try {
> -		    coreFile.constructCorefile();
> -		} catch (RuntimeException e) {
> +	    if (mapOptionCount > 1)
> +		System.err.println("Please either speciy -stackonly,"+
> +		" -allmaps, or -match <pattern> for map writing.");
> +	    else {
> +		Task[] tasks = (Task[]) proc.getTasks().toArray
> +	                   (new Task[proc.getTasks().size()]);
> +		LinuxElfCorefile coreFile = LinuxElfCorefileFactory.
> +		    getCorefile(proc, tasks);
> +		
> +		if (coreFile == null) {
>  		    System.err.println (  "Architecture not supported or "
> -			                + "LinuxElfCorefileFactory returned null");		    
> +					  + "LinuxElfCorefileFactory returned null");
> +		} else {
> +		    coreFile.setName(filename);
> +		    coreFile.setWriteAllMaps(writeAllMaps);
> +		    coreFile.setPatternMatch(matchingRegEx);
> +		    
> +		    try {
> +		    coreFile.constructCorefile();
> +		    } catch (RuntimeException e) {
> +			System.err.println (  "Architecture not supported or "
> +					      + "LinuxElfCorefileFactory returned null");		    
> +		    }
>  		}
>  	    }
>  	}
> diff --git a/frysk-core/frysk/bindir/fcore.xml b/frysk-core/frysk/bindir/fcore.xml
> index 407db94..0f63fad 100644
> --- a/frysk-core/frysk/bindir/fcore.xml
> +++ b/frysk-core/frysk/bindir/fcore.xml
> @@ -107,9 +107,9 @@
>          </listitem>
>        </varlistentry>
>        <varlistentry>
> -	<term><option>-s, -stackonly</option></term>
> +	<term><option>-s, -segments <replaceable>regex</replaceable></option></term>
>  	<listitem>
> -          <para> Writes only the stack segment. Elide all other segments. </para>
> +          <para> Writes only the segments that match the regex specified. Elide all other segments. </para>
>          </listitem>
>        </varlistentry>
>        <varlistentry>
> diff --git a/frysk-core/frysk/isa/corefiles/ChangeLog b/frysk-core/frysk/isa/corefiles/ChangeLog
> index 0cd6d0f..790d374 100644
> --- a/frysk-core/frysk/isa/corefiles/ChangeLog
> +++ b/frysk-core/frysk/isa/corefiles/ChangeLog
> @@ -1,5 +1,15 @@
>  2008-02-28  Phil Muldoon  <pmuldoon@redhat.com>
>  
> +	* TestLinuxElfCorefile.java (constructStackOnlyCore): Delete.
> +	(testStackOnlyMap): Delete.
> +	(testRegexSelectedMap): New.
> +	(giveMeABlockedProc): Delete comments and remove unecessary 
> +	proc creations.
> +
> +	* LinuxElfCorefile.java (setStackOnly): Delete.
> +	(buildMap): Add in regex code. Implement selective
> +	segment code.
> +	
>  	* TestLinuxElfCorefile.java: Move and rename from
>  	frysk/testbed/TestCoredumpAction.java.
>  
> diff --git a/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java
> index 9999d52..dd6c686 100644
> --- a/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java
> +++ b/frysk-core/frysk/isa/corefiles/LinuxElfCorefile.java
> @@ -57,12 +57,15 @@ import frysk.proc.Task;
>  import frysk.sys.StatelessFile;
>  import frysk.sys.proc.MapsBuilder;
>  import java.io.File;
> +import java.util.regex.Pattern;
> +import java.util.regex.Matcher;
>  
>  public abstract class LinuxElfCorefile {
>  
>      long elfSectionOffset = 0;
>  
>      String coreName = "core";
> +    String regex = "";
>  
>      Proc process = null;
>  
> @@ -70,7 +73,7 @@ public abstract class LinuxElfCorefile {
>  
>      boolean writeAllMaps = false;
>     
> -    boolean stackOnly = true;
> +    boolean regexMatch = false;
>  
>      Elf linuxElfCorefileImage = null;
>  
> @@ -101,19 +104,11 @@ public abstract class LinuxElfCorefile {
>      }
>  
>  
> -    /**
> -     * 
> -     * 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;
> +    public void setPatternMatch(String regex) {
> +	this.regex = regex;
> +        if (!this.regex.equals(""))
> +	    this.regexMatch = true;
>      }
> -
>      /**
>       * 
>       * Set the name of the corefile to be constructed. This should be
> @@ -466,10 +461,13 @@ public abstract class LinuxElfCorefile {
>  	
>  	Dwfl dwfl = null;
>  	Elf elf;
> +	Pattern pattern;
>  
>  	CoreMapsBuilder()
>  	{
>  	    dwfl = DwflCache.getDwfl(process.getMainTask());
> +	    if (regexMatch)
> +		pattern =  Pattern.compile(regex);
>  	}
>  		
>  	public void buildBuffer(final byte[] maps) {
> @@ -495,9 +493,19 @@ public abstract class LinuxElfCorefile {
>  			pathnameLength);
>  		String sfilename = new String(filename);
>  
> +		
>  		if (writeAllMaps) {
>  		    writeMap = true;
> +		} 
> +
> +
> +		if (regexMatch) {
> +		    Matcher match = pattern.matcher(sfilename);
> +		    if (match.find()) {
> +			writeMap = true;
> +		    }
>  		} else {
> +		    
>  		    // Should the map be written?
>  		    if (inode == 0)
>  			writeMap = true;
> @@ -511,25 +519,18 @@ public abstract class LinuxElfCorefile {
>  			writeMap = true;
>  		    if (shared)
>  			writeMap = true;
> -		}
> -
> -		if (!writeMap) {
> -		    DwflModule module = null;
> -		    if (dwfl != null) {
> -			module = dwfl.getModule(addressLow);
> -			if (module != null)
> -			    if (module.getElf() == null)
> -				writeMap = true;
> -		    }	
> -		}
> +		
>  
> -		if (stackOnly) {
> -		    if (sfilename.equals("[stack]") || sfilename.equals("[vdso]"))
> -			writeMap = true;
> -		    else
> -			writeMap = false;
> +		    if (!writeMap) {
> +			DwflModule module = null;
> +			if (dwfl != null) {
> +			    module = dwfl.getModule(addressLow);
> +			    if (module != null)
> +				if (module.getElf() == null)
> +				    writeMap = true;
> +			}	
> +		    }
>  		}
> -			
>  				
>  		// Get empty progam segment header corresponding to this entry.
>  		// PT_NOTE's program header entry takes the index: 0. So we should
> diff --git a/frysk-core/frysk/isa/corefiles/TestLinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/TestLinuxElfCorefile.java
> index 247cb82..5b93010 100644
> --- a/frysk-core/frysk/isa/corefiles/TestLinuxElfCorefile.java
> +++ b/frysk-core/frysk/isa/corefiles/TestLinuxElfCorefile.java
> @@ -57,13 +57,15 @@ import frysk.proc.Auxv;
>  import frysk.proc.Manager;
>  import frysk.proc.MemoryMap;
>  import frysk.proc.Proc;
> +import frysk.proc.Task;
>  import frysk.proc.ProcBlockAction;
>  import frysk.proc.dead.LinuxCoreFactory;
>  import frysk.testbed.DaemonBlockedAtEntry;
>  import frysk.testbed.SlaveOffspring;
>  import frysk.testbed.TestLib;
>  import frysk.testbed.CoredumpAction;
> -
> +import frysk.isa.corefiles.LinuxElfCorefile;
> +    import frysk.isa.corefiles.LinuxElfCorefileFactory;
>  public class TestLinuxElfCorefile
>      extends TestLib
>  {
> @@ -223,20 +225,22 @@ public class TestLinuxElfCorefile
>    }
>  
>  
> -  public void testStackOnlyMap () 
> +  public void testRegexSelectedMap () 
>    {
> -    Proc ackProc = giveMeAProc();
> -    MemoryMap stackMap = null;
> +    Proc ackProc = giveMeABlockedProc();
> +    MemoryMap stackMap = null, vdsoMap  = 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());
> +    LinuxElfCorefile core =
> +    LinuxElfCorefileFactory.getCorefile(ackProc, 
> +					(Task[])ackProc.getTasks().toArray(new Task[0]));
> +
> +    core.setPatternMatch("stack|vdso");
> +    core.constructCorefile();
>  
>      // Model the corefile, and get the Process.
> -    Proc coreProc = LinuxCoreFactory.createProc(testCore,
> +    Proc coreProc = LinuxCoreFactory.createProc(new File(core.getConstructedFileName()),
>  						new File(ackProc.getExe()));
>      assertNotNull("Checking core file process", coreProc);    
>     
> @@ -244,18 +248,28 @@ public class TestLinuxElfCorefile
>      MemoryMap[] liveMaps = ackProc.getMaps();
>      
>      for(int i=0; i<liveMaps.length; i++) {
> -	if (liveMaps[i].name.equals("[stack]")) {
> +	System.out.println(liveMaps[i].name);
> +	if (liveMaps[i].name.equals("[stack]"))
>  	    stackMap = liveMaps[i];
> -	    break;
> -	}
> +	if (liveMaps[i].name.equals("[vdso]")) 
> +	    vdsoMap = liveMaps[i];
>      }
> +  
> +
> +    assertNotNull("Live VDSO segment not null", vdsoMap);
> +    assertNotNull("Live STACK segment not null", stackMap);
>  
> -    assertNotNull("Cannot find stack in live process", stackMap);
> -    int mapNo = findLowAddress(stackMap.addressLow, coreMaps);
> +    int mapNo=0;
> +
> +    mapNo = findLowAddress(stackMap.addressLow, coreMaps);
>      coreMap = coreMaps[mapNo];
>      assertNotNull("Cannot find stack in core process", coreMap);    
>  
> -    Elf testElf = new Elf(testCore, ElfCommand.ELF_C_READ);
> +    mapNo = findLowAddress(vdsoMap.addressLow, coreMaps);
> +    coreMap = coreMaps[mapNo];
> +    assertNotNull("Cannot find vdso in core process", coreMap);    
> +
> +    Elf testElf = new Elf(new File(core.getConstructedFileName()), ElfCommand.ELF_C_READ);
>      ElfEHeader header = testElf.getEHeader();
>      int count = header.phnum;
>      int segCount = 0;
> @@ -269,7 +283,7 @@ public class TestLinuxElfCorefile
>        }
>      testElf.close();
>  
> -    assertEquals("stack only corefile segCount +stack +notes != 2",segCount,2);
> +    assertEquals("stack only corefile segCount +stack +vdso +notes != 3",3,segCount);
>    }
>  
>  
> @@ -297,30 +311,6 @@ public class TestLinuxElfCorefile
>      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();
> -  }
>  
>   
>    /**
> @@ -343,11 +333,7 @@ public class TestLinuxElfCorefile
>    {
>      String[] nocmds = {};
>      DaemonBlockedAtEntry ackProc = new DaemonBlockedAtEntry(nocmds);
> -    //SlaveOffspring ackProc = SlaveOffspring.createDaemon();
>      assertNotNull(ackProc);
> -    ackProc.getMainTask().getProc();
> -    //Proc proc = ackProc.assertFindProcAndTasks();
> -    //assertNotNull(proc);
>      return ackProc.getMainTask().getProc();
>    }
>    
> diff --git a/frysk-core/frysk/testbed/ChangeLog b/frysk-core/frysk/testbed/ChangeLog
> index 98d033a..a15fce6 100644
> --- a/frysk-core/frysk/testbed/ChangeLog
> +++ b/frysk-core/frysk/testbed/ChangeLog
> @@ -1,3 +1,8 @@
> +2008-02-28  Phil Muldoon  <pmuldoon@redhat.com>
> +
> +	* CoredumpAction.java: Remove stack only
> +	constructor.
> +
>  2008-02-28    Teresa Thomas  <tthomas@redhat.com>
>  
>  	* CorefileFactory.java: Remove redundant import.
> diff --git a/frysk-core/frysk/testbed/CoredumpAction.java b/frysk-core/frysk/testbed/CoredumpAction.java
> index 6a26ca5..36683a7 100644
> --- a/frysk-core/frysk/testbed/CoredumpAction.java
> +++ b/frysk-core/frysk/testbed/CoredumpAction.java
> @@ -72,8 +72,6 @@ public class CoredumpAction implements ProcObserver.ProcAction {
>  
>      private boolean writeAllMaps = false;
>  
> -    private boolean stackOnly = false;
> -
>      private LinuxElfCorefile coreFile;
>  
>      int taskArraySize = 1;
> @@ -101,20 +99,6 @@ public class CoredumpAction implements ProcObserver.ProcAction {
>  	Manager.eventLoop.add(new InterruptEvent(proc));
>      }
>  
> -    /**
>
>
> hooks/post-receive
> --
> frysk system monitor/debugger
>   

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

only message in thread, other threads:[~2008-02-29 11:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20080228212550.18079.qmail@sourceware.org>
2008-02-29 11:08 ` [SCM] master: Add --segment=<regex> dumping strategy. Delete --stackonly dumping strategy Phil Muldoon

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