Debugger: Fix dumper format choosing with GDB

... and further unify GDB and LLDB code paths.

Change-Id: Id89f3804c53190c4888082891fd3c3c55eceac84
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
This commit is contained in:
hjk
2015-03-18 16:48:57 +01:00
parent 13d425b972
commit e8f8aaa263
7 changed files with 34 additions and 20 deletions

View File

@@ -1706,7 +1706,7 @@ class DumperBase:
except: except:
pass pass
def setupDumper(self, _ = {}): def setupDumpers(self, _ = {}):
self.qqDumpers = {} self.qqDumpers = {}
self.qqFormats = {} self.qqFormats = {}
self.qqEditable = {} self.qqEditable = {}
@@ -1719,27 +1719,26 @@ class DumperBase:
item = dic[name] item = dic[name]
self.registerDumper(name, item) self.registerDumper(name, item)
return self.reportDumpers() msg = "dumpers=["
def reportDumpers(self, _ = {}):
result = "dumpers=["
for key, value in self.qqFormats.items(): for key, value in self.qqFormats.items():
if key in self.qqEditable: if key in self.qqEditable:
result += '{type="%s",formats="%s",editable="true"},' % (key, value) msg += '{type="%s",formats="%s",editable="true"},' % (key, value)
else: else:
result += '{type="%s",formats="%s"},' % (key, value) msg += '{type="%s",formats="%s"},' % (key, value)
result += ']' msg += ']'
return result self.reportDumpers(msg)
def reloadDumper(self, args): def reportDumpers(self, msg):
raise NotImplementedError # Pure
def reloadDumpers(self, args):
for mod in self.dumpermodules: for mod in self.dumpermodules:
m = sys.modules[mod] m = sys.modules[mod]
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
importlib.reload(m) importlib.reload(m)
else: else:
reload(m) reload(m)
self.setupDumpers(args)
self.setupDumper(args)
def addDumperModule(self, args): def addDumperModule(self, args):
path = args['path'] path = args['path']

View File

@@ -1660,6 +1660,12 @@ class Dumper(DumperBase):
matplotQuit() matplotQuit()
gdb.execute("quit") gdb.execute("quit")
def loadDumpers(self, args):
self.setupDumpers()
def reportDumpers(self, msg):
print(msg)
def profile1(self, args): def profile1(self, args):
"""Internal profiling""" """Internal profiling"""
import tempfile import tempfile

View File

@@ -1670,10 +1670,12 @@ class Dumper(DumperBase):
result += ',offset="%s"},' % (addr - base) result += ',offset="%s"},' % (addr - base)
self.report(result + ']') self.report(result + ']')
def loadDumperFiles(self, args): def loadDumpers(self, args):
self.reportToken(args) self.reportToken(args)
result = self.setupDumper() self.setupDumpers()
self.report(result)
def reportDumpers(self, msg):
self.report(msg)
def fetchMemory(self, args): def fetchMemory(self, args):
address = args['address'] address = args['address']
@@ -1721,7 +1723,7 @@ class Tester(Dumper):
self.expandedINames = set(expandedINames) self.expandedINames = set(expandedINames)
self.passExceptions = True self.passExceptions = True
self.loadDumperFiles({}) self.loadDumpers({})
error = lldb.SBError() error = lldb.SBError()
self.target = self.debugger.CreateTarget(binary, None, None, True, error) self.target = self.debugger.CreateTarget(binary, None, None, True, error)

View File

@@ -4273,7 +4273,7 @@ void GdbEngine::startGdb(const QStringList &args)
if (!commands.isEmpty()) if (!commands.isEmpty())
postCommand(commands.toLocal8Bit(), flags); postCommand(commands.toLocal8Bit(), flags);
runCommand(DebuggerCommand("setupDumper", flags, CB(handlePythonSetup))); runCommand(DebuggerCommand("loadDumpers", flags, CB(handlePythonSetup)));
} }
void GdbEngine::handleGdbStartFailed() void GdbEngine::handleGdbStartFailed()
@@ -4303,7 +4303,7 @@ void GdbEngine::loadInitScript()
void GdbEngine::reloadDebuggingHelpers() void GdbEngine::reloadDebuggingHelpers()
{ {
runCommand("reloadDumper"); runCommand("reloadDumpers");
reloadLocals(); reloadLocals();
} }

View File

@@ -303,7 +303,7 @@ void LldbEngine::setupInferior()
runCommand(cmd); runCommand(cmd);
} }
DebuggerCommand cmd1("loadDumperFiles"); DebuggerCommand cmd1("loadDumpers");
runCommand(cmd1); runCommand(cmd1);
} }
@@ -1160,6 +1160,12 @@ void LldbEngine::reloadRegisters()
runCommand("reportRegisters"); runCommand("reportRegisters");
} }
void LldbEngine::reloadDebuggingHelpers()
{
runCommand("reloadDumpers");
updateAll();
}
void LldbEngine::fetchDisassembler(DisassemblerAgent *agent) void LldbEngine::fetchDisassembler(DisassemblerAgent *agent)
{ {
QPointer<DisassemblerAgent> p(agent); QPointer<DisassemblerAgent> p(agent);

View File

@@ -116,6 +116,7 @@ private:
void reloadRegisters(); void reloadRegisters();
void reloadSourceFiles() {} void reloadSourceFiles() {}
void reloadFullStack(); void reloadFullStack();
void reloadDebuggingHelpers();
void fetchDisassembler(Internal::DisassemblerAgent *); void fetchDisassembler(Internal::DisassemblerAgent *);
void refreshDisassembly(const GdbMi &data); void refreshDisassembly(const GdbMi &data);

View File

@@ -1240,7 +1240,7 @@ void tst_Dumpers::dumper()
cmds += "python sys.path.insert(1, '" + dumperDir + "')\n" cmds += "python sys.path.insert(1, '" + dumperDir + "')\n"
"python sys.path.append('" + uninstalledData + "')\n" "python sys.path.append('" + uninstalledData + "')\n"
"python from gdbbridge import *\n" "python from gdbbridge import *\n"
"python theDumper.setupDumper()\n" "python theDumper.setupDumpers()\n"
"run " + nograb + "\n" "run " + nograb + "\n"
"python theDumper.showData({'fancy':1,'forcens':1,'autoderef':1," "python theDumper.showData({'fancy':1,'forcens':1,'autoderef':1,"
"'dyntype':1,'passExceptions':1,'expanded':[" + expandedq + "]})\n"; "'dyntype':1,'passExceptions':1,'expanded':[" + expandedq + "]})\n";