From dddd905bc77301db7a52ce9fe4a7ed9331eef590 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Wed, 11 Feb 2009 14:52:29 +0100 Subject: [PATCH] Fixes: debugger: procinterrupt logic --- src/plugins/debugger/procinterrupt.cpp | 66 +++++++++++++++----------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/src/plugins/debugger/procinterrupt.cpp b/src/plugins/debugger/procinterrupt.cpp index 824ccac41f1..47a309deac8 100644 --- a/src/plugins/debugger/procinterrupt.cpp +++ b/src/plugins/debugger/procinterrupt.cpp @@ -33,7 +33,8 @@ #include "procinterrupt.h" -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) + #include <windows.h> #include <Tlhelp32.h> @@ -75,7 +76,37 @@ DWORD findProcessId(DWORD parentId) CloseHandle(hProcList); return procId; } -#else + +bool Debugger::Internal::interruptProcess(int pID) +{ + DWORD pid = pID; + if (!pid) + return false; + + PtrCreateRemoteThread libFunc = resolveCreateRemoteThread(); + if (libFunc) { + DWORD dwThreadId = 0; + HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, false, pid); + HANDLE hthread = libFunc(hproc, NULL, 0, (LPTHREAD_START_ROUTINE)DebugBreak, 0, 0, &dwThreadId); + CloseHandle(hthread); + if (dwThreadId) + return true; + } + + return false; +} + +bool Debugger::Internal::interruptChildProcess(Q_PID parentPID) +{ + DWORD pid = findProcessId(parentPID->dwProcessId); + return interruptProcess(pid); +} + +#endif // defined(Q_OS_WIN) + + + +#if defined(Q_OS_LINUX) || defined(Q_OS_MAC) #include <QtCore/QLatin1String> #include <QtCore/QString> @@ -89,12 +120,14 @@ DWORD findProcessId(DWORD parentId) #include <sys/sysctl.h> -#define OPProcessValueUnknown UINT_MAX + +using namespace Debugger::Internal; /* Mac OS X int OPParentIDForProcessID(int pid) // Returns the parent process id for the given process id (pid) { + const uint OPProcessValueUnknown = UINT_MAX; struct kinfo_proc info; size_t length = sizeof(struct kinfo_proc); int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid }; @@ -140,44 +173,21 @@ int findChildProcess(int parentId) return -1; } -#endif - bool Debugger::Internal::interruptProcess(int pID) { -#ifdef Q_OS_WIN - DWORD pid = pID; - if (!pid) - return false; - - PtrCreateRemoteThread libFunc = resolveCreateRemoteThread(); - if (libFunc) { - DWORD dwThreadId = 0; - HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, false, pid); - HANDLE hthread = libFunc(hproc, NULL, 0, (LPTHREAD_START_ROUTINE)DebugBreak, 0, 0, &dwThreadId); - CloseHandle(hthread); - if (dwThreadId) - return true; - } -#else int procId = pID; if (procId != -1) { if (kill(procId, SIGINT) == 0) return true; } - -#endif - return false; } bool Debugger::Internal::interruptChildProcess(Q_PID parentPID) { -#ifdef WIN32 - DWORD pid = findProcessId(parentPID->dwProcessId); - return interruptProcess(pid); -#else int procId = findChildProcess(parentPID); //qDebug() << "INTERRUPTING PROCESS" << procId; return interruptProcess(procId); -#endif } + +#endif // defined(Q_OS_LINUX) || defined(Q_OS_MAC) -- GitLab