I have an application which implements crash handling and reporting using Google Crashpad and Sentry.
The application implements a watchdog which checks for freezes on critical threads, and aborts the application if it detects such a case.
However, when the "crash" gets reported to Sentry, the thread that "crashed" is, of course, the watchdog thread and not the actual thread which was frozen.
I need to trigger the frozen thread to abort to enable Sentry to correctly group related freezes together for analysis.
On POSIX systems, I can do this trivially:
pthread_kill(_threadHandle, SIGABRT);
On Windows, however, there doesn't seem to be an equivalent.
TerminateThread
cleanly kills the thread without triggering an abort, which is not suitable.
I believe that what I want to do is accomplishable with SuspendThread
, GetThreadContext
and ResumeThread
, but how do I do this without significantly corrupting the call stack (which needs to be intact for diagnosis)?
CodePudding user response:
You can set the trap flag to cause an EXCEPTION_SINGLE_STEP
.
CONTEXT context = { 0 };
context.ContextFlags = CONTEXT_ALL;
if (SuspendThread(hThread) == (DWORD)-1)
handleError();
if (!GetThreadContext(hThread, &context))
handleError();
context.EFlags |= 0x100; // set trap flag
if (!SetThreadContext(hThread, &context))
handleError();
if (ResumeThread(hThread) == (DWORD)-1)
handleError();