public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: pmachata@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: ftrace now traces both PLT and entry point of one symbol correctly
Date: Sun, 06 Apr 2008 06:32:00 -0000	[thread overview]
Message-ID: <20080406063217.28791.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  d813a1df045eb2251c7f98c668b3ede11d98d9f1 (commit)
       via  8706f5542e70a129369df9de56f310c61ea28be8 (commit)
       via  a7ce267d0d0ef19ab6dacab5c6a3dea2e64f4c12 (commit)
       via  12658130248781d757d1b9eb78a08f3ffe1ceb77 (commit)
       via  3c432e2ae0b4b87c13b64e673699ba271fca57fd (commit)
       via  03592ef55d5138d0eb9e33c1004c5f5d4d792cc3 (commit)
       via  ff1d07bde1286f22653db516b420f3c7d179e4c1 (commit)
       via  e857a3bb9cde789d5b4e8fb85bc0738b595d1d0d (commit)
       via  b25d02996cd40e589aaacd7a463fe3eeb32d9bd6 (commit)
       via  5cb749c858be4bbd3163436ef7c43aa4f3ebf92f (commit)
       via  cbe5784633d6a798174c65c495c06ba9cf1cd765 (commit)
       via  41069eded049c60874c1d091f84845b314e26dd2 (commit)
       via  7f4737c3aeabf75644e3c7dd17bb2e04238604fc (commit)
       via  1051e087d994f157cc5082be2bbcc5f940659599 (commit)
       via  2f5a678bdebd6f5374b1af8023c7d1d7ae54695b (commit)
       via  c8bac696642a361d73dfd74890170ed0402d9522 (commit)
       via  17292fed2c27ef03864d4d36a03e10e75882d017 (commit)
       via  585a84cf3614f13d8ae55ed13ec759011f0dcd37 (commit)
       via  67be5799c4ede7860a474e366fb2caed9ec4ba02 (commit)
       via  e24c67c1c3ba40c2e6a0730b53a2ebc90a5905d0 (commit)
       via  581b51f33fac880eecde93a6eaefd46995ea4adb (commit)
       via  71d4d1cd0529a4d6196fc4d648b5ebe7329dcdde (commit)
       via  9a9aabdabacb934e3bfabbc183a431592c56515f (commit)
       via  8566ecf002c13ed0ea3a832b4dcb82027c393bba (commit)
       via  7a17e2fe243db19d71b7398a157ca49714fb5d97 (commit)
       via  b67dc989dad3db66a9f197bc52be51e7775a08f9 (commit)
       via  acbbf51449ab89a02c8205016dd722b1b9ce0fff (commit)
      from  12dda84f6fb5dd8d6312aee968fef61d466d899e (commit)

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

- Log -----------------------------------------------------------------
commit d813a1df045eb2251c7f98c668b3ede11d98d9f1
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 07:53:17 2008 +0200

    ftrace now traces both PLT and entry point of one symbol correctly

commit 8706f5542e70a129369df9de56f310c61ea28be8
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 07:46:33 2008 +0200

    TaskTracer fetches return address from Arch again
    
    * ... until Frame grows enough brains to guess the right return address
      even without debuginfo.

commit a7ce267d0d0ef19ab6dacab5c6a3dea2e64f4c12
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 06:10:40 2008 +0200

    PLT entries now denoted plt:* instead of plt(*)

commit 12658130248781d757d1b9eb78a08f3ffe1ceb77
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 06:09:36 2008 +0200

    TaskTracer generates stack trace for PLT entries
    
    * Which it didn't before, because the shouldStackTraceOn query
      got the wrong token.

commit 3c432e2ae0b4b87c13b64e673699ba271fca57fd
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 06:06:13 2008 +0200

    New class ArchFormatter for arch-aware value formatting

commit 03592ef55d5138d0eb9e33c1004c5f5d4d792cc3
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 03:38:32 2008 +0200

    Fix ftrace man page

