public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: pmachata@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Handle symbol aliases
Date: Mon, 28 Apr 2008 14:53:00 -0000	[thread overview]
Message-ID: <20080428145346.9504.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  4fc6b25036e2e78c8e0cc84c85e8f8ffcab89e12 (commit)
      from  5e07f97b7cbaace8dd273ad094f0557129d5a65a (commit)

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

- Log -----------------------------------------------------------------
commit 4fc6b25036e2e78c8e0cc84c85e8f8ffcab89e12
Author: Petr Machata <pmachata@redhat.com>
Date:   Mon Apr 28 16:53:28 2008 +0200

    Handle symbol aliases
    
    * ... on ftrace level though.  It would probably be better to move this
      code to breakpoint manager, or to symbol builders.

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

Summary of changes:
 frysk-core/frysk/ftrace/ChangeLog       |    6 ++
 frysk-core/frysk/ftrace/TaskTracer.java |   96 ++++++++++++++++++++----------
 2 files changed, 70 insertions(+), 32 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/ftrace/ChangeLog b/frysk-core/frysk/ftrace/ChangeLog
index eb2f46b..deaa5cf 100644
--- a/frysk-core/frysk/ftrace/ChangeLog
+++ b/frysk-core/frysk/ftrace/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-28  Petr Machata  <pmachata@redhat.com>
+
+	* TaskTracer.java: Share one FunctionEnterObserver among several
+	symbols to reflect aliasing.  Use symbol with the shortest name to
+	report function calls and leaves.
+
 2008-04-25  Petr Machata  <pmachata@redhat.com>
 
 	* TaskTracer.java: Only warn about breakpoint address mismatch if
diff --git a/frysk-core/frysk/ftrace/TaskTracer.java b/frysk-core/frysk/ftrace/TaskTracer.java
index d7c0589..56c700a 100644
--- a/frysk-core/frysk/ftrace/TaskTracer.java
+++ b/frysk-core/frysk/ftrace/TaskTracer.java
@@ -40,10 +40,8 @@
 package frysk.ftrace;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Set;
 
 import frysk.dwfl.ObjectFile;
 import frysk.proc.Action;
@@ -55,7 +53,6 @@ import frysk.rt.BreakpointManager;
 import frysk.rt.PLTBreakpoint;
 import frysk.rt.SourceBreakpoint;
 import frysk.rt.SourceBreakpointObserver;
-import frysk.rt.SymbolBreakpoint;
 import frysk.stack.StackFactory;
 import frysk.symtab.DwflSymbol;
 import frysk.symtab.PLTEntry;
