public override AssemblyLine[] GetLines(long startAddr, long endAddr) { List <AssemblyLine> lines = new List <AssemblyLine> (); MD.TargetAddress addr = baseAddr + (startAddr - baseAddr.Address); while (addr.Address <= endAddr) { try { MD.AssemblerLine line = thread.DisassembleInstruction(null, addr); lines.Add(new AssemblyLine(addr.Address, line.Text)); addr += line.InstructionSize; } catch { Console.WriteLine("failed " + addr.Address); lines.Add(new AssemblyLine(addr.Address, "??")); addr++; } } return(lines.ToArray()); }
protected void TargetEvent(Thread target, StackFrame frame, TargetEventArgs args) { switch (args.Type) { case TargetEventType.TargetStopped: { if ((int) args.Data != 0) interpreter.Print ("{0} received signal {1} at {2}.", target.Name, (int) args.Data, frame); else if (!interpreter.IsInteractive) break; else interpreter.Print ("{0} stopped at {1}.", target.Name, frame); if (interpreter.IsScript) break; AssemblerLine insn; try { insn = target.DisassembleInstruction ( frame.Method, frame.TargetAddress); } catch { insn = null; } interpreter.Style.TargetStopped (interpreter, frame, insn); break; } case TargetEventType.TargetHitBreakpoint: { if (!interpreter.IsInteractive) break; interpreter.Print ("{0} hit breakpoint {1} at {2}.", target.Name, (int) args.Data, frame); if (interpreter.IsScript) break; AssemblerLine insn; try { insn = target.DisassembleInstruction ( frame.Method, frame.TargetAddress); } catch { insn = null; } interpreter.Style.TargetStopped (interpreter, frame, insn); break; } case TargetEventType.Exception: case TargetEventType.UnhandledException: { interpreter.Print ("{0} caught {2}exception at {1}.", target.Name, frame, args.Type == TargetEventType.Exception ? "" : "unhandled "); if (interpreter.IsScript) break; AssemblerLine insn; try { insn = target.DisassembleInstruction ( frame.Method, frame.TargetAddress); } catch { insn = null; } interpreter.Style.UnhandledException (interpreter, frame, insn); break; } } }