commit ff1d07bde1286f22653db516b420f3c7d179e4c1
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 03:29:57 2008 +0200

    Support PLT tracing in the ftrace commandline utility

commit e857a3bb9cde789d5b4e8fb85bc0738b595d1d0d
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 03:27:26 2008 +0200

    Ftrace rewrite
    
    * This one should have been pushed much earlier...

commit b25d02996cd40e589aaacd7a463fe3eeb32d9bd6
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 03:25:32 2008 +0200

    New class PLTRule

commit 5cb749c858be4bbd3163436ef7c43aa4f3ebf92f
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 03:19:18 2008 +0200

    BreakpointManager can set breakpoint on PLT entry

commit cbe5784633d6a798174c65c495c06ba9cf1cd765
Author: Petr Machata <pmachata@redhat.com>
Date:   Sun Apr 6 03:17:28 2008 +0200

    SymbolFactory can now compute PLT entries

commit 41069eded049c60874c1d091f84845b314e26dd2
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Apr 4 20:43:23 2008 +0200

    DwflModule can now compute PLT entries

commit 7f4737c3aeabf75644e3c7dd17bb2e04238604fc
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Apr 4 19:13:11 2008 +0200

    Use SymbolBuilder for DwflModule symtab loading
    
    * .. and also adjust symtab.SymbolFactory

commit 1051e087d994f157cc5082be2bbcc5f940659599
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Apr 4 15:11:28 2008 +0200

    Turn off version and alias handling in SymbolRule
    
    ... because it's not supported yet.

commit 2f5a678bdebd6f5374b1af8023c7d1d7ae54695b
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Apr 4 01:01:50 2008 +0200

    TaskTracer, new class that contains symbol tracing code

commit c8bac696642a361d73dfd74890170ed0402d9522
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 23:57:30 2008 +0200

    Realize observation in separate thread

commit 17292fed2c27ef03864d4d36a03e10e75882d017
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 23:55:24 2008 +0200

    Fix output formatting nit in Reporter

commit 585a84cf3614f13d8ae55ed13ec759011f0dcd37
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 23:53:36 2008 +0200

    SymbolBreakpoint can answer the symbol on which it's defined

commit 67be5799c4ede7860a474e366fb2caed9ec4ba02
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 17:00:44 2008 +0200

    Drop most of Ftrace framework

commit e24c67c1c3ba40c2e6a0730b53a2ebc90a5905d0
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 16:03:43 2008 +0200

    MemoryMapping uses String instead of File

commit 581b51f33fac880eecde93a6eaefd46995ea4adb
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 16:01:27 2008 +0200

    Mapping guard now uses frysk.symtab.SymbolFactory

commit 71d4d1cd0529a4d6196fc4d648b5ebe7329dcdde
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 15:45:44 2008 +0200

    FtraceController uses DwflSymbol instead of TracePoint
    
    * in future, TracePoint is likely to be used again to cover both
      symbol entry, and plt entry.  For now it's easier just to use
      DwflSymbol.

commit 9a9aabdabacb934e3bfabbc183a431592c56515f
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 14:46:32 2008 +0200

    Move stripped down ObjectFile to frysk.dwfl package

commit 8566ecf002c13ed0ea3a832b4dcb82027c393bba
Author: Petr Machata <pmachata@redhat.com>
Date:   Thu Apr 3 13:26:26 2008 +0200

    Make symtab.Symbol aware of its type

commit 7a17e2fe243db19d71b7398a157ca49714fb5d97
Author: Petr Machata <pmachata@redhat.com>
Date:   Wed Apr 2 18:23:26 2008 +0200

    New breakpoint type SymbolBreakpoint
    
    * only applies on the exact passed-in symbol, as opposed to
      FunctionBreakpoint which applies in all modules where the
      symbol is defined

commit b67dc989dad3db66a9f197bc52be51e7775a08f9
Author: Petr Machata <pmachata@redhat.com>
Date:   Wed Apr 2 18:08:50 2008 +0200

    Drop ftrace -dyn option

