public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Implement tracepoint instances
@ 2008-02-28 18:34 pmachata
  0 siblings, 0 replies; only message in thread
From: pmachata @ 2008-02-28 18:34 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  84be88afd0541d23295051eb75029e84a0f3a0b2 (commit)
      from  bbf65a2f723cbba04b745ee99ab0adb8ab8f82cb (commit)

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

- Log -----------------------------------------------------------------
commit 84be88afd0541d23295051eb75029e84a0f3a0b2
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Feb 28 19:34:25 2008 +0100

    Implement tracepoint instances
    
    * Allows one tracepoint appearing in several libraries (one file
      mapped multiple times).
    * Fixes embarrasing bugs (effective address was computed, but not
      actually used for anything).  Should make ftrace much more
      useful.

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

Summary of changes:
 frysk-core/frysk/ftrace/ChangeLog       |    7 +++
 frysk-core/frysk/ftrace/Ftrace.java     |   14 ++++---
 frysk-core/frysk/ftrace/Ltrace.java     |   62 +++++++++++++++---------------
 frysk-core/frysk/ftrace/TestLtrace.java |    6 +-
 frysk-core/frysk/ftrace/TracePoint.java |   26 +++++++++++++
 5 files changed, 75 insertions(+), 40 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/ftrace/ChangeLog b/frysk-core/frysk/ftrace/ChangeLog
index e3c6c0d..982f05d 100644
--- a/frysk-core/frysk/ftrace/ChangeLog
+++ b/frysk-core/frysk/ftrace/ChangeLog
@@ -1,3 +1,10 @@
+2008-02-28  Petr Machata  <pmachata@redhat.com>
+
+	* TracePoint.java (TracePoint.Instance): New class.
+	* Ftrace.java: Use TracePoint.Instance.
+	* Ltrace.java: Likewise.
+	* TestLtrace.java: Likewise.
+
 2008-02-19  Andrew Cagney  <cagney@redhat.com>
 
 	* TestMappingGuard.java (performTestAllLibraiesGetDetected()):
diff --git a/frysk-core/frysk/ftrace/Ftrace.java b/frysk-core/frysk/ftrace/Ftrace.java
index f495a7b..d724883 100644
--- a/frysk-core/frysk/ftrace/Ftrace.java
+++ b/frysk-core/frysk/ftrace/Ftrace.java
@@ -272,11 +272,12 @@ public class Ftrace
 			       + "part off=0x" + Long.toHexString(part.offset) + ";");
 
 		    long actualAddress = tp.offset - part.offset + part.addressLow;
+		    TracePoint.Instance tpi = new TracePoint.Instance(tp, actualAddress);
 		    logger.log(Level.CONFIG,
-			       "Will trace `" + tp.symbol.name
-			       + "' at 0x" + Long.toHexString(actualAddress));
+			       "Will trace `" + tpi.tracePoint.symbol.name
+			       + "' at 0x" + Long.toHexString(tpi.address));
 
-		    request.add(tp);
+		    request.add(tpi);
 		}
 	    }
 	    if (!request.isEmpty())
@@ -292,11 +293,12 @@ public class Ftrace
 		    && tp.offset < part.offset + part.addressHigh - part.addressLow) {
 
 		    long actualAddress = tp.offset - part.offset + part.addressLow;
+		    TracePoint.Instance tpi = new TracePoint.Instance(tp, actualAddress);
 		    logger.log(Level.CONFIG,
-			       "Stopping tracing of `" + tp.symbol.name
-			       + "' at 0x" + Long.toHexString(actualAddress));
+			       "Stopping tracing of `" + tpi.tracePoint.symbol.name
+			       + "' at 0x" + Long.toHexString(tpi.address));
 
-		    request.add(tp);
+		    request.add(tpi);
 		}
 	    }
 	    if (!request.isEmpty())
