From 77e2a32940475893a70ecae49192ba0a40faa2a1 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Wed, 10 Nov 2021 12:29:02 +0800 Subject: [PATCH] work save --- RedPandaIDE/debugger.cpp | 56 ++++++++++++++++++++++++++++-------- RedPandaIDE/debugger.h | 3 ++ RedPandaIDE/mainwindow.cpp | 58 +++++++++++++++++++------------------- 3 files changed, 77 insertions(+), 40 deletions(-) diff --git a/RedPandaIDE/debugger.cpp b/RedPandaIDE/debugger.cpp index 0fca8bd3..4cd44a40 100644 --- a/RedPandaIDE/debugger.cpp +++ b/RedPandaIDE/debugger.cpp @@ -224,10 +224,10 @@ void Debugger::setBreakPointCondition(int index, const QString &condition) { PBreakpoint breakpoint=mBreakpointModel->setBreakPointCondition(index,condition); if (condition.isEmpty()) { - sendCommand("cond", + sendCommand("-break-condition", QString("%1").arg(breakpoint->line)); } else { - sendCommand("cond", + sendCommand("-break-condition", QString("%1 %2").arg(breakpoint->line).arg(condition)); } } @@ -362,9 +362,8 @@ void Debugger::notifyAfterProcessWatchVar() void Debugger::updateDebugInfo() { - sendCommand("backtrace", ""); - sendCommand("info locals", ""); - sendCommand("info args", ""); + sendCommand("-stack-list-frames", ""); + sendCommand("-stack-list-variables", "--skip-unavailable --allvalues"); } bool Debugger::useUTF8() const @@ -403,13 +402,14 @@ void Debugger::sendBreakpointCommand(PBreakpoint breakpoint) // break "filename":linenum QString condition; if (!breakpoint->condition.isEmpty()) { - condition = " if " + breakpoint->condition; + condition = " -c " + breakpoint->condition; } QString filename = breakpoint->filename; filename.replace('\\','/'); - sendCommand("break", - QString("\"%1\":%2").arg(filename) - .arg(breakpoint->line)+condition); + sendCommand("-break-insert", + QString("%1 --source \"%2\" --line %3") + .arg(condition,filename) + .arg(breakpoint->line)); } } @@ -772,6 +772,16 @@ AnnotationType DebugReader::getNextAnnotation() return getAnnotation(getNextWord()); } +bool DebugReader::outputTerminated(QByteArray &text) +{ + QStringList lines = TextToLines(QString::fromUtf8(text)); + foreach (const QString& line,lines) { + if (line == "(gdb)") + return true; + } + return false; +} + QString DebugReader::getNextFilledLine() { // Walk up to an enter sequence @@ -1176,6 +1186,29 @@ void DebugReader::processDebugOutput() doupdatecpuwindow = false; doreceivedsfwarning = false; + QStringList lines = TextToLines(mOutput); + + mOutputLine = 0; + while (mOutputLine= 0) doreceivedsfwarning = true; @@ -1630,7 +1663,7 @@ void DebugReader::run() bool errorOccurred = false; QString cmd = mDebuggerPath; // QString arguments = "--annotate=2"; - QString arguments = "--annotate=2 --silent"; + QString arguments = "--interpret=mi --silent"; QString workingDir = QFileInfo(mDebuggerPath).path(); mProcess = new QProcess(); @@ -1680,7 +1713,8 @@ void DebugReader::run() break; readed = mProcess->readAll(); buffer += readed; - if (getLastAnnotation(buffer) == AnnotationType::TPrompt) { + + if ( readed.endsWith("\r\n")&& outputTerminated(buffer)) { mOutput = QString::fromUtf8(buffer); processDebugOutput(); buffer.clear(); diff --git a/RedPandaIDE/debugger.h b/RedPandaIDE/debugger.h index 5e88a14a..bef2d704 100644 --- a/RedPandaIDE/debugger.h +++ b/RedPandaIDE/debugger.h @@ -305,6 +305,7 @@ private: AnnotationType getAnnotation(const QString& s); AnnotationType getLastAnnotation(const QByteArray& text); AnnotationType getNextAnnotation(); + bool outputTerminated(QByteArray& text); QString getNextFilledLine(); QString getNextLine(); QString getNextWord(); @@ -372,6 +373,8 @@ private: bool doupdatelocal; bool mStop; + + int mOutputLine; friend class Debugger; // QThread interface protected: diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index c8d2c8ef..2a891ef1 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -1296,13 +1296,14 @@ void MainWindow::debug() if (!mDebugger->start()) return; filePath.replace('\\','/'); - mDebugger->sendCommand("set","host charset UTF-8"); - mDebugger->sendCommand("file", '"' + filePath + '"'); + mDebugger->sendCommand("-gdb-set","mi-async on"); + mDebugger->sendCommand("-gdb-set","host-charset UTF-8"); + mDebugger->sendCommand("-file-exec-and-symbols", '"' + filePath + '"'); if (mProject->options().type == ProjectType::DynamicLib) { QString host =mProject->options().hostApplication; host.replace('\\','/'); - mDebugger->sendCommand("exec-file", '"' + host + '"'); + mDebugger->sendCommand("-file-exec-file", '"' + host + '"'); } includeOrSkipDirs(mProject->options().includes, @@ -1375,7 +1376,9 @@ void MainWindow::debug() mDebugger->setUseUTF8(e->fileEncoding() == ENCODING_UTF8 || e->fileEncoding() == ENCODING_UTF8_BOM); if (!mDebugger->start()) return; - mDebugger->sendCommand("file", QString("\"%1\"").arg(debugFile.filePath().replace('\\','/'))); + mDebugger->sendCommand("-gdb-set","mi-async on"); + mDebugger->sendCommand("-gdb-set","host-charset UTF-8"); + mDebugger->sendCommand("-file-exec-and-symbols", QString("\"%1\"").arg(debugFile.filePath().replace('\\','/'))); } } break; @@ -1406,40 +1409,37 @@ void MainWindow::debug() mDebugger->sendAllBreakpointsToDebugger(); // Run the debugger - mDebugger->sendCommand("set", "width 0"); // don't wrap output, very annoying - mDebugger->sendCommand("set", "new-console on"); - mDebugger->sendCommand("set", "confirm off"); - mDebugger->sendCommand("set", "print repeats 0"); // don't repeat elements - mDebugger->sendCommand("set", "print elements 0"); // don't limit elements - mDebugger->sendCommand("cd", excludeTrailingPathDelimiter(debugFile.path())); // restore working directory + mDebugger->sendCommand("-gdb-set", "width 0"); // don't wrap output, very annoying + mDebugger->sendCommand("-gdb-set", "new-console on"); + mDebugger->sendCommand("-gdb-set", "confirm off"); + mDebugger->sendCommand("-gdb-set", "print repeats 0"); // don't repeat elements + mDebugger->sendCommand("-gdb-set", "print elements 0"); // don't limit elements + mDebugger->sendCommand("-environment-cd", excludeTrailingPathDelimiter(debugFile.path())); // restore working directory if (!debugInferiorhasBreakpoint()) { - QString params; switch(getCompileTarget()) { case CompileTarget::None: return; case CompileTarget::File: - mDebugger->sendCommand("start",params); + mDebugger->sendCommand("-exec-run", "--start"); mDebugger->updateDebugInfo(); break; case CompileTarget::Project: - params = ""; - mDebugger->sendCommand("start",params); + mDebugger->sendCommand("-exec-run", "--start"); mDebugger->updateDebugInfo(); break; default: break; } } else { - QString params; switch(getCompileTarget()) { case CompileTarget::None: return; case CompileTarget::File: - mDebugger->sendCommand("run",params); + mDebugger->sendCommand("-exec-run",""); mDebugger->updateDebugInfo(); break; case CompileTarget::Project: - mDebugger->sendCommand("run",params); + mDebugger->sendCommand("-exec-run",""); mDebugger->updateDebugInfo(); break; default: @@ -1617,13 +1617,13 @@ void MainWindow::includeOrSkipDirs(const QStringList &dirs, bool skip) foreach (QString dir,dirs) { QString dirName = dir.replace('\\','/'); if (skip) { - mDebugger->sendCommand( - "skip", - QString("-gfi \"%1/%2\"") - .arg(dirName,"*.*")); +// mDebugger->sendCommand( +// "skip", +// QString("-gfi \"%1/%2\"") +// .arg(dirName,"*.*")); } else { mDebugger->sendCommand( - "dir", + "-environment-directory", QString("\"%1\"").arg(dirName)); } } @@ -3932,7 +3932,7 @@ void MainWindow::on_actionStep_Over_triggered() if (mDebugger->executing()) { //WatchView.Items.BeginUpdate(); mDebugger->invalidateAllVars(); - mDebugger->sendCommand("next", ""); + mDebugger->sendCommand("-exec-next", ""); mDebugger->updateDebugInfo(); mDebugger->refreshWatchVars(); } @@ -3943,7 +3943,7 @@ void MainWindow::on_actionStep_Into_triggered() if (mDebugger->executing()) { //WatchView.Items.BeginUpdate(); mDebugger->invalidateAllVars(); - mDebugger->sendCommand("step", ""); + mDebugger->sendCommand("-exec-step", ""); mDebugger->updateDebugInfo(); mDebugger->refreshWatchVars(); } @@ -3955,7 +3955,7 @@ void MainWindow::on_actionStep_Out_triggered() if (mDebugger->executing()) { //WatchView.Items.BeginUpdate(); mDebugger->invalidateAllVars(); - mDebugger->sendCommand("finish", ""); + mDebugger->sendCommand("-exec-finish", ""); mDebugger->updateDebugInfo(); mDebugger->refreshWatchVars(); } @@ -3969,8 +3969,8 @@ void MainWindow::on_actionRun_To_Cursor_triggered() if (e!=nullptr) { //WatchView.Items.BeginUpdate(); mDebugger->invalidateAllVars(); - mDebugger->sendCommand("tbreak", QString(" %1").arg(e->caretY())); - mDebugger->sendCommand("continue", ""); + mDebugger->sendCommand("-break-insert", QString("-t --line %1").arg(e->caretY())); + mDebugger->sendCommand("-exec-continue", ""); mDebugger->updateDebugInfo(); mDebugger->refreshWatchVars(); } @@ -3983,7 +3983,7 @@ void MainWindow::on_actionContinue_triggered() if (mDebugger->executing()) { //WatchView.Items.BeginUpdate(); mDebugger->invalidateAllVars(); - mDebugger->sendCommand("continue", ""); + mDebugger->sendCommand("-exec-continue", ""); mDebugger->updateDebugInfo(); mDebugger->refreshWatchVars(); } @@ -4044,7 +4044,7 @@ void MainWindow::onDebugMemoryAddressInput() if (!s.isEmpty()) { connect(mDebugger, &Debugger::memoryExamineReady, this, &MainWindow::onMemoryExamineReady); - mDebugger->sendCommand("x/64bx",s,false); + mDebugger->sendCommand("-data-read-memory/64bx",s,false); } }