commit acbbf51449ab89a02c8205016dd722b1b9ce0fff
Author: Petr Machata <pmachata@redhat.com>
Date:   Wed Apr 2 03:08:19 2008 +0200

    DwflSymbol now tracks DwflModule of its origin

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

Summary of changes:
 frysk-core/frysk/bindir/ChangeLog                  |   15 +-
 frysk-core/frysk/bindir/ftrace.java                |   80 ++-
 frysk-core/frysk/bindir/ftrace.xml-in              |   61 +--
 frysk-core/frysk/dwfl/ChangeLog                    |    4 +
 frysk-core/frysk/dwfl/ObjectFile.java              |  257 ++++++++
 frysk-core/frysk/ftrace/ChangeLog                  |   99 ++++
 frysk-core/frysk/ftrace/Ftrace.java                |  291 ++++------
 frysk-core/frysk/ftrace/FtraceController.java      |   91 ++--
 frysk-core/frysk/ftrace/Ltrace.java                |  392 -------------
 frysk-core/frysk/ftrace/MappingGuard.java          |  137 ++---
 frysk-core/frysk/ftrace/MemoryMapping.java         |   12 +-
 frysk-core/frysk/ftrace/ObjectFile.java            |  613 --------------------
 .../ftrace/{TracePointFilter.java => PLTRule.java} |   33 +-
 frysk-core/frysk/ftrace/Reporter.java              |   36 +-
 frysk-core/frysk/ftrace/Symbol.java                |  165 ------
 frysk-core/frysk/ftrace/SymbolRule.java            |   24 +-
 frysk-core/frysk/ftrace/TaskTracer.java            |  321 ++++++++++
 frysk-core/frysk/ftrace/TestLtrace.java            |  545 -----------------
 frysk-core/frysk/ftrace/TestMappingGuard.java      |   10 +-
 frysk-core/frysk/ftrace/TracePoint.java            |   91 ---
 frysk-core/frysk/ftrace/TracePointOrigin.java      |   72 ---
 frysk-core/frysk/rt/BreakpointManager.java         |   65 ++-
 frysk-core/frysk/rt/ChangeLog                      |   18 +
 frysk-core/frysk/rt/FunctionBreakpoint.java        |    5 +-
 .../PLTBreakpoint.java}                            |   46 +-
 .../SymbolBreakpoint.java}                         |   58 ++-
 frysk-core/frysk/stack/ChangeLog                   |    5 +
 frysk-core/frysk/stack/Frame.java                  |    9 +-
 frysk-core/frysk/symtab/ChangeLog                  |   29 +
 frysk-core/frysk/symtab/DwflSymbol.java            |   19 +-
 .../ModuleMatcher.java}                            |   23 +-
 .../TracePointFilter.java => symtab/PLTEntry.java} |   38 +-
 frysk-core/frysk/symtab/SymbolFactory.java         |  111 +++-
 .../ArchFormatter.java}                            |   40 +-
 frysk-core/frysk/util/ChangeLog                    |    5 +
 frysk-sys/lib/dwfl/ChangeLog                       |   12 +
 frysk-sys/lib/dwfl/DwflModule.java                 |   10 +-
 frysk-sys/lib/dwfl/cni/DwflModule.cxx              |  160 +++++-
 38 files changed, 1517 insertions(+), 2485 deletions(-)
 create mode 100644 frysk-core/frysk/dwfl/ObjectFile.java
 delete mode 100644 frysk-core/frysk/ftrace/Ltrace.java
 delete mode 100644 frysk-core/frysk/ftrace/ObjectFile.java
 copy frysk-core/frysk/ftrace/{TracePointFilter.java => PLTRule.java} (77%)
 delete mode 100644 frysk-core/frysk/ftrace/Symbol.java
 create mode 100644 frysk-core/frysk/ftrace/TaskTracer.java
 delete mode 100644 frysk-core/frysk/ftrace/TestLtrace.java
 delete mode 100644 frysk-core/frysk/ftrace/TracePoint.java
 delete mode 100644 frysk-core/frysk/ftrace/TracePointOrigin.java
 copy frysk-core/frysk/{ftrace/FunctionObserver.java => rt/PLTBreakpoint.java} (77%)
 copy frysk-core/frysk/{ftrace/FunctionObserver.java => rt/SymbolBreakpoint.java} (66%)
 copy frysk-core/frysk/{ftrace/TracePointFilter.java => symtab/ModuleMatcher.java} (76%)
 rename frysk-core/frysk/{ftrace/TracePointFilter.java => symtab/PLTEntry.java} (76%)
 rename frysk-core/frysk/{ftrace/FunctionObserver.java => util/ArchFormatter.java} (74%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
index 630d35f..e395122 100644
--- a/frysk-core/frysk/bindir/ChangeLog
+++ b/frysk-core/frysk/bindir/ChangeLog
@@ -1,3 +1,12 @@
+2008-04-06  Petr Machata  <pmachata@redhat.com>
+
+	* ftrace.xml: Fix man page to reflect recent changes.
+
+2008-04-06  Petr Machata  <pmachata@redhat.com>
+
+	* ftrace.java: Support plt tracing using new ftrace
+	infrastructure.
+
 2008-04-04  Andrew Cagney  <cagney@redhat.com>
 
 	* fauxv.xml-in: Rename fauxv.xml.
@@ -27,7 +36,7 @@
 	* fmaps.xml: Likewise.
 	
 2008-04-02  Andrew Cagney  <cagney@redhat.com>
-
+	
 	* fstack.xml: Use a title and volume entity.
 	* fauxv.xml: Add standard options and version.
 	* fmaps.xml: Ditto.
@@ -40,6 +49,10 @@
 	* fcatch.xml: Ditto.
 	* ftrace.xml: Ditto.
 
+2008-04-02  Petr Machata  <pmachata@redhat.com>
+	
+	* ftrace.java: Drop dynamic entry point tracing.
+
 2008-04-01  Andrew Cagney  <cagney@redhat.com>
 
 	* TestFstack.java: Ditto.
diff --git a/frysk-core/frysk/bindir/ftrace.java b/frysk-core/frysk/bindir/ftrace.java
index fd759a5..b82b090 100644
--- a/frysk-core/frysk/bindir/ftrace.java
+++ b/frysk-core/frysk/bindir/ftrace.java
@@ -39,29 +39,32 @@
 
 package frysk.bindir;
 
-import frysk.debuginfo.PrintStackOptions;
-import frysk.util.StackPrintUtil;
-import inua.util.PrintWriter;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.regex.Pattern;
+
+import gnu.classpath.tools.getopt.Option;
+import gnu.classpath.tools.getopt.OptionException;
+import gnu.classpath.tools.getopt.OptionGroup;
+import inua.util.PrintWriter;
+
+import frysk.debuginfo.PrintStackOptions;
 import frysk.ftrace.Ftrace;
+import frysk.ftrace.FtraceController;
+import frysk.ftrace.PLTRule;
+import frysk.ftrace.Rule;
+import frysk.ftrace.SymbolRule;
 import frysk.isa.signals.Signal;
 import frysk.isa.syscalls.Syscall;
 import frysk.proc.Proc;
+import frysk.rsl.Log;
 import frysk.util.CommandlineParser;
 import frysk.util.Glob;
+import frysk.util.StackPrintUtil;
 import frysk.util.Util;
-import gnu.classpath.tools.getopt.Option;
-import gnu.classpath.tools.getopt.OptionGroup;
-import gnu.classpath.tools.getopt.OptionException;
-import frysk.ftrace.Rule;
-import frysk.ftrace.SymbolRule;
-import frysk.ftrace.FtraceController;
-import frysk.rsl.Log;
 
 class ftrace {
     private static final Log fine = Log.fine(ftrace.class);
@@ -78,7 +81,6 @@ class ftrace {
     // apply rules separately, to get all log messages, that's the
     // reason we need these temporary array lists.
     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();
@@ -89,7 +91,12 @@ class ftrace {
 	= new PrintStackOptions();
     private final Ftrace tracer = new Ftrace(stackPrintOptions);
 
-    private List parseSymbolRules(String arg) {
+    private interface SymbolRuleCreator {
+	Rule createRule(boolean addition, boolean stackTrace,
+			String nameRe, String sonameRe, String versionRe);
+    }
+
+    private List parseSymbolRules(String arg, SymbolRuleCreator creator) {
 	String[] strs = arg.split(",", -1);
 	List rules = new ArrayList();
 	for (int i = 0; i < strs.length; ++i) {
@@ -140,8 +147,10 @@ class ftrace {
 	    else
 		symbolRe = null;
 
-	    fine.log(i + ": " + str + ": symbol=" + symbolRe + ", soname=" + sonameRe + ", version=" + versionRe);
-	    SymbolRule rule = new SymbolRule(addition, stackTrace, symbolRe, sonameRe, versionRe);
+	    fine.log(i + ": " + str + ": symbol=" + symbolRe
+		     + ", soname=" + sonameRe + ", version=" + versionRe);
+	    Rule rule = creator.createRule(addition, stackTrace,
+					   symbolRe, sonameRe, versionRe);
 	    rules.add(rule);
 	}
 	return rules;
@@ -289,12 +298,7 @@ class ftrace {
 		    pltRules.add(arg);
 		}
 	    });
-	group.add(new Option("dyn", "trace entry points from DYNAMIC symtab", "RULE[,RULE]...") {
-		public void parsed(String arg) {
-		    dynRules.add(arg);
-		}
-	    });
-	group.add(new Option("sym", "trace entry points from symbol table", "RULE[,RULE]...") {
+	group.add(new Option("sym", "trace function entry points", "RULE[,RULE]...") {
 		public void parsed(String arg) {
 		    symRules.add(arg);
 		}
@@ -336,21 +340,41 @@ class ftrace {
             writer = new PrintWriter(System.out);
         tracer.setWriter(writer);
 
-	if (!pltRules.isEmpty() || !dynRules.isEmpty() || !symRules.isEmpty()) {
+	if (!pltRules.isEmpty() || !symRules.isEmpty()) {
 	    // If tracing dynamic linker disabled, generate implicit
 	    // -@INTERP rule at the end of the chain.
 	    if (!allowInterpTracing) {
 		pltRules.add("-@INTERP");
-		dynRules.add("-@INTERP");
 		symRules.add("-@INTERP");
 	    }
 
-	    for (Iterator it = pltRules.iterator(); it.hasNext(); )
-		controller.gotPltRules(parseSymbolRules((String)it.next()));
-	    for (Iterator it = dynRules.iterator(); it.hasNext(); )
-		controller.gotDynRules(parseSymbolRules((String)it.next()));
-	    for (Iterator it = symRules.iterator(); it.hasNext(); )
-		controller.gotSymRules(parseSymbolRules((String)it.next()));
+	    class SymbolCreator implements SymbolRuleCreator {
+		public Rule createRule(boolean addition, boolean stackTrace,
+				       String nameRe, String sonameRe,
+				       String versionRe) {
+		    return new SymbolRule(addition, stackTrace,
+					  nameRe, sonameRe, versionRe);
+		}
+	    }
+	    SymbolRuleCreator symbolCreator = new SymbolCreator();
+	    for (Iterator it = symRules.iterator(); it.hasNext(); ) {
+		List rules = parseSymbolRules((String)it.next(), symbolCreator);
+		controller.gotSymRules(rules);
+	    }
+
+	    class PLTCreator implements SymbolRuleCreator {
+		public Rule createRule(boolean addition, boolean stackTrace,
+				       String nameRe, String sonameRe,
+				       String versionRe) {
+		    return new PLTRule(addition, stackTrace,
+				       nameRe, sonameRe, versionRe);
+		}
+	    }
+	    SymbolRuleCreator pltCreator = new PLTCreator();
+	    for (Iterator it = pltRules.iterator(); it.hasNext(); ) {
+		List rules = parseSymbolRules((String)it.next(), pltCreator);
+		controller.gotPltRules(rules);
+	    }
 
 	    tracer.setTraceFunctions(controller, controller);
 	}
diff --git a/frysk-core/frysk/bindir/ftrace.xml-in b/frysk-core/frysk/bindir/ftrace.xml-in
index e4f782a..cda22db 100644
--- a/frysk-core/frysk/bindir/ftrace.xml-in
+++ b/frysk-core/frysk/bindir/ftrace.xml-in
@@ -71,21 +71,21 @@
 
   <refnamediv>
     <refname>ftrace</refname>
-    <refpurpose>trace system and function calls</refpurpose>
+    <refpurpose>trace system calls, function calls and signals</refpurpose>
   </refnamediv>
   
   <refsynopsisdiv>
     <cmdsynopsis>
       <command>ftrace</command>
       <arg choice="opt">-c</arg>
-      <arg choice="opt">-i</arg>
+      <arg choice="opt">-dl</arg>
       <arg choice="opt">-m</arg>
       <arg choice="opt">-o=<replaceable>FILE</replaceable></arg>
       <arg choice="opt" rep="repeat">-p=<replaceable>PID</replaceable></arg>
+      <arg choice="opt">-pc</arg>
       <arg choice="opt">-sys=<replaceable>SYSCALL</replaceable>[,<replaceable>SYSCALL</replaceable>...]</arg>
       <arg choice="opt">-sig=<replaceable>SIG</replaceable>[,<replaceable>SIG</replaceable>...]</arg>
       <arg choice="opt">-plt=<replaceable>RULE</replaceable>[,<replaceable>RULE</replaceable>...]</arg>
-      <arg choice="opt">-dyn=<replaceable>RULE</replaceable>[,<replaceable>RULE</replaceable>...]</arg>
       <arg choice="opt">-sym=<replaceable>RULE</replaceable>[,<replaceable>RULE</replaceable>...]</arg>
       <arg choice="opt">-stack</arg>
       <arg choice="opt">--</arg>
@@ -150,16 +150,6 @@
 	      <replaceable>SIGNAL</replaceable> syntax.</para>
 	    </listitem>
 	  </varlistentry>
-
-	  <varlistentry>
-	    <term>-stack</term>
-	    <listitem>
-	      <para>Stack trace when traced system call is hit.  Note
-	      that this option also applies to traced symbols.  If you
-	      need to cherry-pick which event should stack trace, use
-	      # operator described in sections below.</para>
-	    </listitem>
-	  </varlistentry>
 	</variablelist>
     </refsect2>
 
@@ -168,7 +158,7 @@
 
 	<variablelist>
 	  <varlistentry>
-	    <term>-i</term>
+	    <term>-dl</term>
 	    <listitem>
 	      <para>Trace inside dynamic linker.  When this option is
 	      not present, <function>ftrace</function> will function
@@ -192,7 +182,7 @@
 	  </varlistentry>
 
 	  <varlistentry>
-	    <term>-dyn=<replaceable>SYMBOL</replaceable>[,<replaceable>SYMBOL</replaceable>...]</term>
+	    <term>-sym=<replaceable>SYMBOL</replaceable>[,<replaceable>SYMBOL</replaceable>...]</term>
 	    <listitem>
 	      <para>Trace calls through the symbol entry points.  By
 	      tracing entry points, you catch all calls that end up at
@@ -208,14 +198,26 @@
 	    </listitem>
 	  </varlistentry>
 
+	</variablelist>
+    </refsect2>
+
+    <refsect2>
+	<title>Other Options</title>
+
+	<variablelist>
 	  <varlistentry>
-	    <term>-sym=<replaceable>SYMBOL</replaceable>[,<replaceable>SYMBOL</replaceable>...]</term>
+	    <term>-m</term>
+	    <listitem>
+	      <para>Print each file mapped to or unmapped from address
+    	      space of the traced process.</para>
+	    </listitem>
+	  </varlistentry>
+
+	  <varlistentry>
+	    <term>-pc</term>
 	    <listitem>
-	      <para>Just like <option>-dyn</option>, but doesn't look for
-	      symbols in dynamic symbol table, but normal symbol table.
-	      (Which doesn't have to be present, e.g. when a binary is
-	      stripped.)  See below for description of
-	      <replaceable>SYMBOL</replaceable> rule syntax.</para>
+	      <para>Show the value of instruction pointer at each
+	      reported event.</para>
 	    </listitem>
 	  </varlistentry>
 
@@ -228,21 +230,6 @@
 	      # operator described in sections below.</para>
 	    </listitem>
 	  </varlistentry>
-
-	</variablelist>
-    </refsect2>
-
-    <refsect2>
-	<title>Other Traceable Events</title>
-
-	<variablelist>
-	  <varlistentry>
-	    <term>-m</term>
-	    <listitem>
-	      <para>Print each file mapped to or unmapped from address
-    	      space of the traced process.</para>
-	    </listitem>
-	  </varlistentry>
 	</variablelist>
     </refsect2>
 
@@ -298,7 +285,7 @@
     against version associated with symbol.  If the symbol has no
     associated version, it is considered to be an empty string.  (It
     is possible to request symbol without a version with the pattern
-    "foo@@".)</para>
+    "foo@@".)  NOTE: This is currently not implemented.</para>
 
     <para>Empty rule is considered to miss all components.</para>
   </refsect1>
diff --git a/frysk-core/frysk/dwfl/ChangeLog b/frysk-core/frysk/dwfl/ChangeLog
index 061af2d..b9be447 100644
--- a/frysk-core/frysk/dwfl/ChangeLog
+++ b/frysk-core/frysk/dwfl/ChangeLog
@@ -1,3 +1,7 @@
+2008-04-03  Petr Machata  <pmachata@redhat.com>
+
+	* ObjectFile.java: Moved from frysk.ftrace
+
 2008-03-11  Stan Cox  <scox@redhat.com>
 
 	* DwflCache.java (Mod.sysroot): Remove
diff --git a/frysk-core/frysk/dwfl/ObjectFile.java b/frysk-core/frysk/dwfl/ObjectFile.java
new file mode 100644
index 0000000..914e050
--- /dev/null
+++ b/frysk-core/frysk/dwfl/ObjectFile.java
@@ -0,0 +1,257 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 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.dwfl;
+
+import java.io.File;
+import java.util.HashMap;
+
+import lib.dwfl.Elf;
+import lib.dwfl.ElfCommand;
+import lib.dwfl.ElfData;
+import lib.dwfl.ElfDynamic;
+import lib.dwfl.ElfEHeader;
+import lib.dwfl.ElfPHeader;
+import lib.dwfl.ElfSection;
+import lib.dwfl.ElfSectionHeader;
+import lib.dwfl.ElfFileException;
+import lib.dwfl.ElfException;
+
+import frysk.rsl.Log;
+import frysk.rsl.LogFactory;
+
+/**
+ * What ltrace needs to know about each loaded executable or shared
+ * library.
+ */
+public class ObjectFile
+{
+    static private final Log warning = LogFactory.warning(ObjectFile.class);
+    static private final Log fine = LogFactory.fine(ObjectFile.class);
+    static private final Log finest = LogFactory.finest(ObjectFile.class);
+
+    private File filename;
+    private String soname = null;
+    private String interp = null;
+    private File resolvedInterp = null;
+    private ElfSection dynamicStrtab = null;
+
+    private static HashMap cachedFiles = new HashMap();
+
+    private static void assertFitsToInt(long num, String context) {
+	int numi = (int)num;
+	if ((long)numi != num)
+	    throw new ArithmeticException(context + ": " + num + " doesn't fit into int.");
+    }
+
+    protected ObjectFile(File file, final Elf elfFile, ElfEHeader eh) {
+	this.filename = file;
+
+	long offDynamic = -1;
+	for (int i = 0; i < eh.phnum; ++i) {
+	    ElfPHeader ph = elfFile.getPHeader(i);
+	    if (ph.type == ElfPHeader.PTYPE_DYNAMIC) {
+		offDynamic = ph.offset;
+		finest.log("Found DYNAMIC segment.");
+		if (this.interp != null) // interp already loaded?
+		    break;
+	    }
+	    else if (ph.type == ElfPHeader.PTYPE_INTERP) {
+		ElfData interpData = elfFile.getRawData(ph.offset, ph.filesz - 1); // -1 for trailing zero
+		String interp = new String(interpData.getBytes());
+		this.setInterp(interp);
+		finest.log("Found INTERP `" + interp + "'.");
+		if (offDynamic != -1) // already seen dynamic?
+		    break;
+	    }
+	}
+
+	if (eh.type != ElfEHeader.PHEADER_ET_EXEC
+	    && eh.type != ElfEHeader.PHEADER_ET_DYN)
+	    throw new ElfFileException(file, "Failed, unsupported ELF file type.");
+
+	boolean foundDynamic = false;
+
+	class Locals {
+	    public int dynamicSonameIdx = -1;
+	}
+	final Locals locals = new Locals();
+
+	// Find & interpret DYNAMIC section.
+	if (offDynamic != -1) {
+	    for (ElfSection section = elfFile.getSection(0);
+		 section != null;
+		 section = elfFile.getNextSection(section))
+	    {
+		ElfSectionHeader sheader = section.getSectionHeader();
+		if (sheader.offset == offDynamic) {
+		    finest.log("Processing DYNAMIC section.");
+		    foundDynamic = true;
+		    ElfDynamic.loadFrom(section, new ElfDynamic.Builder() {
+			    public void entry (int tag, long value) {
+				if (tag == ElfDynamic.ELF_DT_STRTAB) {
+				    finest.log(" * dynamic strtab at 0x" + Long.toHexString(value));
+				    ObjectFile.this.dynamicStrtab = getElfSectionWithAddr(elfFile, value);
+				}
+				else if (tag == ElfDynamic.ELF_DT_SONAME) {
+				    finest.log(" * soname index = 0x" + Long.toHexString(value));
+				    assertFitsToInt(value, "SONAME index");
+				    locals.dynamicSonameIdx = (int)value;
+				}
+			    }
+			});
+		}
+	    }
+
+	    // Elf consistency sanity checks.
+	    if (!foundDynamic)
+		throw new ElfFileException(file, "DYNAMIC section not found in ELF file.");
+	    if (this.dynamicStrtab == null)
+		throw new ElfFileException(file, "Couldn't get STRTAB from DYNAMIC section.");
+	}
+
+	// Read SONAME, if there was one.
+	if (locals.dynamicSonameIdx != -1) {
+	    finest.log("Reading SONAME.");
+	    ElfData data = this.dynamicStrtab.getData();
+	    byte[] bytes = data.getBytes();
+	    int startIndex = locals.dynamicSonameIdx;
+	    int endIndex = startIndex;
+	    while (bytes[endIndex] != 0)
+		++endIndex;
+	    String name = new String(bytes, startIndex, endIndex - startIndex);
+	    this.setSoname(name);
+	    finest.log("Found SONAME ", name);
+	}
+
+	fine.log("Loading finished successfully.");
+    }
+
+    protected void setSoname(String soname) {
+	this.soname = soname;
+    }
+
+    /**
+     * Either answer primed soname, or construct soname from filename.


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


                 reply	other threads:[~2008-04-06  6:32 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=20080406063217.28791.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).