Debugger: Add basic diassembly display to LLDB engine

Change-Id: Id65f983ffada2f8d08929a82c96767d8471d9444
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
hjk
2013-05-03 17:18:07 +02:00
parent bd75748ce5
commit bfa85a509d
3 changed files with 61 additions and 11 deletions

View File

@@ -712,16 +712,29 @@ class Debugger(cmd.Cmd):
self.reportData()
# Convenience
def do_r(self, args):
self.setupInferior(args)
self.target.BreakpointCreateByName("main", self.db.target.GetExecutable().GetFilename())
self.runEngine()
def do_bb(self, args):
options = eval(args)
self.expandedINames = set(options['expanded'].split(','))
self.reportData()
def do_disassemble(self, args):
#options = eval(args)
frame = self.currentFrame();
function = frame.GetFunction()
name = function.GetName()
result = 'disassembly=['
base = function.GetStartAddress().GetLoadAddress(self.target)
for insn in function.GetInstructions(self.target):
comment = insn.GetComment(self.target)
addr = insn.GetAddress().GetLoadAddress(self.target)
result += '{address="%s"' % addr
result += ',inst="%s %s"' % (insn.GetMnemonic(self.target), insn.GetOperands(self.target))
result += ',func_name="%s"' % name
if comment:
result += ',comment="%s"' % comment
result += ',offset="%s"},' % (addr - base)
self.report(result + ']')
#execfile(os.path.join(currentDir, "dumper.py"))
#execfile(os.path.join(currentDir, "qttypes.py"))

View File

@@ -39,6 +39,7 @@
#include "debuggertooltipmanager.h"
#include "breakhandler.h"
#include "disassemblerlines.h"
#include "moduleshandler.h"
#include "registerhandler.h"
#include "stackhandler.h"
@@ -81,6 +82,7 @@ LldbEngine::LldbEngine(const DebuggerStartParameters &startParameters)
: DebuggerEngine(startParameters)
{
setObjectName(QLatin1String("LldbEngine"));
m_disassemblerAgent = 0;
}
LldbEngine::~LldbEngine()
@@ -95,7 +97,8 @@ void LldbEngine::executeDebuggerCommand(const QString &command, DebuggerLanguage
showMessage(_("LLDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + command);
return;
}
runCommand(command.toUtf8());
//runCommand(command.toUtf8());
m_lldbProc.write(command.toUtf8() + '\n');
}
static int token = 1;
@@ -105,10 +108,10 @@ void LldbEngine::runCommand(const QByteArray &functionName,
{
QTC_ASSERT(m_lldbProc.state() == QProcess::Running, notifyEngineIll());
++token;
QByteArray cmd = "db ['" + functionName + "','"
+ QByteArray::number(token) + "','"
+ extraArgs + "','"
+ continuation + "']\n";
QByteArray cmd = "db ['" + functionName + "',"
+ QByteArray::number(token) + ","
+ "'" + extraArgs + "',"
+ "'" + continuation + "']\n";
showMessage(QString::number(token) + _(cmd), LogInput);
m_lldbProc.write(cmd);
}
@@ -254,6 +257,8 @@ void LldbEngine::handleResponse(const QByteArray &response)
refreshModules(item);
else if (name == "bkpts")
refreshBreakpoints(item);
else if (name == "disassembly")
refreshDisassembly(item);
else if (name == "continuation")
runContinuation(item);
}
@@ -448,6 +453,25 @@ void LldbEngine::updateBreakpointData(const GdbMi &bkpt, bool added)
}
}
void LldbEngine::refreshDisassembly(const GdbMi &lines)
{
DisassemblerLines result;
foreach (const GdbMi &line, lines.children()) {
DisassemblerLine dl;
QByteArray address = line.findChild("address").data();
dl.address = address.toULongLong(0, 0);
dl.data = _(line.findChild("inst").data());
dl.function = _(line.findChild("func-name").data());
dl.offset = line.findChild("offset").data().toUInt();
result.appendLine(dl);
}
QTC_ASSERT(m_disassemblerAgent, return);
m_disassemblerAgent->setContents(result);
m_disassemblerAgent = 0;
}
void LldbEngine::refreshBreakpoints(const GdbMi &bkpts)
{
BreakHandler *handler = breakHandler();
@@ -911,6 +935,14 @@ void LldbEngine::reloadRegisters()
runCommand("reloadRegisters");
}
void LldbEngine::fetchDisassembler(DisassemblerAgent *agent)
{
QTC_CHECK(!m_disassemblerAgent);
m_disassemblerAgent = agent;
QByteArray cookie = QByteArray::number(qulonglong(agent));
runCommand("disassemble", "{'cookie':" + cookie + "}");
}
bool LldbEngine::hasCapability(unsigned cap) const
{
if (cap & (ReverseSteppingCapability

View File

@@ -31,10 +31,12 @@
#define DEBUGGER_LLDBENGINE
#include "debuggerengine.h"
#include "disassembleragent.h"
#include <QPointer>
#include <QProcess>
#include <QStack>
#include <QQueue>
#include <QStack>
#include <QVariant>
@@ -97,6 +99,8 @@ private:
void reloadRegisters();
void reloadSourceFiles() {}
void reloadFullStack() {}
void fetchDisassembler(Internal::DisassemblerAgent *);
void refreshDisassembly(const GdbMi &lines);
bool supportsThreads() const { return true; }
bool isSynchronous() const { return true; }
@@ -158,6 +162,7 @@ private:
QString m_scriptFileName;
QProcess m_lldbProc;
QString m_lldb;
QPointer<DisassemblerAgent> m_disassemblerAgent;
};
} // namespace Internal