diff options
author | hjk <hjk@theqtcompany.com> | 2015-02-13 23:15:28 +0100 |
---|---|---|
committer | hjk <hjk@theqtcompany.com> | 2015-05-08 10:50:34 +0000 |
commit | 5c58293a36b8b7700715163131e99c549623940d (patch) | |
tree | 1248d8d0da720fb8ea54a6da8534868ad6c3e97c | |
parent | 5b5192d344307f1515657553266d7f96180c695c (diff) | |
download | qt-creator-5c58293a36b8b7700715163131e99c549623940d.tar.gz |
Debugger: Some Python 3 support for PdbEngine
Change-Id: I052bc093086a5da0b2cbd4e99df32e42627ceaf5
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: hjk <hjk@theqtcompany.com>
-rw-r--r-- | share/qtcreator/debugger/pdbbridge.py | 18 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerruncontrol.cpp | 4 | ||||
-rw-r--r-- | src/plugins/debugger/pdb/pdbengine.cpp | 52 | ||||
-rw-r--r-- | src/plugins/debugger/pdb/pdbengine.h | 5 |
4 files changed, 47 insertions, 32 deletions
diff --git a/share/qtcreator/debugger/pdbbridge.py b/share/qtcreator/debugger/pdbbridge.py index 6d9ffe6cc2..fe30419756 100644 --- a/share/qtcreator/debugger/pdbbridge.py +++ b/share/qtcreator/debugger/pdbbridge.py @@ -1,11 +1,11 @@ -import pdb -import sys -import linecache -import inspect -import os - def qdebug(cmd, args): + + import sys + import linecache + import inspect + import os + class Dumper: def __init__(self): self.output = '' @@ -165,7 +165,11 @@ def qdebug(cmd, args): self.putField("childnumchild", 2) self.put("children=[") i = 0 - for (k, v) in value.iteritems(): + if sys.version_info[0] >= 3: + vals = value.iter() + else: + vals = value.iteritems() + for (k, v) in vals: self.put("{") self.putType(" ") self.putValue("%s: %s" % (k, v)) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 760fc6555d..4a4138162f 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -401,7 +401,9 @@ DebuggerRunControl *DebuggerRunControlFactory::doCreate } if (sp.masterEngineType == NoEngineType) { - if (sp.executable.endsWith(_(".py")) || sp.executable == _("/usr/bin/python")) { + if (sp.executable.endsWith(_(".py")) + || sp.executable == _("/usr/bin/python") + || sp.executable == _("/usr/bin/python3")) { sp.masterEngineType = PdbEngineType; } else { if (RunConfiguration *rc = sp.runConfiguration) { diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index 7bca79d9a3..278cd35594 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -82,23 +82,23 @@ void PdbEngine::executeDebuggerCommand(const QString &command, DebuggerLanguages showMessage(_("PDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + command); return; } - QTC_ASSERT(m_pdbProc.state() == QProcess::Running, notifyEngineIll()); + QTC_ASSERT(m_proc.state() == QProcess::Running, notifyEngineIll()); postDirectCommand(command.toLatin1()); } void PdbEngine::postDirectCommand(const QByteArray &command) { - QTC_ASSERT(m_pdbProc.state() == QProcess::Running, notifyEngineIll()); + QTC_ASSERT(m_proc.state() == QProcess::Running, notifyEngineIll()); showMessage(_(command), LogInput); - m_pdbProc.write(command + '\n'); + m_proc.write(command + '\n'); } void PdbEngine::runCommand(const DebuggerCommand &cmd) { - QTC_ASSERT(m_pdbProc.state() == QProcess::Running, notifyEngineIll()); + QTC_ASSERT(m_proc.state() == QProcess::Running, notifyEngineIll()); QByteArray command = "qdebug('" + cmd.function + "',{" + cmd.args + "})"; showMessage(_(command), LogInput); - m_pdbProc.write(command + '\n'); + m_proc.write(command + '\n'); } void PdbEngine::shutdownInferior() @@ -110,30 +110,30 @@ void PdbEngine::shutdownInferior() void PdbEngine::shutdownEngine() { QTC_ASSERT(state() == EngineShutdownRequested, qDebug() << state()); - m_pdbProc.kill(); + m_proc.kill(); } void PdbEngine::setupEngine() { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); - m_pdb = _("python"); - showMessage(_("STARTING PDB ") + m_pdb); + QString python = pythonInterpreter(); + showMessage(_("STARTING PDB ") + python); - connect(&m_pdbProc, static_cast<void(QProcess::*)(QProcess::ProcessError)>(&QProcess::error), + connect(&m_proc, static_cast<void(QProcess::*)(QProcess::ProcessError)>(&QProcess::error), this, &PdbEngine::handlePdbError); - connect(&m_pdbProc, static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished), + connect(&m_proc, static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished), this, &PdbEngine::handlePdbFinished); - connect(&m_pdbProc, &QProcess::readyReadStandardOutput, + connect(&m_proc, &QProcess::readyReadStandardOutput, this, &PdbEngine::readPdbStandardOutput); - connect(&m_pdbProc, &QProcess::readyReadStandardError, + connect(&m_proc, &QProcess::readyReadStandardError, this, &PdbEngine::readPdbStandardError); - m_pdbProc.start(m_pdb, QStringList() << _("-i")); + m_proc.start(python, QStringList() << _("-i")); - if (!m_pdbProc.waitForStarted()) { + if (!m_proc.waitForStarted()) { const QString msg = tr("Unable to start pdb \"%1\": %2") - .arg(m_pdb, m_pdbProc.errorString()); + .arg(pythonInterpreter(), m_proc.errorString()); notifyEngineSetupFailed(); showMessage(_("ADAPTER START FAILED")); if (!msg.isEmpty()) @@ -165,15 +165,23 @@ QString PdbEngine::mainPythonFile() const return QFileInfo(startParameters().processArgs).absoluteFilePath(); } +QString PdbEngine::pythonInterpreter() const +{ + return startParameters().executable; +} + void PdbEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); showStatusMessage(tr("Running requested..."), 5000); - const QByteArray dumperSourcePath = ICore::resourcePath().toLocal8Bit() + "/debugger/"; + QByteArray bridge = ICore::resourcePath().toUtf8() + "/debugger/pdbbridge.py"; + QByteArray pdb = "/usr/bin/pdb"; + if (pythonInterpreter().endsWith(QLatin1Char('3'))) + pdb += '3'; postDirectCommand("import sys"); postDirectCommand("sys.argv.append('" + mainPythonFile().toLocal8Bit() + "')"); - postDirectCommand("execfile('/usr/bin/pdb')"); - postDirectCommand("execfile('" + dumperSourcePath + "pdbbridge.py')"); + postDirectCommand("exec(open('" + pdb + "').read())"); + postDirectCommand("exec(open('" + bridge + "').read())"); attemptBreakpointSynchronization(); notifyEngineRunAndInferiorStopOk(); continueInferior(); @@ -412,7 +420,7 @@ void PdbEngine::handlePdbError(QProcess::ProcessError error) case QProcess::Timedout: default: //setState(EngineShutdownRequested, true); - m_pdbProc.kill(); + m_proc.kill(); AsynchronousMessageBox::critical(tr("Pdb I/O Error"), errorMessage(error)); break; } @@ -425,7 +433,7 @@ QString PdbEngine::errorMessage(QProcess::ProcessError error) const return tr("The Pdb process failed to start. Either the " "invoked program \"%1\" is missing, or you may have insufficient " "permissions to invoke the program.") - .arg(m_pdb); + .arg(pythonInterpreter()); case QProcess::Crashed: return tr("The Pdb process crashed some time after starting " "successfully."); @@ -454,7 +462,7 @@ void PdbEngine::handlePdbFinished(int code, QProcess::ExitStatus type) void PdbEngine::readPdbStandardError() { - QByteArray err = m_pdbProc.readAllStandardError(); + QByteArray err = m_proc.readAllStandardError(); qDebug() << "\nPDB STDERR" << err; //qWarning() << "Unexpected pdb stderr:" << err; //showMessage(_("Unexpected pdb stderr: " + err)); @@ -463,7 +471,7 @@ void PdbEngine::readPdbStandardError() void PdbEngine::readPdbStandardOutput() { - QByteArray out = m_pdbProc.readAllStandardOutput(); + QByteArray out = m_proc.readAllStandardOutput(); qDebug() << "\nPDB STDOUT" << out; handleOutput(out); } diff --git a/src/plugins/debugger/pdb/pdbengine.h b/src/plugins/debugger/pdb/pdbengine.h index 751ebbc943..d9575ef53e 100644 --- a/src/plugins/debugger/pdb/pdbengine.h +++ b/src/plugins/debugger/pdb/pdbengine.h @@ -97,7 +97,9 @@ private: bool supportsThreads() const { return true; } bool isSynchronous() const { return true; } void updateWatchItem(WatchItem *item); + QString mainPythonFile() const; + QString pythonInterpreter() const; void runCommand(const DebuggerCommand &cmd); void postDirectCommand(const QByteArray &command); @@ -121,8 +123,7 @@ private: void updateLocals(); QByteArray m_inbuffer; - QProcess m_pdbProc; - QString m_pdb; + QProcess m_proc; }; } // namespace Internal |