diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index a5431e584bf4f7d6aeae5c35ab4cc3f6fc0c5155..370b18ea1834c7f6445ecd1ff5bf9a193be45693 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 1cc868af4fe37f0ff6f7204a1c713e2a38cd1ff6..e9b9b2f9154a614cabc33fea59e3b2df22c51d10 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 e4de625e22ce6e57b2d6dc54acd31e5884eb7f5b..1c5a1d210e9ad1a63bc4c1abb83f33fba74ea71e 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 573c7ebd65e66b632e919191f406269c1e3520a1..8f841acd5cc88581673bb59d8b479db8b9de7d81 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