aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/process_ctrlc_stub.cpp
diff options
context:
space:
mode:
authorTobias Nätterlund <tobias.naetterlund.qnx@kdab.com>2013-05-03 13:52:52 +0200
committerhjk <hjk121@nokiamail.com>2013-05-06 08:59:41 +0200
commit515b6266c53094ce2337b5accef166659dc26891 (patch)
treeda6d2eda908480fe4df70d2c98c402c74f5e651b /src/libs/utils/process_ctrlc_stub.cpp
parent14eee567f1a496ea3735fb315c2ef57e39d78a50 (diff)
QNX: Fix shutdown of inferior and inserting breakpoints on Windows
When debugging on a QNX device on Windows, neither DebugBreakProcess(..) nor "-exec-interrupt" works for interrupting the inferior process. Neither does sending it a SIGINT signal using "kill" on the device. This changes the local gdb process to run under the CtrlC stub on Windows when debugging on QNX. This enables us to send a Ctrl+C message to gdb, which interrupts the inferior, and allows us to insert breakpoints during runtime on Windows. Change-Id: I4b01fbe81138f3fe7a939a7e64267bac4eb8bf43 Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'src/libs/utils/process_ctrlc_stub.cpp')
-rw-r--r--src/libs/utils/process_ctrlc_stub.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/libs/utils/process_ctrlc_stub.cpp b/src/libs/utils/process_ctrlc_stub.cpp
index 9deb84652d..07e200b9db 100644
--- a/src/libs/utils/process_ctrlc_stub.cpp
+++ b/src/libs/utils/process_ctrlc_stub.cpp
@@ -50,10 +50,12 @@
const wchar_t szTitle[] = L"qtcctrlcstub";
const wchar_t szWindowClass[] = L"wcqtcctrlcstub";
UINT uiShutDownWindowMessage;
+UINT uiInterruptMessage;
HWND hwndMain = 0;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
-BOOL WINAPI ctrlHandler(DWORD dwCtrlType);
+BOOL WINAPI shutdownHandler(DWORD dwCtrlType);
+BOOL WINAPI interruptHandler(DWORD dwCtrlType);
bool isSpaceOrTab(const wchar_t c);
bool startProcess(wchar_t pCommandLine[]);
@@ -64,8 +66,8 @@ int main(int argc, char **)
return 1;
}
- SetConsoleCtrlHandler(ctrlHandler, TRUE);
uiShutDownWindowMessage = RegisterWindowMessage(L"qtcctrlcstub_shutdown");
+ uiInterruptMessage = RegisterWindowMessage(L"qtcctrlcstub_interrupt");
WNDCLASSEX wcex = {0};
wcex.cbSize = sizeof(wcex);
@@ -117,9 +119,16 @@ int main(int argc, char **)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == uiShutDownWindowMessage) {
+ SetConsoleCtrlHandler(interruptHandler, FALSE);
+ SetConsoleCtrlHandler(shutdownHandler, TRUE);
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
PostQuitMessage(0);
return 0;
+ } else if (message == uiInterruptMessage) {
+ SetConsoleCtrlHandler(interruptHandler, TRUE);
+ SetConsoleCtrlHandler(shutdownHandler, FALSE);
+ GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
+ return 0;
}
switch (message)
@@ -138,12 +147,17 @@ bool isSpaceOrTab(const wchar_t c)
return c == L' ' || c == L'\t';
}
-BOOL WINAPI ctrlHandler(DWORD /*dwCtrlType*/)
+BOOL WINAPI shutdownHandler(DWORD /*dwCtrlType*/)
{
PostMessage(hwndMain, WM_DESTROY, 0, 0);
return TRUE;
}
+BOOL WINAPI interruptHandler(DWORD /*dwCtrlType*/)
+{
+ return TRUE;
+}
+
DWORD WINAPI processWatcherThread(LPVOID lpParameter)
{
HANDLE hProcess = reinterpret_cast<HANDLE>(lpParameter);