forked from qt-creator/qt-creator
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:
@@ -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']
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
Reference in New Issue
Block a user