diff options
author | Tobias Nätterlund <tobias.naetterlund.qnx@kdab.com> | 2013-05-03 13:52:52 +0200 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2013-05-06 08:59:41 +0200 |
commit | 515b6266c53094ce2337b5accef166659dc26891 (patch) | |
tree | da6d2eda908480fe4df70d2c98c402c74f5e651b /src/libs/utils/process_ctrlc_stub.cpp | |
parent | 14eee567f1a496ea3735fb315c2ef57e39d78a50 (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.cpp | 20 |
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); |