From 7994e18e4ffda861924a449284100bb580bdd257 Mon Sep 17 00:00:00 2001 From: andrew Date: Fri, 3 Aug 2012 16:38:01 +1200 Subject: [PATCH] updating debugger --- js/common/mmu.js | 4 -- js/node/node_main.js | 26 +++++++++-- tools/MemoryDump.py | 14 +++++- tools/PCsampler.py | 14 ++++-- tools/mips32emu/AssemblyViewPanel.py | 16 +++++-- tools/mips32emu/CpuViewPanel.py | 70 +++++++++++++++++++++++----- tools/mips32emu/DbgEngine.py | 27 +++++++++-- 7 files changed, 136 insertions(+), 35 deletions(-) diff --git a/js/common/mmu.js b/js/common/mmu.js index bbe6c3e..7b6aa9b 100644 --- a/js/common/mmu.js +++ b/js/common/mmu.js @@ -226,10 +226,6 @@ function Mmu(size) { } } - this.getPhysicalSize = function() { - return this.physicalMemory.getSize(); - } - this.readHalfWord = function(address) { //if(address >= 0xbfd00000) diff --git a/js/node/node_main.js b/js/node/node_main.js index 134f39c..9fd0bcd 100644 --- a/js/node/node_main.js +++ b/js/node/node_main.js @@ -45,7 +45,13 @@ function addCommand(name,fun){ commandLUT[name] = fun; } - +function callNoException(newThis,func,args){ + var oldTriggerException = emu.cpu.triggerException; + emu.cpu.triggerException = function () {}; + var ret = func.apply(newThis,args); + emu.cpu.triggerException = oldTriggerException; + return ret; +} // START debugging interface @@ -137,6 +143,7 @@ addCommand("break", function (s,command) { }); + addCommand("readreg", function (s,command) { arg = command.split(" ")[1]; var val = 0; @@ -164,6 +171,7 @@ addCommand("readreg", function (s,command) { s.write("ok "+ val.toString(16) +'\n'); }); + addCommand("writereg", function (s,command) { var arg = command.split(" ")[1]; var val = parseInt(command.split(" ")[2],16); @@ -176,7 +184,6 @@ addCommand("writereg", function (s,command) { } } - if(arg == "PC"){ emu.cpu.PC.putUInt32(val); } else if (arg == "HI") { @@ -192,13 +199,22 @@ addCommand("writereg", function (s,command) { addCommand("physmemsize", function (s,command) { - s.write("ok " + emu.mmu.getPhysicalSize().toString(16) + '\n'); + s.write("ok " + emu.mmu.physicalMemory.getSize().toString(16) + '\n'); +}) + + +addCommand("readpb", function (s,command) { + var addr = command.split(" ")[1]; + addr = parseInt(addr,16); + var val = emu.mmu.physicalMemory.getByte(addr) + s.write("ok "+ val.toString(16) +'\n'); }) + addCommand("readb", function (s,command) { var addr = command.split(" ")[1]; addr = parseInt(addr,16); - var val = emu.mmu.readByte(addr); + var val = callNoException(emu.mmu,emu.mmu.readByte,[addr]); s.write("ok "+ val.toString(16) +'\n'); }); @@ -206,7 +222,7 @@ addCommand("readb", function (s,command) { addCommand("readword", function (s,command) { var addr = command.split(" ")[1]; addr = parseInt(addr,16); - var val = emu.mmu.readWord(addr); + var val = callNoException(emu.mmu,emu.mmu.readWord,[addr]); s.write("ok "+ val.toString(16) +'\n'); }); diff --git a/tools/MemoryDump.py b/tools/MemoryDump.py index 86f807c..56bec6a 100644 --- a/tools/MemoryDump.py +++ b/tools/MemoryDump.py @@ -3,6 +3,16 @@ dbg = mips32emu.DbgEngine.DbgEngine() -for i in range(dbg.getPhysMemorySize()): - sys.stdout.write(chr(dbg.readByte(i))) + +if len(sys.argv) == 1: + r = xrange(dbg.getPhysMemorySize()) +elif len(sys.argv) == 2: + r = xrange(int(sys.argv[1],16),dbg.getPhysMemorySize()) +elif len(sys.argv) == 3: + r = xrange(int(sys.argv[1],16),int(sys.argv[2],16)) +else: + raise Exception("incorrect arguments") + +for i in r: + sys.stdout.write(chr(dbg.readByte(i,True))) sys.stdout.flush() diff --git a/tools/PCsampler.py b/tools/PCsampler.py index 287bdfc..a013a20 100644 --- a/tools/PCsampler.py +++ b/tools/PCsampler.py @@ -1,7 +1,7 @@ import sys import time import mips32emu.DbgEngine - +import socket dbg = mips32emu.DbgEngine.DbgEngine() @@ -11,6 +11,12 @@ while 1: - time.sleep(1) - pc = dbg.readReg("PC") - print("PC: %08X (%s)"%(pc,dbg.getFunctionName(pc))) + try: + time.sleep(2) + pc = dbg.readReg("PC") + print("PC: %08X (%s)"%(pc,dbg.getFunctionName(pc))) + except socket.error: + try: + dbg.pingAndReconnect() + except socket.error as e: + print("reconnect failed..." + str(e)) diff --git a/tools/mips32emu/AssemblyViewPanel.py b/tools/mips32emu/AssemblyViewPanel.py index 8d39b5e..b68ec4e 100644 --- a/tools/mips32emu/AssemblyViewPanel.py +++ b/tools/mips32emu/AssemblyViewPanel.py @@ -1,6 +1,6 @@ import wx import DbgEngine - +import socket #this is a panel class which can be used for displaying disassembly class AssemblyViewPanel(wx.Panel): @@ -14,7 +14,7 @@ def __init__(self,parent,id=-1): wx.FONTWEIGHT_NORMAL, False, 'Courier 10 Pitch') self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.timerHandler, self.timer) - self.timer.Start(700,False) + self.timer.Start(1500,False) def timerHandler(self,evt): self.Refresh() def OnSize(self, event): @@ -27,17 +27,25 @@ def OnPaint(self, event): dc.SetBrush(wx.Brush('#000000')) size = 10 dc.SetFont(self.font) - pc = self.dbg.readReg("PC") + try: + self.dbg.pingAndReconnect() + pc = self.dbg.readReg("PC") + except socket.error: + pc = 0 count = 0 nInstr = sy//20 pcIdx = nInstr//2 + for i in range(0,sy,20): curInstrAddr = pc + (4*(count-pcIdx)) dc.DrawLine(0,i,sx,i) if curInstrAddr < 0: op = None else: - op = self.dbg.readWord(curInstrAddr) + try: + op = self.dbg.readWord(curInstrAddr) + except socket.error: + op = None if count == pcIdx: dc.SetBrush(wx.Brush('#ff0000')) dc.DrawRectangle(0,i+1, sx, 19) diff --git a/tools/mips32emu/CpuViewPanel.py b/tools/mips32emu/CpuViewPanel.py index e8fc0a0..e5bd3c6 100644 --- a/tools/mips32emu/CpuViewPanel.py +++ b/tools/mips32emu/CpuViewPanel.py @@ -1,12 +1,50 @@ import wx import DbgEngine +import socket + + +regalias = { + + "GR0" : "G0", + "GR1" : "AT", + "GR2" : "V0" , + "GR3" : "V1" , + "GR4" : "A0" , + "GR5" : "A1" , + "GR6" : "A2" , + "GR7" : "A3" , + "GR8" : "T0" , + "GR9" : "T1" , + "GR10" : "T2" , + "GR11" : "T3" , + "GR12" : "T4" , + "GR13" : "T5" , + "GR14" : "T6" , + "GR15" : "T7" , + "GR16" : "S0" , + "GR17" : "S1" , + "GR18" : "S2" , + "GR19" : "S3" , + "GR20" : "S4" , + "GR21" : "S5" , + "GR22" : "S6" , + "GR23" : "S7" , + "GR24" : "T8" , + "GR25" : "T9" , + "GR26" : "K0" , + "GR27" : "K1" , + "GR28" : "GP" , + "GR29" : "SP" , + "GR30" : "FP" , + "GR31" : "RA" , +} class RegisterView(wx.Panel): def __init__(self,parent,name,id=-1): wx.Panel.__init__(self, parent) self.parent = parent - self.name = name + self.name = regalias.get(name,name) self.initGUI() self.setValue(0) def initGUI(self): @@ -19,13 +57,16 @@ def initGUI(self): self.tctl = tctl sizer.Add(tctl) def setValue(self,v): - self.tctl.Clear() if v == None: - self.tctl.WriteText("????????") - return - if 2**32 <= v < 0: + newText = "????????" + elif 2**32 <= v < 0: raise Exception("illegal value for Register view %d"%v) - self.tctl.WriteText("%08X"%v) + else: + newText = "%08X"%v + if self.tctl.GetValue() == newText: + return + self.tctl.Clear() + self.tctl.WriteText(newText) class CpuViewPanel(wx.Panel): @@ -37,7 +78,7 @@ def __init__(self,parent,id=-1): self.dbg = DbgEngine.DbgEngine() self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.timerHandler, self.timer) - self.timer.Start(700,False) + self.timer.Start(1500,False) def timerHandler(self,evt): self.updateDebuggerDisplay() self.Refresh() @@ -61,9 +102,14 @@ def initGUI(self): gridSizer.Add(rv) def updateDebuggerDisplay(self): registers= ["PC","LO","HI"] + ["GR%d"%i for i in range(32) ] - for r in registers: - try: - self.rvs[r].setValue(self.dbg.readReg(r)) - except Exception as e: - print e + try: + self.dbg.pingAndReconnect() + for r in registers: + try: + self.rvs[r].setValue(self.dbg.readReg(r)) + except Exception as e: + self.rvs[r].setValue(None) + except socket.error: + for r in registers: self.rvs[r].setValue(None) + diff --git a/tools/mips32emu/DbgEngine.py b/tools/mips32emu/DbgEngine.py index c1f738f..f96be2d 100644 --- a/tools/mips32emu/DbgEngine.py +++ b/tools/mips32emu/DbgEngine.py @@ -7,10 +7,25 @@ class DbgEngine(object): def __init__(self): - self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.s.connect(('localhost', 8123)) + try: + self.reconnect() + except socket.error: + pass self.pctofnLookup = {} self.disasmCache = util.Cache(50000) + def reconnect(self): + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.connect(('localhost', 8123)) + + + def ping(self): + self.readReg("PC") + def pingAndReconnect(self): + try: + self.ping() + except socket.error: + self.reconnect() + def disassemble(self,op): try: return self.disasmCache.get(op) @@ -37,8 +52,12 @@ def step(self): return else: raise Exception("step failed") - def readByte(self,addr): - self.s.send("readb "+hex(addr)+'\n') + def readByte(self,addr,phys): + if phys: + c = 'readpb ' + else: + c = 'readb ' + self.s.send(c+hex(addr)+'\n') res = self.s.recv(1024) if res.startswith('ok'): return int(res.split(' ')[1],16)