This is the mail archive of the frysk@sourceware.org mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Corefile -arch 32 test failures with breakpoint and stacktrace tests


Hi Phil,

On Sat, 2007-10-06 at 09:12 +0100, Phil Muldoon wrote:
> I've spent the last week fixing 32 on 64 test failures with core files, 
> and while all tests passed on my local build, when I merged with HEAD, I 
> got as noted below in the email. I suspect these are  changes made in 
> the last week or so.
> 
> Basically the tests now failing are:
> 
> 1) 
> testInsertedBreakpoint(frysk.proc.dead.TestLinuxCore)lib.dwfl.ElfFileException

This one works fine for me either with or without -arch 32 given to
TestRunner. But I noticed that it tries to create an Elf object directly
using the result of getProc() which isn't reliably since getProc()
"guesses" the path to the original executable. The attached patch makes
it use the new DwflCache.get(Task) construct for finding symbols. Hope
that helps in your case. If not it is at least more correct.

2007-10-08  Mark Wielaard  <mwielaard@redhat.com>

        * TestLinuxCore.java (Symbol): New static helper class.
        (getFunctionEntryAddress): Use Dwfl directly instead of
        constructing Elf and Dwarf objects directly.

The tests PASS here with or without the patch and with or without -arch
32.

Cheers,

Mark
Index: frysk-core/frysk/proc/dead/ChangeLog
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/proc/dead/ChangeLog,v
retrieving revision 1.32
diff -u -r1.32 ChangeLog
--- frysk-core/frysk/proc/dead/ChangeLog	2 Oct 2007 22:31:50 -0000	1.32
+++ frysk-core/frysk/proc/dead/ChangeLog	8 Oct 2007 10:44:52 -0000
@@ -1,3 +1,9 @@
+2007-10-08  Mark Wielaard  <mwielaard@redhat.com>
+
+	* TestLinuxCore.java (Symbol): New static helper class.
+	(getFunctionEntryAddress): Use Dwfl directly instead of
+	constructing Elf and Dwarf objects directly.
+	
 2007-10-02  Andrew Cagney  <cagney@redhat.com>
 
 	* LinuxProc.java (sendrecISA()): Add.
Index: frysk-core/frysk/proc/dead/TestLinuxCore.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/proc/dead/TestLinuxCore.java,v
retrieving revision 1.16
diff -u -r1.16 TestLinuxCore.java
--- frysk-core/frysk/proc/dead/TestLinuxCore.java	10 Aug 2007 18:54:34 -0000	1.16
+++ frysk-core/frysk/proc/dead/TestLinuxCore.java	8 Oct 2007 10:44:52 -0000
@@ -45,7 +45,6 @@
 import java.io.File;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.util.ArrayList;
 
 import frysk.proc.Action;
 import frysk.proc.Isa;
@@ -67,6 +66,7 @@
 import frysk.testbed.LegacyOffspring;
 
 import lib.dwfl.*;
+import frysk.dwfl.*;
 
 public class TestLinuxCore
     extends TestLib
@@ -387,22 +387,66 @@
     assertEquals(origb, coreb);
   }
 
+
+  // Helper class since there there isn't a get symbol method in Dwfl,
+  // so we need to wrap it all in a builder pattern.
+  static class Symbol implements SymbolBuilder
+  {
+    private String name;
+    private long address;
+
+    private boolean found;
+
+    private Symbol()
+    {
+      // properties get set in public static get() method.
+    }
+
+    static Symbol get(Dwfl dwfl, String name)
+    {
+      Symbol sym = new Symbol();
+      sym.name = name;
+      DwflModule[] modules = dwfl.getModules();
+      for (int i = 0; i < modules.length && ! sym.found; i++)
+        modules[i].getSymbolByName(name, sym);
+
+      if (sym.found)
+        return sym;
+      else
+        return null;
+    }
+
+    String getName()
+    {
+      return name;
+    }
+
+    long getAddress()
+    {
+      return address;
+    }
+
+    public void symbol(String name, long value, long size,
+                       int type, int bind, int visibility)
+    {
+      if (name.equals(this.name))
+        {
+          this.address = value;
+          this.found = true;
+        }
+    }
+  }
+
   /**
-   * Returns the address of the requested function through query the
-   * Proc Elf and DwarfDie. Asserts that the function has only 1
-   * entry point.
+   * Returns the address of the requested function through query Dwfl
+   * of the main Task of the given Proc.
    */
   private static long getFunctionEntryAddress(Proc proc, String func)
-    throws ElfException
   {
-    Elf elf = new Elf(proc.getExe(), ElfCommand.ELF_C_READ);
-    Dwarf dwarf = new Dwarf(elf, DwarfCommand.READ, null);
-    DwarfDie die = DwarfDie.getDecl(dwarf, func);
-    ArrayList entryAddrs = die.getEntryBreakpoints();
-    
-    // We really expect just one entry point.
-    assertEquals(entryAddrs.size(), 1);
-    return ((Long) entryAddrs.get(0)).longValue();
+    Task task = proc.getMainTask();
+    Dwfl dwfl = DwflCache.getDwfl(task);
+    Symbol sym = Symbol.get(dwfl, func);
+    return sym.getAddress();
   }
 
   /**

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]