debugger: work on trk integration

This commit is contained in:
hjk
2009-09-10 13:59:21 +02:00
parent 903a50a6ef
commit 700bfa6339
3 changed files with 47 additions and 106 deletions

View File

@@ -71,7 +71,7 @@ SymbianAdapter::SymbianAdapter()
{ {
m_running = false; m_running = false;
m_gdbAckMode = true; m_gdbAckMode = true;
m_verbose = 2; m_verbose = 0;
m_serialFrame = false; m_serialFrame = false;
m_bufferedMemoryRead = true; m_bufferedMemoryRead = true;
m_rfcommDevice = "/dev/rfcomm0"; m_rfcommDevice = "/dev/rfcomm0";
@@ -82,9 +82,9 @@ SymbianAdapter::SymbianAdapter()
m_gdbProc.setObjectName("GDB PROCESS"); m_gdbProc.setObjectName("GDB PROCESS");
connectProcess(&m_gdbProc); connectProcess(&m_gdbProc);
connect(&m_gdbProc, SIGNAL(readyReadStandardError()), connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
this, SLOT(handleGdbReadyReadStandardError())); this, SIGNAL(readyReadStandardError()));
connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()), connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
this, SLOT(handleGdbReadyReadStandardOutput())); this, SIGNAL(readyReadStandardOutput()));
m_rfcommProc.setObjectName("RFCOMM PROCESS"); m_rfcommProc.setObjectName("RFCOMM PROCESS");
connectProcess(&m_rfcommProc); connectProcess(&m_rfcommProc);
@@ -167,7 +167,7 @@ void SymbianAdapter::startInferior()
{ {
QString errorMessage; QString errorMessage;
if (!m_trkDevice.open(m_rfcommDevice, &errorMessage)) { if (!m_trkDevice.open(m_rfcommDevice, &errorMessage)) {
logMessage("LOOPING"); emit output("LOOPING");
QTimer::singleShot(1000, this, SLOT(startInferior())); QTimer::singleShot(1000, this, SLOT(startInferior()));
return; return;
} }
@@ -427,7 +427,6 @@ void SymbianAdapter::handleGdbServerCommand(const QByteArray &cmd)
else if (cmd.startsWith("D")) { else if (cmd.startsWith("D")) {
sendGdbServerAck(); sendGdbServerAck();
sendGdbServerMessage("OK", "shutting down"); sendGdbServerMessage("OK", "shutting down");
qApp->quit();
} }
else if (cmd == "g") { else if (cmd == "g") {
@@ -1332,7 +1331,7 @@ void SymbianAdapter::startGdb()
if (!m_gdbServer.listen(QHostAddress(gdbServerIP()), gdbServerPort())) { if (!m_gdbServer.listen(QHostAddress(gdbServerIP()), gdbServerPort())) {
logMessage(QString("Unable to start the gdb server at %1: %2.") logMessage(QString("Unable to start the gdb server at %1: %2.")
.arg(m_gdbServerName).arg(m_gdbServer.errorString())); .arg(m_gdbServerName).arg(m_gdbServer.errorString()));
QCoreApplication::exit(5); //emit startFailed();
return; return;
} }
@@ -1361,47 +1360,19 @@ void SymbianAdapter::startGdb()
//sendGdbMessage("set remote noack-packet"); //sendGdbMessage("set remote noack-packet");
// FIXME: creates a lot of noise a la '&"putpkt: Junk: Ack " &' // FIXME: creates a lot of noise a la '&"putpkt: Junk: Ack " &'
// even thouhg the communication seems sane // even though the communication seems sane
//sendGdbMessage("set debug remote 1"); // creates l //sendGdbMessage("set debug remote 1"); // creates l
//sendGdbMessage("target remote " + m_gdbServerName);
// sendGdbMessage("target extended-remote " + m_gdbServerName);
//sendGdbMessage("target extended-async " + m_gdbServerName);
//sendGdbMessage("set remotecache ...") // Set cache use for remote targets
//sendGdbMessage("file filebrowseapp.sym");
// sendGdbMessage("add-symbol-file filebrowseapp.sym " + m_baseAddress);
// sendGdbMessage("symbol-file filebrowseapp.sym");
// sendGdbMessage("print E32Main");
// sendGdbMessage("break E32Main");
//sendGdbMessage("continue");
//sendGdbMessage("info files");
//sendGdbMessage("file filebrowseapp.sym -readnow");
sendGdbMessage("add-symbol-file filebrowseapp.sym " sendGdbMessage("add-symbol-file filebrowseapp.sym "
+ hexxNumber(m_session.codeseg)); + hexxNumber(m_session.codeseg));
sendGdbMessage("symbol-file filebrowseapp.sym"); sendGdbMessage("symbol-file filebrowseapp.sym");
// -symbol-info-address not implemented in cs-gdb 6.4-6.8 (at least)
//sendGdbMessage("info address E32Main",
// GdbCB(handleInfoMainAddress));
//sendGdbMessage("info address CFileBrowseAppUi::HandleCommandL", //sendGdbMessage("info address CFileBrowseAppUi::HandleCommandL",
// GdbCB(handleInfoMainAddress)); // GdbCB(handleInfoMainAddress));
#if 0
// FIXME: Gdb based version. That's the goal
//sendGdbMessage("break E32Main");
//sendGdbMessage("continue");
//sendTrkMessage(0x18, TrkCB(handleContinueAfterCreateProcess),
// trkContinueMessage(), "CONTINUE");
#else
// Directly talk to TRK. Works for now...
//sendGdbMessage("break E32Main");
sendGdbMessage("-break-insert E32Main");
sendGdbMessage("-break-insert filebrowseappui.cpp:39"); sendGdbMessage("-break-insert filebrowseappui.cpp:39");
sendGdbMessage("target remote " + m_gdbServerName); sendGdbMessage("target remote " + m_gdbServerName);
//sendGdbMessage("break filebrowseappui.cpp:39"); //sendGdbMessage("-exec-continue");
// sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
#endif
} }
void SymbianAdapter::sendGdbMessage(const QString &msg, GdbCallback callback, void SymbianAdapter::sendGdbMessage(const QString &msg, GdbCallback callback,
@@ -1418,64 +1389,6 @@ void SymbianAdapter::sendGdbMessage(const QString &msg, GdbCallback callback,
m_gdbProc.write(QString("%1%2\n").arg(token).arg(msg).toLatin1()); m_gdbProc.write(QString("%1%2\n").arg(token).arg(msg).toLatin1());
} }
void SymbianAdapter::handleGdbReadyReadStandardError()
{
QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardError();
sendOutput(sender(), QString("stderr: %1").arg(QString::fromLatin1(ba)));
}
void SymbianAdapter::handleGdbReadyReadStandardOutput()
{
QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardOutput();
QString str = QString::fromLatin1(ba);
// FIXME: fragile. merge with gdbengine logic
#if 0
QRegExp re(QString(".*([0-9]+)[^]done.*"));
int pos = re.indexIn(str);
if (pos == -1) {
logMessage(QString("\n-> GDB: %1 %**% %2 %**%\n").arg(str).arg(pos));
return;
}
int token = re.cap(1).toInt();
logMessage(QString("\n-> GDB: %1 %2##\n").arg(token).arg(QString::fromLatin1(ba)));
if (!token)
return;
GdbCommand cmd = m_gdbCookieForToken.take(token);
logMessage("FOUND CALLBACK FOR " + cmd.command);
GdbResult result;
result.data = ba;
if (!cmd.callback.isNull())
cmd.callback(result);
#else
/*
bool ok;
QRegExp re(QString("Symbol .._Z7E32Mainv.. is a function at address 0x(.*)\\."));
if (re.indexIn(str) != -1) {
logMessage(QString("-> GDB MAIN BREAKPOINT: %1").arg(re.cap(1)));
uint addr = re.cap(1).toInt(&ok, 16);
sendTrkMessage(0x1B, TrkCallback(), trkBreakpointMessage(addr, 1));
return;
}
QRegExp re1(QString("Symbol .._ZN16CFileBrowseAppUi14HandleCommandLEi.. is a function at address 0x(.*)\\."));
if (re1.indexIn(str) != -1) {
logMessage(QString("-> GDB USER BREAKPOINT: %1").arg(re1.cap(1)));
uint addr = re1.cap(1).toInt(&ok, 16);
sendTrkMessage(0x1B, TrkCallback(), trkBreakpointMessage(addr, 1));
sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
sendGdbMessage("target remote " + m_gdbServerName);
return;
}
*/
logMessage(QString("-> GDB: %1").arg(str));
#endif
}
void SymbianAdapter::handleInfoMainAddress(const GdbResult &result)
{
Q_UNUSED(result);
}
void SymbianAdapter::handleSetTrkMainBreakpoint(const TrkResult &result) void SymbianAdapter::handleSetTrkMainBreakpoint(const TrkResult &result)
{ {
Q_UNUSED(result); Q_UNUSED(result);
@@ -1488,12 +1401,6 @@ void SymbianAdapter::handleSetTrkMainBreakpoint(const TrkResult &result)
*/ */
} }
void SymbianAdapter::handleInfoAddress(const GdbResult &result)
{
Q_UNUSED(result);
// FIXME
}
void SymbianAdapter::handleRfcommReadyReadStandardError() void SymbianAdapter::handleRfcommReadyReadStandardError()
{ {
QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardError(); QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardError();

View File

@@ -211,14 +211,9 @@ public:
void sendGdbServerAck(); void sendGdbServerAck();
bool sendGdbServerPacket(const QByteArray &packet, bool doFlush); bool sendGdbServerPacket(const QByteArray &packet, bool doFlush);
Q_SLOT void handleGdbReadyReadStandardError();
Q_SLOT void handleGdbReadyReadStandardOutput();
void logMessage(const QString &msg); // triggers output() if m_verbose void logMessage(const QString &msg); // triggers output() if m_verbose
Q_SLOT void trkLogMessage(const QString &msg); Q_SLOT void trkLogMessage(const QString &msg);
void handleInfoAddress(const GdbResult &result);
void handleInfoMainAddress(const GdbResult &result);
QTcpServer m_gdbServer; QTcpServer m_gdbServer;
QPointer<QTcpSocket> m_gdbConnection; QPointer<QTcpSocket> m_gdbConnection;
QByteArray m_gdbReadBuffer; QByteArray m_gdbReadBuffer;

View File

@@ -107,6 +107,12 @@ private slots:
void executeContinueCommand() { executeCommand("-exec-continue"); } void executeContinueCommand() { executeCommand("-exec-continue"); }
void executeDisassICommand() { executeCommand("disass $pc $pc+4"); } void executeDisassICommand() { executeCommand("disass $pc $pc+4"); }
void handleReadyReadStandardError();
void handleReadyReadStandardOutput();
void run();
void started();
private: private:
void executeCommand(const QString &cmd) { m_adapter->executeCommand(cmd); } void executeCommand(const QString &cmd) { m_adapter->executeCommand(cmd); }
void connectAction(QAction *&, QString name, const char *slot); void connectAction(QAction *&, QString name, const char *slot);
@@ -141,6 +147,13 @@ RunnerGui::RunnerGui(SymbianAdapter *adapter)
&m_textEdit, SLOT(handleOutput(QString))); &m_textEdit, SLOT(handleOutput(QString)));
connect(&m_textEdit, SIGNAL(executeCommand(QString)), connect(&m_textEdit, SIGNAL(executeCommand(QString)),
m_adapter, SLOT(executeCommand(QString))); m_adapter, SLOT(executeCommand(QString)));
connect(adapter, SIGNAL(readyReadStandardError()),
this, SLOT(handleReadyReadStandardError()));
connect(adapter, SIGNAL(readyReadStandardOutput()),
this, SLOT(handleReadyReadStandardOutput()));
connect(adapter, SIGNAL(started()),
this, SLOT(started()));
} }
void RunnerGui::connectAction(QAction *&action, QString name, const char *slot) void RunnerGui::connectAction(QAction *&action, QString name, const char *slot)
@@ -151,6 +164,31 @@ void RunnerGui::connectAction(QAction *&action, QString name, const char *slot)
connect(action, SIGNAL(triggered()), this, slot); connect(action, SIGNAL(triggered()), this, slot);
} }
void RunnerGui::handleReadyReadStandardError()
{
QByteArray ba = m_adapter->readAllStandardError();
qDebug() << ba;
m_textEdit.handleOutput(ba);
}
void RunnerGui::handleReadyReadStandardOutput()
{
QByteArray ba = m_adapter->readAllStandardOutput();
qDebug() << ba;
m_textEdit.handleOutput("-> GDB: " + ba);
}
void RunnerGui::run()
{
m_adapter->run();
}
void RunnerGui::started()
{
qDebug() << "\nSTARTED\n";
m_adapter->sendGdbMessage("-exec-continue");
}
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// //
// main // main
@@ -161,9 +199,10 @@ int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
SymbianAdapter adapter; SymbianAdapter adapter;
adapter.setVerbose(2);
RunnerGui gui(&adapter); RunnerGui gui(&adapter);
gui.show(); gui.show();
QTimer::singleShot(0, &adapter, SLOT(run())); QTimer::singleShot(0, &gui, SLOT(run()));
return app.exec(); return app.exec();
} }