From b1bf4594bae61fbb94f191f3328dd4e65bf6ec46 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 27 Nov 2024 07:09:46 +0100 Subject: [PATCH] Debugger: Fix Run in Terminal and output retrieval for RL/Boot2Qt/QNX Amends 265491e408c. Replacing the DebuggerServerRunner by a simple Process lost the SimpleTargetRunner's ability to run in terminal and to display output. Re-add this. Fixes: QTCREATORBUG-32072 Fixes: QTCREATORBUG-32074 Change-Id: I6439eeacbb2561f08b93cba140836919afe56efb Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerruncontrol.cpp | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 04d282015d6..c864626a848 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -54,6 +54,7 @@ #include #include +#include #include using namespace Core; @@ -104,6 +105,9 @@ public: // DebugServer Process debuggerServerProc; + QTextCodec *debuggerServerCodec = QTextCodec::codecForName("utf8"); + QTextCodec::ConverterState outputCodecState; // FIXME: Handle on Process side. + QTextCodec::ConverterState errorCodecState; ProcessHandle serverAttachPid; bool serverUseMulti = true; bool serverEssential = true; @@ -1136,8 +1140,29 @@ void DebuggerRunTool::startDebugServerIfNeededAndContinueStartup() } } + if (auto terminalAspect = runControl()->aspectData()) { + const bool useTerminal = terminalAspect->useTerminal; + d->debuggerServerProc.setTerminalMode(useTerminal ? TerminalMode::Run : TerminalMode::Off); + } + d->debuggerServerProc.setCommand(cmd); + connect(&d->debuggerServerProc, &Process::readyReadStandardOutput, + this, [this] { + const QByteArray data = d->debuggerServerProc.readAllRawStandardOutput(); + const QString msg = d->debuggerServerCodec->toUnicode( + data.constData(), data.length(), &d->outputCodecState); + runControl()->postMessage(msg, StdOutFormat, false); + }); + + connect(&d->debuggerServerProc, &Process::readyReadStandardError, + this, [this] { + const QByteArray data = d->debuggerServerProc.readAllRawStandardError(); + const QString msg = d->debuggerServerCodec->toUnicode( + data.constData(), data.length(), &d->errorCodecState); + runControl()->postMessage(msg, StdErrFormat, false); + }); + connect(&d->debuggerServerProc, &Process::started, this, [this] { continueAfterDebugServerStart(); });