From 1f09c6bc4568b80649d1102edad0a111a7b01aa3 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Fri, 22 Oct 2010 14:03:25 +0200 Subject: [PATCH] Debugger/Windows: Do not attach to process being debugged. Reviewed-by: Robert Loehning <robert.loehning@nokia.com> Task-number: QTCREATORBUG-2086 --- src/plugins/debugger/debuggerdialogs.cpp | 15 +++++++++++++++ src/plugins/debugger/debuggerdialogs.h | 2 ++ src/plugins/debugger/shared/dbgwinutils.cpp | 11 +++++++++++ src/plugins/debugger/shared/dbgwinutils.h | 2 ++ 4 files changed, 30 insertions(+) diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index a5431e584bf..370b18ea183 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -55,6 +55,7 @@ #include <QtGui/QPushButton> #include <QtGui/QProxyModel> #include <QtGui/QSortFilterProxyModel> +#include <QtGui/QMessageBox> using namespace Utils; @@ -424,6 +425,20 @@ void AttachExternalDialog::pidChanged(const QString &pid) okButton()->setEnabled(enabled); } +void AttachExternalDialog::accept() +{ +#ifdef Q_OS_WIN + const qint64 pid = attachPID(); + if (pid && isWinProcessBeingDebugged(pid)) { + QMessageBox::warning(this, tr("Process Already Under Debugger Control"), + tr("The process %1 is already under the control of a debugger.\n" + "Qt Creator cannot attach to it.").arg(pid)); + return; + } +#endif + QDialog::accept(); +} + /////////////////////////////////////////////////////////////////////// // diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h index 1cc868af4fe..e9b9b2f9154 100644 --- a/src/plugins/debugger/debuggerdialogs.h +++ b/src/plugins/debugger/debuggerdialogs.h @@ -92,6 +92,8 @@ public: qint64 attachPID() const; QString executable() const; + virtual void accept(); + private slots: void rebuildProcessList(); void procSelected(const QModelIndex &index); diff --git a/src/plugins/debugger/shared/dbgwinutils.cpp b/src/plugins/debugger/shared/dbgwinutils.cpp index e4de625e22c..1c5a1d210e9 100644 --- a/src/plugins/debugger/shared/dbgwinutils.cpp +++ b/src/plugins/debugger/shared/dbgwinutils.cpp @@ -242,5 +242,16 @@ QString winNormalizeFileName(const QString &f) return rc.isEmpty() ? f : rc; } +bool isWinProcessBeingDebugged(unsigned long pid) +{ + HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (processHandle == NULL) + return false; + BOOL debugged = FALSE; + CheckRemoteDebuggerPresent(processHandle, &debugged); + CloseHandle(processHandle); + return debugged != FALSE; +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/shared/dbgwinutils.h b/src/plugins/debugger/shared/dbgwinutils.h index 573c7ebd65e..8f841acd5cc 100644 --- a/src/plugins/debugger/shared/dbgwinutils.h +++ b/src/plugins/debugger/shared/dbgwinutils.h @@ -57,6 +57,8 @@ unsigned long winGetCurrentProcessId(); QString winNormalizeFileName(const QString &f); +bool isWinProcessBeingDebugged(unsigned long pid); + } // namespace Internal } // namespace Debugger -- GitLab