diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index b3f1f9e0f03f5b13d88fdafdc2cc2e15b144dacb..831fa82c99cff20547b76a451068e91a8d905b97 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -40,8 +40,10 @@ #endif #include <coreplugin/icore.h> +#include <utils/synchronousprocess.h> #include <QtCore/QDebug> +#include <QtCore/QProcess> #include <QtCore/QDir> #include <QtCore/QFile> #include <QtCore/QCoreApplication> @@ -183,14 +185,55 @@ static bool isUnixProcessId(const QString &procname) return true; } -// Determine UNIX processes by reading "/proc" + +// Determine UNIX processes by running ps +static QList<ProcData> unixProcessListPS() +{ +#ifdef Q_OS_MAC + static const char formatC[] = "pid state command"; +#else + static const char formatC[] = "pid,state,cmd"; +#endif + QList<ProcData> rc; + QProcess psProcess; + QStringList args; + args << QLatin1String("-e") << QLatin1String("-o") << QLatin1String(formatC); + psProcess.start(QLatin1String("ps"), args); + if (!psProcess.waitForStarted()) + return rc; + QByteArray output; + if (!Utils::SynchronousProcess::readDataFromProcess(psProcess, 30000, &output)) + return rc; + // Split "457 S+ /Users/foo.app" + const QStringList lines = QString::fromLocal8Bit(output).split(QLatin1Char('\n')); + const int lineCount = lines.size(); + const QChar blank = QLatin1Char(' '); + for (int l = 1; l < lineCount; l++) { // Skip header + const QString line = lines.at(l).simplified(); + const int pidSep = line.indexOf(blank); + const int cmdSep = pidSep != -1 ? line.indexOf(blank, pidSep + 1) : -1; + if (cmdSep > 0) { + ProcData procData; + procData.ppid = line.left(pidSep); + procData.state = line.mid(pidSep + 1, cmdSep - pidSep - 1); + procData.name = line.mid(cmdSep + 1); + rc.push_back(procData); + } + } + return rc; +} + +// Determine UNIX processes by reading "/proc". Default to ps if +// it does not exist static QList<ProcData> unixProcessList() { + const QDir procDir(QLatin1String("/proc/")); + if (!procDir.exists()) + return unixProcessListPS(); QList<ProcData> rc; - const QStringList procIds = QDir(QLatin1String("/proc/")).entryList(); + const QStringList procIds = procDir.entryList(); if (procIds.isEmpty()) return rc; - foreach (const QString &procId, procIds) { if (!isUnixProcessId(procId)) continue; @@ -250,6 +293,10 @@ AttachExternalDialog::AttachExternalDialog(QWidget *parent) m_ui->buttonBox->addButton(refreshButton, QDialogButtonBox::ActionRole); m_ui->filterWidget->setFocus(Qt::TabFocusReason); + m_ui->procView->setAlternatingRowColors(true); + m_ui->procView->setRootIsDecorated(false); + m_ui->procView->setUniformRowHeights(true); + // Do not use activated, will be single click in Oxygen connect(m_ui->procView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(procSelected(QModelIndex)));