From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13232 invoked by alias); 12 Apr 2008 22:24:30 -0000 Received: (qmail 13224 invoked by uid 22791); 12 Apr 2008 22:24:29 -0000 X-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00 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; Sat, 12 Apr 2008 22:24:12 +0000 Received: from wildebeest.demon.nl ([83.160.170.119] helo=[127.0.0.1]) by gnu.wildebeest.org with esmtp (Exim 4.63) (envelope-from ) id 1Jko8m-0006LT-Ff; Sun, 13 Apr 2008 00:24:09 +0200 Subject: [patch] Explicit test for bug #6029 and use outer frame address for return in TaskTracer again From: Mark Wielaard To: frysk Cc: Petr Machata Content-Type: multipart/mixed; boundary="=-yX5htRPfWi6wiKMujWaM" Date: Mon, 14 Apr 2008 12:00:00 -0000 Message-Id: <1208039047.16022.4.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-3.fc8) X-Spam-Score: -3.7 (---) 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: 2008-q2/txt/msg00050.txt.bz2 --=-yX5htRPfWi6wiKMujWaM Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 650 Hi, This adds an explicit test for bug #6029 (fixed yesterday) and ftrace TaskTracer now user the outer frame address again for getting the return address instead of its own method. This should give the code a bit more exposure. frysk-core/frysk/stack/ChangeLog 2008-04-12 Mark Wielaard * TestFrame.java (testInnerFrameAddress): New test for bug #6029. frysk-core/frysk/ftrace/ChangeLog 2008-04-16 Mark Wielaard * TaskTracer.java (getReturnAddress): Fetch the return address through outer frame address again. No regressions on x86 and x86_64 fedora 8. Committed and pushed, Mark --=-yX5htRPfWi6wiKMujWaM Content-Disposition: inline; filename=6029-extra.patch Content-Type: text/x-patch; name=6029-extra.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 2721 diff --git a/frysk-core/frysk/ftrace/TaskTracer.java b/frysk-core/frysk/ftrace/TaskTracer.java index 6aa71dc..b2625dc 100644 --- a/frysk-core/frysk/ftrace/TaskTracer.java +++ b/frysk-core/frysk/ftrace/TaskTracer.java @@ -56,6 +56,7 @@ 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; @@ -234,8 +235,7 @@ class TaskTracer private long getReturnAddress(Task task) { try { - //return StackFactory.createFrame(task).getOuter().getAddress(); - return arch.getReturnAddress(task); + return StackFactory.createFrame(task).getOuter().getAddress(); } catch (java.lang.NullPointerException npe) { return 0; } diff --git a/frysk-core/frysk/stack/TestFrame.java b/frysk-core/frysk/stack/TestFrame.java index c647efa..acfa56a 100644 --- a/frysk-core/frysk/stack/TestFrame.java +++ b/frysk-core/frysk/stack/TestFrame.java @@ -211,4 +211,58 @@ public class TestFrame extends TestLib { assertRunUntilStop("wait for hit"); assertTrue(code.hit); } + + /** + * Explicit test for bug #6029. Make sure that when generating + * backtrace in the updateHit() method the address is correct. + */ + public void testInnerFrameAddress() throws ElfException + { + String[] cmd = + { Config.getPkgLibFile("funit-hello").getPath(), "world" }; + DaemonBlockedAtEntry child = new DaemonBlockedAtEntry(cmd); + Task task = child.getMainTask(); + Info info = new Info(task); + + long address = info.getFunctionEntryAddress("print"); + CodeObserver code = new CodeObserver(); + task.requestAddCodeObserver(code, address); + assertRunUntilStop("add breakpoint observer"); + + child.requestRemoveBlock(); + assertFalse(code.hit); + assertRunUntilStop("wait for hit"); + assertTrue(code.hit); + } + + static class CodeObserver implements TaskObserver.Code + { + public boolean hit = false; + + public Action updateHit (Task task, long hitAddress) + { + hit = true; + long frameAddress = StackFactory.createFrame(task).getAddress(); + assertEquals("Hit and Frame address", hitAddress, frameAddress); + + Manager.eventLoop.requestStop(); + return Action.BLOCK; + } + + public void addFailed (Object observable, Throwable w) + { + // Whoa + w.printStackTrace(); + } + + public void addedTo (Object observable) + { + Manager.eventLoop.requestStop(); + } + + public void deletedFrom (Object observable) + { + // We never delete + } + } } --=-yX5htRPfWi6wiKMujWaM--