diff --git a/frysk-core/frysk/ftrace/Ltrace.java b/frysk-core/frysk/ftrace/Ltrace.java
index 4030805..a992322 100644
--- a/frysk-core/frysk/ftrace/Ltrace.java
+++ b/frysk-core/frysk/ftrace/Ltrace.java
@@ -62,7 +62,7 @@ public class Ltrace
 
     /**
      * Request that given observer receives enter/leave events of
-     * given set of TracePoints.
+     * given set of TracePoint.Instances.
      */
     public synchronized static
 	void requestAddFunctionObserver(Task task,
@@ -114,18 +114,18 @@ public class Ltrace
 	implements TaskObserver.Code
     {
 	class Node {
-	    final TracePoint tracePoint;
+	    final TracePoint.Instance tpi;
 	    final Collection observers;
 
-	    public Node(TracePoint tp, Collection observers) {
-		this.tracePoint = tp;
+	    public Node(TracePoint.Instance tpi, Collection observers) {
+		this.tpi = tpi;
 		this.observers = observers;
 	    }
 	}
 	private final LinkedList nodeList = new LinkedList();
 
-	public void add(TracePoint tp, Collection observers) {
-	    nodeList.addLast(new Node(tp, observers));
+	public void add(TracePoint.Instance tpi, Collection observers) {
+	    nodeList.addLast(new Node(tpi, observers));
 	}
 
 	public Action updateHit (final Task task, long address)
@@ -148,7 +148,7 @@ public class Ltrace
 	    }
 
 	    logger.log(Level.FINEST, "Fetching retval.");
-	    final Symbol symbol = leave.tracePoint.symbol;
+	    final Symbol symbol = leave.tpi.tracePoint.symbol;
 	    final Object ret = arch.getReturnValue(task, symbol);
 	    eachObserver(leave.observers, new ObserverIterator() {
 		    public Action action(FunctionObserver o) {
@@ -174,7 +174,7 @@ public class Ltrace
     private class TracePointObserver
 	implements TaskObserver.Code
     {
-	final TracePoint tracePoint;
+	final TracePoint.Instance tpi;
 	final ArrayList observers = new ArrayList();
 	final Long address;
 
@@ -186,9 +186,9 @@ public class Ltrace
 	 * breakpoint is removed. */
 	FunctionObserver last = null;
 
-	public TracePointObserver(TracePoint tp) {
-	    this.tracePoint = tp;
-	    this.address = new Long(tp.address);
+	public TracePointObserver(TracePoint.Instance tpi) {
+	    this.tpi = tpi;
+	    this.address = new Long(tpi.address);
 	}
 
 	public void add(FunctionObserver observer) {
@@ -214,9 +214,9 @@ public class Ltrace
 	{
 	    logger.log(Level.FINE, "Enter breakpoint at 0x" + Long.toHexString(address));
 
-	    if (address != tracePoint.symbol.getParent().getEntryPoint()) {
+	    if (address != tpi.tracePoint.symbol.getParent().getEntryPoint()) {
 		// Install breakpoint to return address.
-		long retAddr = arch.getReturnAddress(task, tracePoint.symbol);
+		long retAddr = arch.getReturnAddress(task, tpi.tracePoint.symbol);
 		logger.log(Level.FINER,
 			   "It's enter tracepoint, return address 0x"
 			   + Long.toHexString(retAddr) + ".");
@@ -227,17 +227,17 @@ public class Ltrace
 		    retObserver = new FunctionReturnObserver();
 		    task.requestAddCodeObserver(retObserver, retAddr);
 		}
-		retObserver.add(tracePoint, observers);
+		retObserver.add(tpi, observers);
 	    }
 	    else
 		logger.log(Level.FINEST,
 			   "It's _start, no return breakpoint established...");
 
 	    logger.log(Level.FINEST, "Building arglist.");
-	    final Object[] args = arch.getCallArguments(task, tracePoint.symbol);
+	    final Object[] args = arch.getCallArguments(task, tpi.tracePoint.symbol);
 	    eachObserver(observers, new ObserverIterator() {
 		    public Action action(FunctionObserver o) {
-			return o.funcallEnter(task, tracePoint.symbol, args);
+			return o.funcallEnter(task, tpi.tracePoint.symbol, args);
 		    }
 		});
 
@@ -295,7 +295,7 @@ public class Ltrace
     // Map<Long(address), TracePointObserver>
     private final HashMap tpObserverForAddress = new HashMap();
 
-    // Map<TracePoint, TracePointObserver>
+    // Map<TracePoint.Instance, TracePointObserver>
     private final HashMap tpObserverForTracePoint = new HashMap();
 
     // ----------------------
@@ -317,21 +317,21 @@ public class Ltrace
     /**
      * Have given observer observe given set of tracepoints.
      */
-    private synchronized void addObserver(FunctionObserver observer, Set tracePoints)
+    private synchronized void addObserver(FunctionObserver observer, Set tracePointInstances)
     {
-	for (Iterator it = tracePoints.iterator(); it.hasNext(); ) {
-	    TracePoint tracePoint = (TracePoint)it.next();
-	    TracePointObserver tpo = (TracePointObserver)tpObserverForTracePoint.get(tracePoint);
+	for (Iterator it = tracePointInstances.iterator(); it.hasNext(); ) {
+	    TracePoint.Instance tpi = (TracePoint.Instance)it.next();
+	    TracePointObserver tpo = (TracePointObserver)tpObserverForTracePoint.get(tpi);
 	    if (tpo == null) {
-		tpo = new TracePointObserver(tracePoint);
-		tpObserverForTracePoint.put(tracePoint, tpo);
+		tpo = new TracePointObserver(tpi);
+		tpObserverForTracePoint.put(tpi, tpo);
 
 		// When the first observer requests this tracepoint, we
 		// have to setup a breakpoint.
 		if (tpObserverForAddress.put(tpo.address, tpo) != null)
 		    throw new AssertionError("Address already occupied with working set element!");
 
-    		task.requestAddCodeObserver(tpo, tracePoint.address);
+    		task.requestAddCodeObserver(tpo, tpi.address);
     	    }
 
 	    tpo.add(observer);
@@ -349,13 +349,13 @@ public class Ltrace
     /**
      * Request that given observer stops observing tracepoints in given set.
      */
-    private synchronized void removeObserver(FunctionObserver observer, Set tracePoints)
+    private synchronized void removeObserver(FunctionObserver observer, Set tracePointInstances)
     {
-	for (Iterator it = tracePoints.iterator(); it.hasNext(); ) {
-	    TracePoint tracePoint = (TracePoint)it.next();
-	    TracePointObserver tpo = (TracePointObserver)tpObserverForTracePoint.get(tracePoint);
+	for (Iterator it = tracePointInstances.iterator(); it.hasNext(); ) {
+	    TracePoint.Instance tpi = (TracePoint.Instance)it.next();
+	    TracePointObserver tpo = (TracePointObserver)tpObserverForTracePoint.get(tpi);
 	    if (tpo == null)
-		throw new AssertionError("FunctionObserver doesn't observe the trace point " + tracePoint.symbol.name);
+		throw new AssertionError("FunctionObserver doesn't observe the trace point " + tpi.tracePoint.symbol.name);
 
 	    // If this observer doesn't observe given tracepoint
 	    // anymore, remove it from bookkeeping structures.
@@ -372,11 +372,11 @@ public class Ltrace
 		    if (tpObserverForAddress.remove(tpo.address) == null)
 			throw new AssertionError("Couldn't find tracePointObserver in tpObserverForAddress.");
 
-		    if (tpObserverForTracePoint.remove(tracePoint) != tpo) // Not .equals!
+		    if (tpObserverForTracePoint.remove(tpi) != tpo) // Not .equals!
 			throw new AssertionError("Couldn't find tracePointObserver in tpObserverForTracePoint.");
 
 		    // And retract also from the lowlevel breakpoint.
-		    this.task.requestDeleteCodeObserver(tpo, tracePoint.address);
+		    this.task.requestDeleteCodeObserver(tpo, tpi.address);
 
 		    // Skip the deletedFrom call for the last
 		    // observer, it will be called from
diff --git a/frysk-core/frysk/ftrace/TestLtrace.java b/frysk-core/frysk/ftrace/TestLtrace.java
index b6b5f07..8241c48 100644
--- a/frysk-core/frysk/ftrace/TestLtrace.java
+++ b/frysk-core/frysk/ftrace/TestLtrace.java
@@ -105,19 +105,19 @@ public class TestLtrace
 		    objf.eachTracePoint(new ObjectFile.TracePointIterator() {
 			    public void tracePoint(TracePoint tp) {
 				if (creator.acceptTracepoint(task, tp))
-				    tps.add(tp);
+				    tps.add(new TracePoint.Instance(tp, tp.address)); // FIXME
 			    }
 			}, TracePointOrigin.PLT);
 		    objf.eachTracePoint(new ObjectFile.TracePointIterator() {
 			    public void tracePoint(TracePoint tp) {
 				if (creator.acceptTracepoint(task, tp))
-				    tps.add(tp);
+				    tps.add(new TracePoint.Instance(tp, tp.address)); // FIXME
 			    }
 			}, TracePointOrigin.SYMTAB);
 		    objf.eachTracePoint(new ObjectFile.TracePointIterator() {
 			    public void tracePoint(TracePoint tp) {
 				if (creator.acceptTracepoint(task, tp))
-				    tps.add(tp);
+				    tps.add(new TracePoint.Instance(tp, tp.address)); // FIXME
 			    }
 			}, TracePointOrigin.DYNAMIC);
 
diff --git a/frysk-core/frysk/ftrace/TracePoint.java b/frysk-core/frysk/ftrace/TracePoint.java
index 5ebeb68..53b6ecc 100644
--- a/frysk-core/frysk/ftrace/TracePoint.java
+++ b/frysk-core/frysk/ftrace/TracePoint.java
@@ -41,6 +41,32 @@ package frysk.ftrace;
 
 public class TracePoint
 {
+    static class Instance
+    {
+	public final TracePoint tracePoint;
+
+	/** Final address of a breakpoint when taking into account
+	 * in-memory placement of parental DSO of tracePoint. */
+	public final long address;
+
+	Instance(TracePoint tracePoint, long finalAddress) {
+	    this.tracePoint = tracePoint;
+	    this.address = finalAddress;
+	}
+
+	public int hashCode() {
+	    return (int)address;
+	}
+
+	public boolean equals(Object obj) {
+	    if (!(obj instanceof Instance))
+		return false;
+
+	    Instance i = (Instance)obj;
+	    return i.address == address;
+	}
+    }
+
     /** The address of the tracepoint. */
     public final long address;
 


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


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

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

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-28 18:34 [SCM] master: Implement tracepoint instances pmachata

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