From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15950 invoked by alias); 8 Oct 2007 10:46:37 -0000 Received: (qmail 15941 invoked by uid 22791); 8 Oct 2007 10:46:37 -0000 X-Spam-Status: No, hits=-0.0 required=5.0 tests=AWL,BAYES_00,DK_POLICY_SIGNSOME,FORGED_RCVD_HELO,TW_DW,URIBL_BLACK X-Spam-Check-By: sourceware.org Received: from wildebeest.demon.nl (HELO gnu.wildebeest.org) (83.160.170.119) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 08 Oct 2007 10:46:26 +0000 Received: from dijkstra.wildebeest.org ([192.168.1.29]) by gnu.wildebeest.org with esmtp (Exim 4.63) (envelope-from ) id 1Ieq7u-00019R-7n; Mon, 08 Oct 2007 12:46:23 +0200 Subject: Re: Corefile -arch 32 test failures with breakpoint and stacktrace tests From: Mark Wielaard To: Phil Muldoon Cc: Frysk Hackers In-Reply-To: <47074377.5040602@redhat.com> References: <47074377.5040602@redhat.com> Content-Type: multipart/mixed; boundary="=-6GOV9SJq6+l+pr4jf/HA" Date: Mon, 08 Oct 2007 10:46:00 -0000 Message-Id: <1191840378.3859.20.camel@dijkstra.wildebeest.org> Mime-Version: 1.0 X-Mailer: Evolution 2.8.3 (2.8.3-2.fc6) X-Spam-Score: -4.4 (----) X-Virus-Checked: Checked by ClamAV on sourceware.org X-IsSubscribed: yes Mailing-List: contact frysk-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-owner@sourceware.org X-SW-Source: 2007-q4/txt/msg00024.txt.bz2 --=-6GOV9SJq6+l+pr4jf/HA Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1182 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 * 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 --=-6GOV9SJq6+l+pr4jf/HA Content-Disposition: inline; filename=elf-dwfl-core.patch Content-Type: text/x-patch; name=elf-dwfl-core.patch; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 3515 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 + + * TestLinuxCore.java (Symbol): New static helper class. + (getFunctionEntryAddress): Use Dwfl directly instead of + constructing Elf and Dwarf objects directly. + 2007-10-02 Andrew Cagney * 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(); } /** --=-6GOV9SJq6+l+pr4jf/HA--