forked from qt-creator/qt-creator
Debugger: Add basic diassembly display to LLDB engine
Change-Id: Id65f983ffada2f8d08929a82c96767d8471d9444 Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
@@ -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"))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user