public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Split local classes in frysk.bindir.ftrace into frysk.ftrace.
Date: Fri, 29 Feb 2008 20:31:00 -0000	[thread overview]
Message-ID: <20080229203055.14345.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  148d1359cf791171d7f346d4fca35c1fc36aca8c (commit)
      from  b69a9d32535ea10a98fb4f67ef0778073654ea58 (commit)

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

- Log -----------------------------------------------------------------
commit 148d1359cf791171d7f346d4fca35c1fc36aca8c
Author: Andrew Cagney <cagney@redhat.com>
Date:   Fri Feb 29 15:29:23 2008 -0500

    Split local classes in frysk.bindir.ftrace into frysk.ftrace.
    
    frysk-core/frysk/bindir/ChangeLog
    2008-02-29  Andrew Cagney  <cagney@redhat.com>
    
    	* ftrace.java: Move Rule, SymbolRule and MyFtraceController to
    	separate frysk.ftrace classes.
    
    frysk-core/frysk/ftrace/ChangeLog
    2008-02-29  Andrew Cagney  <cagney@redhat.com>
    
    	* FtraceController.java: Extract from frysk.bindir.ftrace.
    	* Rule.java: Extract from frysk.bindir.ftrace.
    	* SymbolRule.java: Extract from frysk.bindir.ftrace.

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