@@ -221,19 +218,29 @@ class TaskTracer
     private class FunctionEnterObserver
 	implements SourceBreakpointObserver
     {
-	private final DwflSymbol sym;
+	private DwflSymbol sym = null;
 	private final boolean isPlt;
 
-	public FunctionEnterObserver(DwflSymbol sym) {
-	    this.sym = sym;
+	public FunctionEnterObserver() {
 	    this.isPlt = false;
 	}
 
 	public FunctionEnterObserver(PLTEntry entry) {
-	    this.sym = entry.getSymbol();
+	    addSymbol(entry.getSymbol());
 	    this.isPlt = true;
 	}
 
+	public void addSymbol(DwflSymbol symbol) {
+	    if (sym != null
+		&& sym.getAddress() != symbol.getAddress())
+		warning.log("Two non-aliasing symbols in one observer:",
+			    sym, "and", symbol);
+
+	    if (sym == null
+		|| sym.getName().length() > symbol.getName().length())
+		sym = symbol;
+	}
+
 	private long getReturnAddress(Task task) {
 	    try {
 		return StackFactory.createFrame(task).getOuter().getAddress();
@@ -260,16 +267,17 @@ class TaskTracer
 		token = entry;
 		tracePoint = new TracePoint(entry);
 	    } else {
-		DwflSymbol symbol = ((SymbolBreakpoint)breakpoint).getSymbol();
-		token = symbol;
-		tracePoint = new TracePoint(symbol);
+		token = sym;
+		tracePoint = new TracePoint(sym);
 	    }
 
 	    String eventName = "" + tracePoint;
 	    if (retAddress == 0)
-		ftrace.reporter.eventSingle(task, "call " + eventName, arch.getCallArguments(task));
+		ftrace.reporter.eventSingle(task, "call " + eventName,
+					    arch.getCallArguments(task));
 	    else {
-		ftrace.reporter.eventEntry(task, tracePoint, "call", eventName, arch.getCallArguments(task));
+		ftrace.reporter.eventEntry(task, tracePoint, "call",
+					   eventName, arch.getCallArguments(task));
 
 		Long retAddressL = new Long(retAddress);
 		FunctionReturnObserver retObserver
@@ -295,34 +303,58 @@ class TaskTracer
 	public void deletedFrom (Object observable) {}
     }
 
-    private final Set alreadyTracing = new HashSet();
-    public void traceSymbol(Task task, DwflSymbol sym)
-    {
-	if (alreadyTracing.contains(sym))
-	    return;
+    private final Map symbolObserversForTask = new HashMap(); // Map<Task, Map<address, FunctionEnterObserver>>
+
+    private synchronized FunctionEnterObserver getObserver(Task task, DwflSymbol sym, PLTEntry entry) {
+	Map symbolObservers = (Map)symbolObserversForTask.get(task);
+	if (symbolObservers == null) {
+	    symbolObservers = new HashMap();
+	    symbolObserversForTask.put(task, symbolObservers);
+	}
+
+	long addr = entry != null ? entry.getAddress() : sym.getAddress();
+	Long addrL = new Long(addr);
+	FunctionEnterObserver ob = (FunctionEnterObserver)symbolObservers.get(addrL);
+	if (ob == null) {
+	    finest.log("New function observer at", sym.getAddress());
+
+	    if (entry != null)
+		ob = new FunctionEnterObserver(entry);
+	    else
+		ob = new FunctionEnterObserver();
+
+	    symbolObservers.put(addrL, ob);
 
-	if (sym.isFunctionSymbol() && sym.getAddress() != 0) {
-	    fine.log("Request for tracing symbol", sym, "at", sym.getAddress());
-	    alreadyTracing.add(sym);
 	    BreakpointManager bpManager = Ftrace.steppingEngine.getBreakpointManager();
-	    final SymbolBreakpoint bp = bpManager.addSymbolBreakpoint(sym);
-	    bp.addObserver(new FunctionEnterObserver(sym));
+	    final SourceBreakpoint bp;
+	    if (entry != null)
+		bp = bpManager.addPLTBreakpoint(entry);
+	    else
+		bp = bpManager.addSymbolBreakpoint(sym);
+	    bp.addObserver(ob);
 	    bpManager.enableBreakpoint(bp, task);
 	}
-	else
-	    finest.log("Ignoring request for tracing undefined or non-functional symbol", sym);
+	return ob;
     }
 
-    public void tracePLTEntry(Task task, PLTEntry entry)
+    public void traceSymbol(Task task, DwflSymbol sym)
     {
-	if (alreadyTracing.contains(entry))
+	long addr = sym.getAddress();
+	if (!sym.isFunctionSymbol() || addr == 0) {
+	    finest.log("Ignoring request for tracing undefined or non-functional symbol", sym);
 	    return;
+	}
+
+	FunctionEnterObserver ob = getObserver(task, sym, null);
+	ob.addSymbol(sym);
+	fine.log("Request for tracing symbol", sym, "at", sym.getAddress());
+    }
 
-	fine.log("Request for tracing PLT", entry.getSymbol());
-	alreadyTracing.add(entry);
-	BreakpointManager bpManager = Ftrace.steppingEngine.getBreakpointManager();
-	final PLTBreakpoint bp = bpManager.addPLTBreakpoint(entry);
-	bp.addObserver(new FunctionEnterObserver(entry));
-	bpManager.enableBreakpoint(bp, task);
+    public void tracePLTEntry(Task task, PLTEntry entry)
+    {
+	FunctionEnterObserver ob = getObserver(task, entry.getSymbol(), entry);
+	ob.addSymbol(entry.getSymbol());
+	fine.log("Request for tracing PLT", entry.getSymbol(),
+		 "at", entry.getSymbol().getAddress());
     }
 }


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


                 reply	other threads:[~2008-04-28 14:53 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=20080428145346.9504.qmail@sourceware.org \
    --to=pmachata@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).