Index: frysk-core/frysk/bindir/TestFStep.java =================================================================== RCS file: /cvs/frysk/frysk-core/frysk/bindir/TestFStep.java,v retrieving revision 1.5 diff -u -r1.5 TestFStep.java --- frysk-core/frysk/bindir/TestFStep.java 16 Aug 2007 20:15:11 -0000 1.5 +++ frysk-core/frysk/bindir/TestFStep.java 28 Aug 2007 10:58:46 -0000 @@ -54,8 +54,6 @@ // stepped program. public void testFirstStep() throws Exception { - if (unsupported("disassembler", !lib.opcodes.Disassembler.available())) - return; Elf e = new Elf("/bin/true", ElfCommand.ELF_C_READ); try { Index: frysk-core/frysk/bindir/fstep.java =================================================================== RCS file: /cvs/frysk/frysk-core/frysk/bindir/fstep.java,v retrieving revision 1.10 diff -u -r1.10 fstep.java --- frysk-core/frysk/bindir/fstep.java 9 Jul 2007 16:31:29 -0000 1.10 +++ frysk-core/frysk/bindir/fstep.java 28 Aug 2007 10:58:46 -0000 @@ -42,6 +42,7 @@ import frysk.proc.*; import frysk.util.CommandlineParser; import lib.opcodes.*; +import inua.eio.ByteBuffer; import gnu.classpath.tools.getopt.*; import java.util.*; @@ -186,12 +187,49 @@ Manager.eventLoop.run(); } + /** + * Disassembler to use when real disassembler isn't available. + * Only implements disassembleInstructions and just + * returns address and four bytes in raw hex form. + */ + static class DummyDisassembler extends Disassembler + { + private final ByteBuffer memory; + DummyDisassembler(ByteBuffer memory) + { + super(memory); + this.memory = memory; + } + + public List disassembleInstructions(long address, long count) + { + ArrayList list = new ArrayList(); + memory.position(address); + while (count > 0) + { + list.add("0x" + Long.toHexString(address) + + "\t0x" + Integer.toHexString(memory.getByte() & 0xff) + + " 0x" + Integer.toHexString(memory.getByte() & 0xff) + + " 0x" + Integer.toHexString(memory.getByte() & 0xff) + + " 0x" + Integer.toHexString(memory.getByte() & 0xff)); + address++; + count--; + } + return list; + } + } + // TaskObserver.Attached interface public Action updateAttached(Task task) { // We only need one disassembler since all Tasks share their memory. if (disassembler == null) - disassembler = new Disassembler(task.getMemory()); + { + if (Disassembler.available()) + disassembler = new Disassembler(task.getMemory()); + else + disassembler = new DummyDisassembler(task.getMemory()); + } tasks.put(task, Long.valueOf(0)); @@ -226,9 +264,9 @@ // TaskObserver.Code interface public Action updateHit(Task task, long address) { - task.requestDeleteCodeObserver(this, address); task.requestAddInstructionObserver(this); task.requestAddTerminatedObserver(this); + task.requestDeleteCodeObserver(this, address); return Action.BLOCK; }