diff --git a/tests/manual/trk/runner.cpp b/tests/manual/trk/runner.cpp index 74ba1954eea9f4a8d216af70aa91a4e21af119d8..9d2d719d88d83045e55b4997b7407866ab451666 100755 --- a/tests/manual/trk/runner.cpp +++ b/tests/manual/trk/runner.cpp @@ -230,8 +230,6 @@ public: TrkDevice m_trkDevice; - QList<Breakpoint> m_breakpoints; - // // Gdb // @@ -302,9 +300,6 @@ Adapter::Adapter() m_serialFrame = false; m_bufferedMemoryRead = true; //m_bufferedMemoryRead = false; - // m_breakpoints.append(Breakpoint(0x0040)); // E32Main - m_breakpoints.append(Breakpoint(0x0cc8)); // E32Main - m_breakpoints.append(Breakpoint(0x0cd0)); // E32Main m_trkServerName = "/dev/rfcomm0"; uid_t userId = getuid(); @@ -863,9 +858,10 @@ void Adapter::handleGdbServerCommand(const QByteArray &cmd) sendGdbServerAck(); m_running = true; QByteArray ba; - appendByte(&ba, 1); // options + appendByte(&ba, 0x01); // options appendInt(&ba, m_snapshot.registers[RegisterPC]); // start address - appendInt(&ba, m_snapshot.registers[RegisterPC] + 4); // end address + //appendInt(&ba, m_snapshot.registers[RegisterPC] + 4); // end address + appendInt(&ba, -1); // end address appendInt(&ba, m_session.pid); appendInt(&ba, m_session.tid); sendTrkMessage(0x19, TrkCB(handleStepRange), ba, "Step range"); @@ -911,10 +907,9 @@ void Adapter::handleGdbServerCommand(const QByteArray &cmd) bool ok = false; const uint addr = cmd.mid(3, pos - 3).toInt(&ok, 16); const uint len = cmd.mid(pos + 1).toInt(&ok, 16); - qDebug() << "ADDR: " << hexNumber(addr) << " LEN: " << len; - if (m_verbose) - logMessage(QString::fromLatin1("Inserting breakpoint at 0x%1, %2") - .arg(addr, 0, 16).arg(len)); + //qDebug() << "ADDR: " << hexNumber(addr) << " LEN: " << len; + logMessage(QString::fromLatin1("Inserting breakpoint at 0x%1, %2") + .arg(addr, 0, 16).arg(len)); //---IDE------------------------------------------------------ // Command: 0x1B Set Break @@ -1060,8 +1055,7 @@ void Adapter::handleTrkResult(const TrkResult &result) sendGdbServerMessage("S05", "Target stopped"); } } else { - if (m_verbose) - logMessage(QLatin1String("Ignoring stop at 0")); + logMessage(QLatin1String("Ignoring stop at 0")); } break; } @@ -1197,9 +1191,8 @@ void Adapter::handleSetTrkBreakpoint(const TrkResult &result) // Error: 0x00 // [80 09 00 00 00 00 0A] const uint bpnr = extractInt(result.data.data()); - if (m_verbose) - logMessage("SET BREAKPOINT " + hexxNumber(bpnr) - + stringFromArray(result.data.data())); + logMessage("SET BREAKPOINT " + hexxNumber(bpnr) + + stringFromArray(result.data.data())); } void Adapter::handleCreateProcess(const TrkResult &result) @@ -1502,8 +1495,8 @@ void Adapter::cleanUp() // Error: 0x00 // [80 24 00] - foreach (const Breakpoint &bp, m_breakpoints) - clearTrkBreakpoint(bp); + //foreach (const Breakpoint &bp, m_breakpoints) + // clearTrkBreakpoint(bp); sendTrkMessage(0x02, TrkCB(handleDisconnect)); //---IDE------------------------------------------------------ @@ -1662,6 +1655,7 @@ void Adapter::startGdb() sendGdbMessage("set remotebreak on"); sendGdbMessage("set breakpoint pending on"); sendGdbMessage("set trust-readonly-sections on"); + //sendGdbMessage("mem 0 ~0ll rw 8 cache"); // FIXME: "remote noack" does not seem to be supported on cs-gdb? //sendGdbMessage("set remote noack-packet"); @@ -1688,24 +1682,21 @@ void Adapter::startGdb() 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 E32Main", + GdbCB(handleInfoMainAddress)); + sendGdbMessage("info address CFileBrowseAppUi::HandleCommandL", + GdbCB(handleInfoMainAddress)); #if 1 // FIXME: Gdb based version. That's the goal //sendGdbMessage("break E32Main"); //sendGdbMessage("continue"); - QByteArray ba; - appendInt(&ba, m_session.pid); - appendInt(&ba, m_session.tid); //sendTrkMessage(0x18, TrkCB(handleContinueAfterCreateProcess), // trkContinueMessage(), "CONTINUE"); #else // Directly talk to TRK. Works for now... sendGdbMessage("break E32Main"); sendGdbMessage("break filebrowseappui.cpp:39"); - //foreach (const Breakpoint &bp, m_breakpoints) - // setTrkBreakpoint(bp); - //sendTrkContinue(); // sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE"); #endif } @@ -1753,42 +1744,43 @@ void Adapter::handleGdbReadyReadStandardOutput() 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: %1").arg(str)); + 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; } - logMessage(QString("-> GDB MAIN: %1").arg(re.cap(1))); - GdbResult result; - result.data = re.cap(1).toLatin1(); - handleInfoMainAddress(result); + 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 Adapter::handleInfoMainAddress(const GdbResult &result) { - bool ok; - uint addr = result.data.toInt(&ok, 16); - const QByteArray ba = trkBreakpointMessage(addr, 1); - sendTrkMessage(0x1B, TrkCB(handleSetTrkMainBreakpoint), ba); + Q_UNUSED(result); } void Adapter::handleSetTrkMainBreakpoint(const TrkResult &result) { + Q_UNUSED(result); +/* //---TRK------------------------------------------------------ // [80 09 00 00 00 00 0A] const uint bpnr = extractInt(result.data.data()); logMessage("SET MAIN BREAKPOINT " + hexxNumber(bpnr) + stringFromArray(result.data.data())); - - // 'continue after initial break' - QByteArray ba; - appendInt(&ba, m_session.pid); - appendInt(&ba, m_session.tid); - sendTrkMessage(0x18, TrkCallback(), ba, "CONTINUE"); - - // this attaches - sendGdbMessage("target remote " + m_gdbServerName); +*/ } void Adapter::handleInfoAddress(const GdbResult &result) @@ -1869,16 +1861,23 @@ public: private slots: void executeStepICommand(); + void executeStepCommand(); + void executeDisassICommand(); private: Adapter *m_adapter; TextEdit m_textEdit; QToolBar m_toolBar; QAction m_stepIAction; + QAction m_stepAction; + QAction m_disassIAction; }; RunnerGui::RunnerGui(Adapter *adapter) - : m_adapter(adapter), m_stepIAction(0) + : m_adapter(adapter), + m_stepIAction(0), + m_stepAction(0), + m_disassIAction(0) { resize(1200, 1000); setCentralWidget(&m_textEdit); @@ -1886,19 +1885,39 @@ RunnerGui::RunnerGui(Adapter *adapter) addToolBar(&m_toolBar); m_stepIAction.setText("StepI"); + m_disassIAction.setText("DisassI"); m_toolBar.addAction(&m_stepIAction); + m_toolBar.addAction(&m_stepAction); + m_toolBar.addAction(&m_disassIAction); connect(adapter, SIGNAL(output(QString,QString)), &m_textEdit, SLOT(handleOutput(QString,QString))); connect(&m_textEdit, SIGNAL(executeCommand(QString)), m_adapter, SLOT(executeCommand(QString))); + connect(&m_stepIAction, SIGNAL(triggered()), this, SLOT(executeStepICommand())); + connect(&m_stepAction, SIGNAL(triggered()), + this, SLOT(executeStepCommand())); + connect(&m_disassIAction, SIGNAL(triggered()), + this, SLOT(executeDisassICommand())); +} + +void RunnerGui::executeStepCommand() +{ + //m_adapter->executeCommand("stepi"); + m_adapter->executeCommand("-exec-step"); } void RunnerGui::executeStepICommand() { - m_adapter->executeCommand("stepi"); + //m_adapter->executeCommand("stepi"); + m_adapter->executeCommand("-exec-step-instruction"); +} + +void RunnerGui::executeDisassICommand() +{ + m_adapter->executeCommand("disass $pc $pc+4"); } ///////////////////////////////////////////////////////////////////////