Summary of changes:
 frysk-core/frysk/bindir/ChangeLog                  |    5 +
 frysk-core/frysk/bindir/ftrace.java                |  361 ++------------------
 frysk-core/frysk/ftrace/ChangeLog                  |    6 +
 frysk-core/frysk/ftrace/FtraceController.java      |  233 +++++++++++++
 .../TaskObserverBase.java => ftrace/Rule.java}     |   93 +++---
 .../{proc/TaskId.java => ftrace/SymbolRule.java}   |  117 ++++---
 6 files changed, 381 insertions(+), 434 deletions(-)
 create mode 100644 frysk-core/frysk/ftrace/FtraceController.java
 copy frysk-core/frysk/{testbed/TaskObserverBase.java => ftrace/Rule.java} (58%)
 copy frysk-core/frysk/{proc/TaskId.java => ftrace/SymbolRule.java} (51%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
index 51931f1..4f2f4dd 100644
--- a/frysk-core/frysk/bindir/ChangeLog
+++ b/frysk-core/frysk/bindir/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-29  Andrew Cagney  <cagney@redhat.com>
+
+	* ftrace.java: Move Rule, SymbolRule and MyFtraceController to
+	separate frysk.ftrace classes.
+
 2008-02-29  Petr Machata  <pmachata@redhat.com>
 
 	* ftrace.java (parseSigSysRules): Produce case insensitive rules,
diff --git a/frysk-core/frysk/bindir/ftrace.java b/frysk-core/frysk/bindir/ftrace.java
index f886410..5545d14 100644
--- a/frysk-core/frysk/bindir/ftrace.java
+++ b/frysk-core/frysk/bindir/ftrace.java
@@ -43,365 +43,46 @@ import inua.util.PrintWriter;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.*;
 import java.util.regex.Pattern;
-
 import frysk.ftrace.Ftrace;
-import frysk.ftrace.ObjectFile;
-import frysk.ftrace.Symbol;
-import frysk.ftrace.TracePoint;
-import frysk.ftrace.TracePointOrigin;
 import frysk.isa.signals.Signal;
-import frysk.isa.signals.SignalTable;
 import frysk.isa.syscalls.Syscall;
-import frysk.isa.syscalls.SyscallTable;
 import frysk.proc.Proc;
-import frysk.proc.Task;
 import frysk.util.CommandlineParser;
 import frysk.util.Glob;
 import frysk.util.Util;
 import gnu.classpath.tools.getopt.Option;
 import gnu.classpath.tools.getopt.OptionException;
-import lib.dwfl.ElfSymbolVersion;
-
-abstract class Rule
-{
-    final public boolean addition;
-    final public boolean stackTrace;
-
-    protected Rule(boolean addition, boolean stackTrace) {
-	this.addition = addition;
-	this.stackTrace = stackTrace;
-    }
-
-    public String toString() {
-	return ""
-	    + (this.addition ? "" : "-")
-	    + (this.stackTrace ? "#" : "");
-    }
-
-    public void apply(Logger logger, Collection candidates,
-		    Set workingSet, Set stackTraceSet) {
-	if (this.addition)
-	    // For '+' rules iterate over candidates,
-	    // and add what matches to workingSet, and
-	    // maybe to stackTraceSet.
-	    for (Iterator jt = candidates.iterator(); jt.hasNext(); ) {
-		Object candidate = jt.next();
-		if (this.matches(candidate))
-		{
-		    if (workingSet.add(candidate))
-			logger.log(Level.CONFIG, this + ": add " + candidate + "'.");
-		    if (this.stackTrace
-			&& stackTraceSet.add(candidate))
-			logger.log(Level.CONFIG, this + ": stack trace on " + candidate + ".");
-		}
-	    }
-	else {
-	    // For '-' or '-#' rules iterate over
-	    // workingSet or stackTraceSet, and remove
-	    // what matches.
-	    Set iterateOver = this.stackTrace ? stackTraceSet : workingSet;
-	    for (Iterator jt = iterateOver.iterator(); jt.hasNext(); ) {
-		Object candidate = jt.next();
-		if (this.matches(candidate)) {
-		    jt.remove();
-		    if (!this.stackTrace)
-			stackTraceSet.remove(candidate);
-		    logger.log(Level.CONFIG, this + ": remove " + candidate + ".");
-		}
-	    }
-	}
-    }
-
-    abstract public boolean matches(Object traceable);
-}
-
-class SymbolRule
-    extends Rule
-{
-    /** See namePattern */
-    final public Pattern sonamePattern, versionPattern;
-
-    /**
-     * Object that performs a pattern matching of a symbol name. null
-     * for "anything" matcher.
-     */
-    final public Pattern namePattern;
-
-    public SymbolRule(boolean addition, boolean stackTrace,
-		      String nameRe, String sonameRe, String versionRe) {
-	super (addition, stackTrace);
-	this.sonamePattern = Glob.compile((sonameRe != null) ? sonameRe : "*");
-	this.versionPattern = Glob.compile((versionRe != null) ? versionRe : "*");
-	this.namePattern = Glob.compile((nameRe != null) ? nameRe : "*");
-    }
-
-    public String toString() {
-	return super.toString()
-	    + this.namePattern.pattern()
-	    + "@" + this.sonamePattern.pattern()
-	    + "@@" + this.versionPattern.pattern();
-    }
-
-
-    private boolean checkVersionMatches(final TracePoint tp)
-    {
-	ElfSymbolVersion[] vers = (tp.origin == TracePointOrigin.PLT)
-	    ? (ElfSymbolVersion[])tp.symbol.verneeds
-	    : (ElfSymbolVersion[])tp.symbol.verdefs;
-
-	// When there is no version assigned to symbol, we pretend it has
-	// a version of ''.  Otherwise we require one of the versions to
-	// match the version pattern.
-	if (vers.length == 0) {
-	    if (this.versionPattern.matcher("").matches())
-		return true;
-	}
-	else
-	    for (int i = 0; i < vers.length; ++i)
-		if (this.versionPattern.matcher(vers[i].name).matches())
-		    return true;
+import frysk.ftrace.Rule;
+import frysk.ftrace.SymbolRule;
+import frysk.ftrace.FtraceController;
+import frysk.rsl.Log;
 
-	return false;
-    }
-
-    private boolean checkNameMatches(final TracePoint tp)
-    {
-	Symbol symbol = tp.symbol;
-
-	if (this.namePattern.matcher(symbol.name).matches())
-	    return true;
-
-	if (symbol.aliases != null)
-	    for (int i = 0; i < symbol.aliases.size(); ++i) {
-		String alias = (String)symbol.aliases.get(i);
-		if (this.namePattern.matcher(alias).matches())
-		    return true;
-	    }
-
-	return false;
-    }
-
-    public boolean matches(Object traceable) {
-	TracePoint tp = (TracePoint)traceable;
-	return checkNameMatches(tp)
-	    && checkVersionMatches(tp);
-    }
-}
-
-class MyFtraceController
-    implements Ftrace.Controller,
-	       Ftrace.StackTracedSymbolsProvider,
-	       Ftrace.TracedSyscallProvider,
-	       Ftrace.TracedSignalProvider
-{
-    protected static final Logger logger = Logger.getLogger("frysk");
-
-    // ArrayList<SymbolRule>
-    private final List pltRules = new ArrayList();
-    private final List dynRules = new ArrayList();
-    private final List symRules = new ArrayList();
-    private final List sysRules = new ArrayList();
-    private final List sigRules = new ArrayList();
-
-    // Which symbols should yield a stack trace.
-    private HashSet symbolsStackTraceSet = new HashSet();
-    private boolean stackTraceEverything = false;
-
-    public void stackTraceEverything() {
-	stackTraceEverything = true;
-    }
-
-    public boolean shouldStackTraceOnSymbol(Symbol symbol) {
-	return stackTraceEverything
-	    || symbolsStackTraceSet.contains(symbol);
-    }
+class ftrace {
+    private static final Log fine = Log.fine(ftrace.class);
 
-    public MyFtraceController() { }
-
-    public void gotPltRules(List rules) {
-	logger.log(Level.FINER, "Got " + rules.size() + " PLT rules.");
-	this.pltRules.addAll(rules);
-    }
-
-    public void gotDynRules(List rules) {
-	logger.log(Level.FINER, "Got " + rules.size() + " DYNAMIC rules.");
-	this.dynRules.addAll(rules);
-    }
-
-    public void gotSymRules(List rules) {
-	logger.log(Level.FINER, "Got " + rules.size() + " SYMTAB rules.");
-	this.symRules.addAll(rules);
-    }
-
-    public void gotSysRules(List rules) {
-	logger.log(Level.FINER, "Got " + rules.size() + " syscall rules.");
-	this.sysRules.addAll(rules);
-    }
-
-    public void gotSigRules(List rules) {
-	logger.log(Level.FINER, "Got " + rules.size() + " signal rules.");
-	this.sigRules.addAll(rules);
-    }
-
-    private Map computeWorkingSet(Task task, String what,
-				 List rules, ArrayList candidates)
-    {
-	HashSet workingSet = new HashSet();
-	HashSet stackTraceSet = new HashSet();
-
-	for (Iterator it = rules.iterator(); it.hasNext(); ) {
-	    final Rule rule = (Rule)it.next();
-	    logger.log(Level.FINEST, "Considering syscall rule " + rule + ".");
-	    rule.apply(logger, candidates, workingSet, stackTraceSet);
-	}
-
-	// Apply the two sets.
-	Map ret = new HashMap();
-	for (Iterator it = workingSet.iterator(); it.hasNext(); ) {
-	    Object syscall = it.next();
-	    ret.put(syscall, Boolean.valueOf(stackTraceEverything
-					     || stackTraceSet.contains(syscall)));
-	}
-	return ret;
-    }
-
-    // Syscall working and stack trace sets can be pre-computed for
-    // each task.  This is in contrast to tracing rules, that are
-    // computed incrementally when DSOs are mapped.
-    public Map computeSyscallWorkingSet(Task task) {
-	SyscallTable syscallTable = task.getSyscallTable();
-	long n = syscallTable.getNumSyscalls();
-	ArrayList candidates = new ArrayList();
-	for (long i = 0; i < n; ++i)
-	    candidates.add(syscallTable.getSyscall(i));
-
-	return computeWorkingSet(task, "syscall", sysRules, candidates);
-    }
-
-    // Compute signal working and stack trace sets.
-    public Map computeSignalWorkingSet(Task task) {
-	frysk.sys.Signal[] hostSignals
-	    = frysk.sys.Signal.getHostSignalSet().toArray();
-	SignalTable signalTable = task.getSignalTable();
-	ArrayList candidates = new ArrayList();
-	for (int i = 0; i < hostSignals.length; i++)
-	    candidates.add(signalTable.get(hostSignals[i].intValue()));
-
-	return computeWorkingSet(task, "signal", sigRules, candidates);
-    }
-
-    private boolean isInterpOf(ObjectFile objf, String exe)
-    {
-	java.io.File exefn = new java.io.File(exe);
-	ObjectFile exef = ObjectFile.buildFromFile(exefn);
-	java.io.File interpfn = exef.resolveInterp();
-	java.io.File objffn = objf.getFilename();
-	return objffn.equals(interpfn);
-    }
-
-    public void applyTracingRules(final Task task, final ObjectFile objf, final Ftrace.Driver driver,
-				  final List rules, final TracePointOrigin origin)
-	throws lib.dwfl.ElfException
-    {
-	logger.log(Level.FINER, "Building working set for origin " + origin + ".");
-
-	// Skip the set if it's empty...
-	if (rules.isEmpty())
-	    return;
-
-	// Set<TracePoint>, all tracepoints in objfile.
-	final Set candidates = new HashSet();
-	// Set<TracePoint>, incrementally built working set.
-	final Set workingSet = new HashSet();
-	// Set<TracePoint>, incrementally built set of tracepoints
-	// that should stacktrace.
-	final Set stackTraceSet = new HashSet();
-
-	// Do a lazy init.  With symbol tables this can be very beneficial, because certain symbol 
-	boolean candidatesInited = false;
-
-	// Loop through all the rules, and use them to build
-	// workingSet from candidates.  Candidates are initialized
-	// lazily inside the loop.
-	for (Iterator it = rules.iterator(); it.hasNext(); ) {
-	    final SymbolRule rule = (SymbolRule)it.next();
-	    logger.log(Level.FINEST, "Considering symbol rule " + rule + ".");
-
-	    // MAIN is meta-soname meaning "main executable".
-	    if ((rule.sonamePattern.pattern().equals("MAIN")
-		 && task.getProc().getExe().equals(objf.getFilename().getPath()))
-		|| (rule.sonamePattern.pattern().equals("INTERP")
-		    && isInterpOf(objf, task.getProc().getExe()))
-		|| rule.sonamePattern.matcher(objf.getSoname()).matches())
-	    {
-		if (!candidatesInited) {
-		    candidatesInited = true;
-		    objf.eachTracePoint(new ObjectFile.TracePointIterator() {
-			    public void tracePoint(TracePoint tp) {
-				if (candidates.add(tp))
-				    logger.log(Level.FINE, "candidate `" + tp.symbol.name + "'.");
-			    }
-			}, origin);
-		}
-
-		rule.apply(logger, candidates, workingSet, stackTraceSet);
-	    }
-	}
-
-	// Finally, apply constructed working set.
-	logger.log(Level.FINER, "Applying working set for origin " + origin + ".");
-	for (Iterator it = workingSet.iterator(); it.hasNext(); )
-	    driver.tracePoint(task, (TracePoint)it.next());
-
-	for (Iterator it = stackTraceSet.iterator(); it.hasNext(); )
-	    symbolsStackTraceSet.add(((TracePoint)it.next()).symbol);
-    }
-
-    public void fileMapped(final Task task, final ObjectFile objf, final Ftrace.Driver driver) {
-	try {
-	    applyTracingRules(task, objf, driver, pltRules, TracePointOrigin.PLT);
-	    applyTracingRules(task, objf, driver, dynRules, TracePointOrigin.DYNAMIC);
-	    applyTracingRules(task, objf, driver, symRules, TracePointOrigin.SYMTAB);
-	}
-	catch (lib.dwfl.ElfException ee) {
-	    ee.printStackTrace();
-	}
-    }
-}
-
-class ftrace
-{
     //Where to send the output.
-    PrintWriter writer;
-
-    protected static final Logger logger = Logger.getLogger("frysk");
+    private PrintWriter writer;
 
     // True if a PID was requested.
-    boolean requestedPid;
+    private boolean requestedPid;
     // Command and arguments to exec.
-    ArrayList commandAndArguments;
+    private ArrayList commandAndArguments;
 
     // For configuration of overall working set.  We need to load and
     // apply rules separately, to get all log messages, that's the
     // reason we need these temporary array lists.
-    final List pltRules = new ArrayList();
-    final List dynRules = new ArrayList();
-    final List symRules = new ArrayList();
-    final List sysRules = new ArrayList();
-    final List sigRules = new ArrayList();
-    final MyFtraceController controller = new MyFtraceController();
-    boolean allowInterpTracing = false;
+    private final List pltRules = new ArrayList();
+    private final List dynRules = new ArrayList();
+    private final List symRules = new ArrayList();
+    private final List sysRules = new ArrayList();
+    private final List sigRules = new ArrayList();
+    private final FtraceController controller = new FtraceController();
+    private boolean allowInterpTracing = false;
 
-    Ftrace tracer = new Ftrace();
+    private Ftrace tracer = new Ftrace();
 
     private List parseSymbolRules(String arg) {
 	String[] strs = arg.split(",", -1);
@@ -454,7 +135,7 @@ class ftrace
 	    else
 		symbolRe = null;
 
-	    logger.log(Level.FINE, i + ": " + str + ": symbol=" + symbolRe + ", soname=" + sonameRe + ", version=" + versionRe);
+	    fine.log(i + ": " + str + ": symbol=" + symbolRe + ", soname=" + sonameRe + ", version=" + versionRe);
 	    SymbolRule rule = new SymbolRule(addition, stackTrace, symbolRe, sonameRe, versionRe);
 	    rules.add(rule);
 	}
@@ -496,7 +177,7 @@ class ftrace
 		stackTrace = false;
 
 	    if (sysnumPat.matcher(str).matches()) {
-		logger.log(Level.FINE, i + ": " + str + ": by number rule");
+		fine.log(i + ": " + str + ": by number rule");
 		final int number = (new Integer(str)).intValue();
 		rule = new Rule(addition, stackTrace) {
 			public boolean matches(final Object traceable) {
@@ -505,7 +186,7 @@ class ftrace
 		    };
 	    }
 	    else if (!str.equals("")) {
-		logger.log(Level.FINE, i + ": " + str + ": by name rule");
+		fine.log(i + ": " + str + ": by name rule");
 		str = str.toLowerCase();
 		if (optionalPrefix != null && !str.startsWith(optionalPrefix))
 		    str = optionalPrefix + str;
@@ -518,7 +199,7 @@ class ftrace
 		    };
 	    }
 	    else {
-		logger.log(Level.FINE, i + ": " + str + ": \"everything\" rule");
+		fine.log(i + ": " + str + ": \"everything\" rule");
 		rule = new Rule(addition, stackTrace) {
 			public boolean matches(Object traceable) {
 			    return true;
diff --git a/frysk-core/frysk/ftrace/ChangeLog b/frysk-core/frysk/ftrace/ChangeLog
index 87e8d9b..b865a35 100644
--- a/frysk-core/frysk/ftrace/ChangeLog
+++ b/frysk-core/frysk/ftrace/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-29  Andrew Cagney  <cagney@redhat.com>
+
+	* FtraceController.java: Extract from frysk.bindir.ftrace.
+	* Rule.java: Extract from frysk.bindir.ftrace.
+	* SymbolRule.java: Extract from frysk.bindir.ftrace.
+
 2008-02-29  Petr Machata  <pmachata@redhat.com>
 
 	* Ftrace.java: Support signal tracing.
diff --git a/frysk-core/frysk/ftrace/FtraceController.java b/frysk-core/frysk/ftrace/FtraceController.java
new file mode 100644
index 0000000..2bd373a
--- /dev/null
+++ b/frysk-core/frysk/ftrace/FtraceController.java
@@ -0,0 +1,233 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 2005, 2006, 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
+// the Free Software Foundation; version 2 of the License.
+//
+// FRYSK is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with FRYSK; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+// 
+// In addition, as a special exception, Red Hat, Inc. gives You the
+// additional right to link the code of FRYSK with code not covered
+// under the GNU General Public License ("Non-GPL Code") and to
+// distribute linked combinations including the two, subject to the
+// limitations in this paragraph. Non-GPL Code permitted under this
+// exception must only link to the code of FRYSK through those well
+// defined interfaces identified in the file named EXCEPTION found in
+// the source code files (the "Approved Interfaces"). The files of
+// Non-GPL Code may instantiate templates or use macros or inline
+// functions from the Approved Interfaces without causing the
+// resulting work to be covered by the GNU General Public
+// License. Only Red Hat, Inc. may make changes or additions to the
+// list of Approved Interfaces. You must obey the GNU General Public
+// License in all respects for all of the FRYSK code and other code
+// used in conjunction with FRYSK except the Non-GPL Code covered by
+// this exception. If you modify this file, you may extend this
+// exception to your version of the file, but you are not obligated to
+// do so. If you do not wish to provide this exception without
+// modification, you must delete this exception statement from your
+// version and license this file solely under the GPL without
+// exception.
+
+package frysk.ftrace;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;


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


                 reply	other threads:[~2008-02-29 20:31 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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