From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8943 invoked by alias); 19 Mar 2008 23:25:59 -0000 Received: (qmail 8917 invoked by uid 9112); 19 Mar 2008 23:25:59 -0000 Date: Wed, 19 Mar 2008 23:25:00 -0000 Message-ID: <20080319232559.8902.qmail@sourceware.org> From: mark@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Always allow instruction stepping through SteppingEngine. Fixes bug #5907. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: d24ca531c9232260facb01c95eecab0263f4d391 X-Git-Newrev: 6fa3545e8cdb22a71bc2dfbcc701cf2d232e4bc0 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q1/txt/msg00412.txt.bz2 The branch, master has been updated via 6fa3545e8cdb22a71bc2dfbcc701cf2d232e4bc0 (commit) from d24ca531c9232260facb01c95eecab0263f4d391 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 6fa3545e8cdb22a71bc2dfbcc701cf2d232e4bc0 Author: Mark Wielaard Date: Thu Mar 20 00:06:34 2008 +0100 Always allow instruction stepping through SteppingEngine. Fixes bug #5907. frysk-core/frysk/stepping/ChangeLog 2008-03-19 Mark Wielaard * InstructionStepState.java (InstructionStepState): Take and set isLine argument. (handleUpdate): Only try skipping plt when line stepping. * LineStepState.java (handleUpdate): When no line info found act like an InstructionStepState. * SteppingEngine.java (stepInstruction): Create InstructionStepState for instruction stepping. (stepInstruction): Likewise. (stepLine): Create InstructionStepState for line stepping. (setUp): Create InstructionStepState using isLine. * TestStepping.java (testInstructionStepThroughSection): Just do one line step. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/stepping/ChangeLog | 15 ++++++++++ .../frysk/stepping/InstructionStepState.java | 29 ++++++++++++++----- frysk-core/frysk/stepping/LineStepState.java | 12 +++++--- frysk-core/frysk/stepping/SteppingEngine.java | 8 +++--- frysk-core/frysk/stepping/TestStepping.java | 7 ----- 5 files changed, 48 insertions(+), 23 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/stepping/ChangeLog b/frysk-core/frysk/stepping/ChangeLog index 4c18972..5efeee7 100644 --- a/frysk-core/frysk/stepping/ChangeLog +++ b/frysk-core/frysk/stepping/ChangeLog @@ -1,3 +1,18 @@ +2008-03-19 Mark Wielaard + + * InstructionStepState.java (InstructionStepState): Take and set + isLine argument. + (handleUpdate): Only try skipping plt when line stepping. + * LineStepState.java (handleUpdate): When no line info found act + like an InstructionStepState. + * SteppingEngine.java (stepInstruction): Create InstructionStepState + for instruction stepping. + (stepInstruction): Likewise. + (stepLine): Create InstructionStepState for line stepping. + (setUp): Create InstructionStepState using isLine. + * TestStepping.java (testInstructionStepThroughSection): Just do one + line step. + 2008-03-18 Andrew Cagney * SteppingEngine.java: Block terminating tasks. diff --git a/frysk-core/frysk/stepping/InstructionStepState.java b/frysk-core/frysk/stepping/InstructionStepState.java index 4baea23..6e20c2f 100644 --- a/frysk-core/frysk/stepping/InstructionStepState.java +++ b/frysk-core/frysk/stepping/InstructionStepState.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// 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 @@ -49,8 +49,15 @@ public class InstructionStepState extends State { private ElfSectionCache elfCache; private final String PLT_DL_FIXUP = "_dl_fixup"; - public InstructionStepState(Task task) { + /** + * Indicates that this is a step (into) line, if true then plt + * entries are skipped. + */ + private final boolean isLine; + + public InstructionStepState(Task task, boolean isLine) { this.task = task; + this.isLine = isLine; } /** @@ -64,14 +71,20 @@ public class InstructionStepState extends State { */ public State handleUpdate(TaskStepEngine tse) { + if (isLine) { long addr = this.task.getPC(); this.elfCache = new ElfSectionCache(this.task); ElfSectionHeader header = this.elfCache.getSectionHeader(".plt", addr); - /* If the user steps into a function call, the following catches the .plt section of the program, and - * ensures that Frysk steps past it, so that the user is landed back into their own code after the call. */ - if ((header != null && header.addr <= addr && (header.addr + header.offset) >= addr) - && (header.type == ElfSectionHeader.ELF_SHT_PROGBITS || header.type == ElfSectionHeader.ELF_SHT_NOBITS)) { + /* If the user steps into a function call, the following + * catches the .plt section of the program, and ensures that + * Frysk steps past it, so that the user is landed back into + * their own code after the call. */ + if (header != null + && header.addr <= addr + && (header.addr + header.offset) >= addr + && (header.type == ElfSectionHeader.ELF_SHT_PROGBITS + || header.type == ElfSectionHeader.ELF_SHT_NOBITS)) { DwflLine line = tse.getDwflLine(); @@ -80,8 +93,8 @@ public class InstructionStepState extends State { return new InstructionStepThroughState(task, PLT_DL_FIXUP); } } - - return new StoppedState(this.task); + } + return new StoppedState(this.task); } public boolean isStopped() { diff --git a/frysk-core/frysk/stepping/LineStepState.java b/frysk-core/frysk/stepping/LineStepState.java index 59d9539..f95a996 100644 --- a/frysk-core/frysk/stepping/LineStepState.java +++ b/frysk-core/frysk/stepping/LineStepState.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// 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 @@ -62,9 +62,13 @@ public class LineStepState extends State { if (line == null) /* We're in no-debuginfo land */ { tse.setLine(0); - /* Returned a StoppedState because line-stepping has no meaning - * when there is no debug information to relate the 'lines' to. */ - return new StoppedState(this.task); + // Pretend we are an InstructionStepState because + // line-stepping has no meaning when there is no debug + // information to relate the 'lines' to. And + // InstructionStepState with isLine set to true will + // return StoppedState, but not before it went through a + // plt section first. + return new InstructionStepState(task, true).handleUpdate(tse); } else lineNum = line.getLineNum(); diff --git a/frysk-core/frysk/stepping/SteppingEngine.java b/frysk-core/frysk/stepping/SteppingEngine.java index 2b5d91d..6fa9b3e 100644 --- a/frysk-core/frysk/stepping/SteppingEngine.java +++ b/frysk-core/frysk/stepping/SteppingEngine.java @@ -198,7 +198,7 @@ public class SteppingEngine { if (!tse.isStopped()) return false; - tse.setState(new InstructionStepState(task)); + tse.setState(new InstructionStepState(task, false)); this.steppingObserver.notifyNotBlocked(tse); this.contextMap.put(task.getProc(), new Integer(1)); @@ -228,7 +228,7 @@ public class SteppingEngine { while (iter.hasNext()) { t = (Task) iter.next(); TaskStepEngine tse = (TaskStepEngine) this.taskStateMap.get(t); - tse.setState(new InstructionStepState(t)); + tse.setState(new InstructionStepState(t, false)); this.steppingObserver.notifyNotBlocked(tse); continueForStepping(t, true); } @@ -258,7 +258,7 @@ public class SteppingEngine { DwflLine line = tse.getDwflLine(); if (line == null) { - tse.setState(new InstructionStepState(task)); + tse.setState(new InstructionStepState(task, true)); if (continueForStepping(task, true)) { this.steppingObserver.notifyNotBlocked(tse); } @@ -321,7 +321,7 @@ public class SteppingEngine { * from the Task at this point. If not, there's no point in doing * 'line stepping' since there are no 'lines' to step. */ if (line == null) { - tse.setState(new InstructionStepState(t)); + tse.setState(new InstructionStepState(t, isLine)); } else { tse.setLine(line.getLineNum()); tse.setState(new LineStepState(t)); diff --git a/frysk-core/frysk/stepping/TestStepping.java b/frysk-core/frysk/stepping/TestStepping.java index fd0431f..b14c4f3 100644 --- a/frysk-core/frysk/stepping/TestStepping.java +++ b/frysk-core/frysk/stepping/TestStepping.java @@ -1017,7 +1017,6 @@ public class TestStepping extends TestLib { Task testTask = null; String callingFrame = "foo"; - boolean first = true; int endLine = 0; public InstructionStepThroughSectionTest(Task task, int lineNum) { @@ -1032,12 +1031,6 @@ public class TestStepping extends TestLib { String s = frame.getSymbol().getDemangledName(); - if (first) { - se.stepLine(this.testTask); - this.first = false; - return; - } - assertEquals("calling frame", callingFrame, s); assertEquals("line number", endLine, frame.getLine().getLine()); Manager.eventLoop.requestStop(); hooks/post-receive -- frysk system monitor/debugger