diff --git a/src/plugins/debugger/debugger.qbs b/src/plugins/debugger/debugger.qbs index 0560b5b4730a3a6428b601b5ac0041dac772b09a..cdf29d156cb8f0205480d31c5bf18119537f4879 100644 --- a/src/plugins/debugger/debugger.qbs +++ b/src/plugins/debugger/debugger.qbs @@ -109,7 +109,6 @@ QtcPlugin { "coregdbadapter.cpp", "coregdbadapter.h", "gdbengine.cpp", "gdbengine.h", "gdboptionspage.cpp", "gdboptionspage.h", - "gdbprocess.cpp", "gdbprocess.h", "gdbplainengine.cpp", "gdbplainengine.h", "remotegdbserveradapter.cpp", "remotegdbserveradapter.h", "startgdbserverdialog.cpp", "startgdbserverdialog.h", diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 8e2ba1835efff56ca9c373423151a54aa9b175a3..15b70ed9bedad22fdc88062a0f0b7b12b3579f59 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -551,6 +551,9 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl) if (!d->m_runParameters.environment.size()) d->m_runParameters.environment = Utils::Environment(); + if (isNativeMixedActive()) + d->m_runParameters.environment.set(QLatin1String("QV4_FORCE_INTERPRETER"), QLatin1String("1")); + action(OperateByInstruction)->setEnabled(hasCapability(DisassemblerCapability)); QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished, diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index f090b99ff083e2c6f8c3bfd787b85db1d1b57bdc..87f16d648afed5bfc6244a8e166f4150c56bf650 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -58,9 +58,9 @@ void GdbAttachEngine::setupEngine() showMessage(_("TRYING TO START ADAPTER")); if (!runParameters().workingDirectory.isEmpty()) - m_gdbProc->setWorkingDirectory(runParameters().workingDirectory); + m_gdbProc.setWorkingDirectory(runParameters().workingDirectory); if (runParameters().environment.size()) - m_gdbProc->setEnvironment(runParameters().environment.toStringList()); + m_gdbProc.setEnvironment(runParameters().environment); startGdb(); } diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h index 5f1bf28234ab453dde609cb111a807f4034f8088..a9ab9b5bd2c158f74ef7425b245157e798209512 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.h +++ b/src/plugins/debugger/gdb/attachgdbadapter.h @@ -32,7 +32,6 @@ #define DEBUGGER_ATTACHGDBADAPTER_H #include "gdbengine.h" -#include "gdbprocess.h" namespace Debugger { namespace Internal { diff --git a/src/plugins/debugger/gdb/gdb.pri b/src/plugins/debugger/gdb/gdb.pri index 1a9c3ddcee50bd37f73bc0570db63ae10f381845..00a6b0f007294904fae172449bf5c517574d0113 100644 --- a/src/plugins/debugger/gdb/gdb.pri +++ b/src/plugins/debugger/gdb/gdb.pri @@ -6,7 +6,6 @@ HEADERS += \ $$PWD/termgdbadapter.h \ $$PWD/remotegdbserveradapter.h \ $$PWD/gdbplainengine.h \ - $$PWD/gdbprocess.h \ $$PWD/startgdbserverdialog.h SOURCES += \ @@ -16,6 +15,5 @@ SOURCES += \ $$PWD/coregdbadapter.cpp \ $$PWD/termgdbadapter.cpp \ $$PWD/remotegdbserveradapter.cpp \ - $$PWD/gdbprocess.cpp \ $$PWD/gdbplainengine.cpp \ $$PWD/startgdbserverdialog.cpp diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index ff6cc8821c26a681f4695a74cde12cbb8798c25f..4a9a3bbeeb57d589b8fd14daef707e57e241634a 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -82,6 +82,7 @@ #include <QBuffer> #include <QDirIterator> #include <QMessageBox> +#include <QProcess> #include <QPushButton> #include <QTemporaryFile> @@ -241,7 +242,6 @@ GdbEngine::GdbEngine(const DebuggerRunParameters &startParameters) m_terminalTrap = startParameters.useTerminal; m_fullStartDone = false; m_systemDumpersLoaded = false; - m_gdbProc = new GdbProcess(this); m_debugInfoTaskHandler = new DebugInfoTaskHandler(this); //ExtensionSystem::PluginManager::addObject(m_debugInfoTaskHandler); @@ -282,7 +282,7 @@ QString GdbEngine::errorMessage(QProcess::ProcessError error) return tr("The gdb process failed to start. Either the " "invoked program \"%1\" is missing, or you may have insufficient " "permissions to invoke the program.\n%2") - .arg(m_gdb, m_gdbProc->errorString()); + .arg(m_gdb, m_gdbProc.errorString()); case QProcess::Crashed: if (targetState() == DebuggerFinished) return tr("The gdb process crashed some time after starting " @@ -763,7 +763,7 @@ void GdbEngine::handleResponse(const QByteArray &buff) void GdbEngine::readGdbStandardError() { - QByteArray err = m_gdbProc->readAllStandardError(); + QByteArray err = m_gdbProc.readAllStandardError(); showMessage(_("UNEXPECTED GDB STDERR: " + err)); if (err == "Undefined command: \"bb\". Try \"help\".\n") return; @@ -779,7 +779,7 @@ void GdbEngine::readGdbStandardOutput() int newstart = 0; int scan = m_inbuffer.size(); - QByteArray out = m_gdbProc->readAllStandardOutput(); + QByteArray out = m_gdbProc.readAllStandardOutput(); m_inbuffer.append(out); // This can trigger when a dialog starts a nested event loop. @@ -961,7 +961,7 @@ void GdbEngine::flushCommand(const DebuggerCommand &cmd0) return; } - QTC_ASSERT(m_gdbProc->state() == QProcess::Running, return); + QTC_ASSERT(m_gdbProc.state() == QProcess::Running, return); const int token = ++currentToken(); @@ -1039,7 +1039,7 @@ void GdbEngine::commandTimeout() if (mb->exec() == QMessageBox::Ok) { showMessage(_("KILLING DEBUGGER AS REQUESTED BY USER")); // This is an undefined state, so we just pull the emergency brake. - m_gdbProc->kill(); + m_gdbProc.kill(); notifyEngineShutdownFailed(); } else { showMessage(_("CONTINUE DEBUGGER AS REQUESTED BY USER")); @@ -1908,9 +1908,9 @@ void GdbEngine::notifyAdapterShutdownOk() { CHECK_STATE(EngineShutdownRequested); showMessage(_("INITIATE GDBENGINE SHUTDOWN IN STATE %1, PROC: %2") - .arg(lastGoodState()).arg(m_gdbProc->state())); + .arg(lastGoodState()).arg(m_gdbProc.state())); m_commandsDoneCallback = 0; - switch (m_gdbProc->state()) { + switch (m_gdbProc.state()) { case QProcess::Running: { if (runParameters().closeMode == KillAndExitMonitorAtClose) postCommand("monitor exit"); @@ -1926,7 +1926,7 @@ void GdbEngine::notifyAdapterShutdownOk() break; case QProcess::Starting: showMessage(_("GDB NOT REALLY RUNNING; KILLING IT")); - m_gdbProc->kill(); + m_gdbProc.kill(); notifyEngineShutdownFailed(); break; } @@ -1943,7 +1943,7 @@ void GdbEngine::handleGdbExit(const DebuggerResponse &response) QString::fromLocal8Bit(response.data["msg"].data())); qDebug() << (_("GDB WON'T EXIT (%1); KILLING IT").arg(msg)); showMessage(_("GDB WON'T EXIT (%1); KILLING IT").arg(msg)); - m_gdbProc->kill(); + m_gdbProc.kill(); notifyEngineShutdownFailed(); } } @@ -4073,7 +4073,7 @@ void GdbEngine::startGdb(const QStringList &args) foreach (int test, m_testCases) showMessage(_("ENABLING TEST CASE: " + QByteArray::number(test))); - m_gdbProc->disconnect(); // From any previous runs + m_gdbProc.disconnect(); // From any previous runs const DebuggerRunParameters &rp = runParameters(); m_gdb = gdbBinary(rp); @@ -4091,15 +4091,18 @@ void GdbEngine::startGdb(const QStringList &args) gdbArgs << _("-n"); gdbArgs += args; - connect(m_gdbProc, &GdbProcess::error, this, &GdbEngine::handleGdbError); - connect(m_gdbProc, &GdbProcess::finished, this, &GdbEngine::handleGdbFinished); - connect(m_gdbProc, &GdbProcess::readyReadStandardOutput, this, &GdbEngine::readGdbStandardOutput); - connect(m_gdbProc, &GdbProcess::readyReadStandardError, this, &GdbEngine::readGdbStandardError); + connect(&m_gdbProc, static_cast<void (QProcess::*)(QProcess::ProcessError)>(&QProcess::error), + this, &GdbEngine::handleGdbError); + connect(&m_gdbProc, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), + this, &GdbEngine::handleGdbFinished); + connect(&m_gdbProc, &QtcProcess::readyReadStandardOutput, this, &GdbEngine::readGdbStandardOutput); + connect(&m_gdbProc, &QtcProcess::readyReadStandardError, this, &GdbEngine::readGdbStandardError); showMessage(_("STARTING ") + m_gdb + _(" ") + gdbArgs.join(QLatin1Char(' '))); - m_gdbProc->start(m_gdb, gdbArgs); + m_gdbProc.setCommand(m_gdb, QtcProcess::joinArgs(gdbArgs)); + m_gdbProc.start(); - if (!m_gdbProc->waitForStarted()) { + if (!m_gdbProc.waitForStarted()) { handleGdbStartFailed(); const QString msg = errorMessage(QProcess::FailedToStart); handleAdapterStartFailed(msg); @@ -4328,8 +4331,7 @@ void GdbEngine::abortDebugger() if (targetState() == DebuggerFinished) { // We already tried. Try harder. showMessage(_("ABORTING DEBUGGER. SECOND TIME.")); - QTC_ASSERT(m_gdbProc, return); - m_gdbProc->kill(); + m_gdbProc.kill(); } else { // Be friendly the first time. This will change targetState(). showMessage(_("ABORTING DEBUGGER. FIRST TIME.")); @@ -4501,7 +4503,7 @@ void GdbEngine::handleAdapterCrashed(const QString &msg) notifyEngineIll(); // No point in being friendly here ... - m_gdbProc->kill(); + m_gdbProc.kill(); if (!msg.isEmpty()) AsynchronousMessageBox::critical(tr("Adapter crashed"), msg); @@ -4586,7 +4588,7 @@ bool GdbEngine::attemptQuickStart() const void GdbEngine::write(const QByteArray &data) { - m_gdbProc->write(data); + m_gdbProc.write(data); } bool GdbEngine::prepareCommand() diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 88caf6f2ac030d7bb41444e63b553e8a77879639..15450ced54d7ef762400abb8ca19ef5c75e78e44 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -41,6 +41,7 @@ #include <coreplugin/id.h> #include <projectexplorer/devicesupport/idevice.h> +#include <utils/qtcprocess.h> #include <QProcess> #include <QTextCodec> @@ -474,7 +475,9 @@ protected: bool prepareCommand(); void interruptLocalInferior(qint64 pid); - GdbProcess *m_gdbProc; +protected: + Utils::QtcProcess m_gdbProc; + QString m_errorString; ProjectExplorer::DeviceProcessSignalOperation::Ptr m_signalOperation; }; diff --git a/src/plugins/debugger/gdb/gdbplainengine.cpp b/src/plugins/debugger/gdb/gdbplainengine.cpp index a22a4d47a3b88805f9f7f6326c5c4fbc6dc47cf9..1980f9c32b52eb342a2fcdf5893db899cb5b369a 100644 --- a/src/plugins/debugger/gdb/gdbplainengine.cpp +++ b/src/plugins/debugger/gdb/gdbplainengine.cpp @@ -29,7 +29,6 @@ ****************************************************************************/ #include "gdbplainengine.h" -#include "gdbprocess.h" #include <debugger/debuggeractions.h> #include <debugger/debuggercore.h> @@ -127,9 +126,10 @@ void GdbPlainEngine::setupEngine() gdbArgs.append(_("--tty=") + m_outputCollector.serverName()); if (!runParameters().workingDirectory.isEmpty()) - m_gdbProc->setWorkingDirectory(runParameters().workingDirectory); - if (runParameters().environment.size()) - m_gdbProc->setEnvironment(runParameters().environment.toStringList()); + m_gdbProc.setWorkingDirectory(runParameters().workingDirectory); + Utils::Environment env = runParameters().environment; + if (env.size()) + m_gdbProc.setEnvironment(env); startGdb(gdbArgs); } diff --git a/src/plugins/debugger/gdb/gdbprocess.cpp b/src/plugins/debugger/gdb/gdbprocess.cpp deleted file mode 100644 index 7115923b6a1cfa287d4d272d249fa28e83c70b08..0000000000000000000000000000000000000000 --- a/src/plugins/debugger/gdb/gdbprocess.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms and -** conditions see http://www.qt.io/terms-conditions. For further information -** use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "gdbprocess.h" - -#include <debugger/debuggerconstants.h> -#include <debugger/debuggercore.h> -#include <debugger/procinterrupt.h> - -namespace Debugger { -namespace Internal { - -GdbProcess::GdbProcess(QObject *parent) : QObject(parent) -{ - connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)), - this, SIGNAL(error(QProcess::ProcessError))); - connect(&m_gdbProc, SIGNAL(finished(int,QProcess::ExitStatus)), - this, SIGNAL(finished(int,QProcess::ExitStatus))); - connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()), - this, SIGNAL(readyReadStandardOutput())); - connect(&m_gdbProc, SIGNAL(readyReadStandardError()), - this, SIGNAL(readyReadStandardError())); -} - -QByteArray GdbProcess::readAllStandardOutput() -{ - return m_gdbProc.readAllStandardOutput(); -} - -QByteArray GdbProcess::readAllStandardError() -{ - return m_gdbProc.readAllStandardError(); -} - -void GdbProcess::start(const QString &cmd, const QStringList &args) -{ - m_gdbProc.setCommand(cmd, Utils::QtcProcess::joinArgs(args)); - m_gdbProc.start(); -} - -bool GdbProcess::waitForStarted() -{ - return m_gdbProc.waitForStarted(); -} - -qint64 GdbProcess::write(const QByteArray &data) -{ - return m_gdbProc.write(data); -} - -void GdbProcess::kill() -{ - m_gdbProc.kill(); -} - -bool GdbProcess::interrupt() -{ - long pid = Utils::qPidToPid(m_gdbProc.pid()); - return interruptProcess(pid, GdbEngineType, &m_errorString); -} - -void GdbProcess::setUseCtrlCStub(bool enable) -{ - m_gdbProc.setUseCtrlCStub(enable); -} - -void GdbProcess::winInterruptByCtrlC() -{ - m_gdbProc.interrupt(); -} - -QProcess::ProcessState GdbProcess::state() const -{ - return m_gdbProc.state(); -} - -QString GdbProcess::errorString() const -{ - return m_errorString + m_gdbProc.errorString(); -} - -QProcessEnvironment GdbProcess::processEnvironment() const -{ - return m_gdbProc.processEnvironment(); -} - -void GdbProcess::setProcessEnvironment(const QProcessEnvironment &env) -{ - m_gdbProc.setProcessEnvironment(env); -} - -void GdbProcess::setEnvironment(const QStringList &env_) -{ - QStringList env = env_; - if (isNativeMixedActive()) - env.append(QLatin1String("QV4_FORCE_INTERPRETER=1")); // FIXME: REMOVE! - m_gdbProc.setEnvironment(Utils::Environment(env)); -} - -void GdbProcess::setWorkingDirectory(const QString &dir) -{ - m_gdbProc.setWorkingDirectory(dir); -} - -} // namespace Internal -} // namespace Debugger - diff --git a/src/plugins/debugger/gdb/gdbprocess.h b/src/plugins/debugger/gdb/gdbprocess.h deleted file mode 100644 index 4b8f3f276610661154abc29f6b45799b9a96db3b..0000000000000000000000000000000000000000 --- a/src/plugins/debugger/gdb/gdbprocess.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms and -** conditions see http://www.qt.io/terms-conditions. For further information -** use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef GDBPROCESS_H -#define GDBPROCESS_H - -#include <utils/qtcprocess.h> - -namespace Debugger { -namespace Internal { - -class GdbProcess : public QObject -{ - Q_OBJECT - -public: - explicit GdbProcess(QObject *parent = 0); - - QByteArray readAllStandardOutput(); - QByteArray readAllStandardError(); - - void start(const QString &cmd, const QStringList &args); - bool waitForStarted(); - qint64 write(const QByteArray &data); - void kill(); - bool interrupt(); - void setUseCtrlCStub(bool enable); - void winInterruptByCtrlC(); - - QProcess::ProcessState state() const; - QString errorString() const; - - QProcessEnvironment processEnvironment() const; - void setProcessEnvironment(const QProcessEnvironment &env); - void setEnvironment(const QStringList &env); - void setWorkingDirectory(const QString &dir); - -signals: - void error(QProcess::ProcessError); - void finished(int exitCode, QProcess::ExitStatus exitStatus); - void readyReadStandardError(); - void readyReadStandardOutput(); - -private: - Utils::QtcProcess m_gdbProc; - QString m_errorString; -}; - -} // namespace Internal -} // namespace Debugger - -#endif // GDBPROCESS_H diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index c908584e6305a9d8340ed2358c6d91205eb1afbc..9f1bed9d6a043023e693f2a4f365f89cbac75e94 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -30,13 +30,12 @@ #include "remotegdbserveradapter.h" -#include "gdbprocess.h" - #include <debugger/debuggeractions.h> #include <debugger/debuggercore.h> #include <debugger/debuggerprotocol.h> #include <debugger/debuggerstartparameters.h> #include <debugger/debuggerstringutils.h> +#include <debugger/procinterrupt.h> #include <coreplugin/messagebox.h> @@ -63,7 +62,7 @@ GdbRemoteServerEngine::GdbRemoteServerEngine(const DebuggerRunParameters &startP : GdbEngine(startParameters), m_startAttempted(false) { if (HostOsInfo::isWindowsHost()) - m_gdbProc->setUseCtrlCStub(startParameters.useCtrlCStub); // This is only set for QNX/BlackBerry + m_gdbProc.setUseCtrlCStub(startParameters.useCtrlCStub); // This is only set for QNX/BlackBerry connect(&m_uploadProc, static_cast<void (QProcess::*)(QProcess::ProcessError)>(&QProcess::error), this, &GdbRemoteServerEngine::uploadProcError); @@ -91,9 +90,9 @@ void GdbRemoteServerEngine::setupEngine() m_uploadProc.waitForStarted(); } if (!runParameters().workingDirectory.isEmpty()) - m_gdbProc->setWorkingDirectory(runParameters().workingDirectory); + m_gdbProc.setWorkingDirectory(runParameters().workingDirectory); if (runParameters().environment.size()) - m_gdbProc->setEnvironment(runParameters().environment.toStringList()); + m_gdbProc.setEnvironment(runParameters().environment); if (runParameters().remoteSetupNeeded) notifyEngineRequestRemoteSetup(); @@ -435,9 +434,10 @@ void GdbRemoteServerEngine::interruptInferior2() postCommand("-exec-interrupt", GdbEngine::Immediate, CB(handleInterruptInferior)); } else if (m_isQnxGdb && HostOsInfo::isWindowsHost()) { - m_gdbProc->winInterruptByCtrlC(); + m_gdbProc.interrupt(); } else { - bool ok = m_gdbProc->interrupt(); + long pid = Utils::qPidToPid(m_gdbProc.pid()); + bool ok = interruptProcess(pid, GdbEngineType, &m_errorString); if (!ok) { // FIXME: Extra state needed? showMessage(_("NOTE: INFERIOR STOP NOT POSSIBLE"));