diff --git a/src/crashhandler/main.cpp b/src/crashhandler/main.cpp index c62b633f4d6..a4b01ec7e0a 100644 --- a/src/crashhandler/main.cpp +++ b/src/crashhandler/main.cpp @@ -91,8 +91,12 @@ int main( int argc, char *argv[] ) dlg.show(); app.exec(); - ResumeThread( stackTrace->thread ); - CloseHandle( stackTrace->thread ); + + for ( HANDLE threadHandle : stackTrace->threads ) + { + ResumeThread( threadHandle ); + CloseHandle( threadHandle ); + } CloseHandle( stackTrace->process ); return 0; diff --git a/src/crashhandler/qgsstacktrace.cpp b/src/crashhandler/qgsstacktrace.cpp index 84d209b33ae..e7c8083d910 100644 --- a/src/crashhandler/qgsstacktrace.cpp +++ b/src/crashhandler/qgsstacktrace.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -780,10 +781,35 @@ QgsStackTrace *QgsStackTrace::trace( DWORD processId, DWORD threadId, LPEXCEPTIO StackTrace *stackTrace = ( StackTrace * )calloc( sizeof( *stackTrace ), 1 ); stackTrace->process = OpenProcess( PROCESS_ALL_ACCESS, FALSE, processId ); stackTrace->thread = OpenThread( THREAD_ALL_ACCESS, FALSE, threadId ); - SuspendThread( stackTrace->thread ); trace->process = stackTrace->process; trace->thread = stackTrace->thread; + HANDLE h = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); + if ( h != INVALID_HANDLE_VALUE ) + { + THREADENTRY32 te; + te.dwSize = sizeof( te ); + if ( Thread32First( h, &te ) ) + { + do + { + if ( te.dwSize >= FIELD_OFFSET( THREADENTRY32, th32OwnerProcessID ) + + sizeof( te.th32OwnerProcessID ) ) + { + if ( te.th32OwnerProcessID == processId ) + { + HANDLE threadHandle = OpenThread( THREAD_ALL_ACCESS, FALSE, te.th32ThreadID ); + trace->threads.push_back( threadHandle ); + SuspendThread( threadHandle ); + } + } + te.dwSize = sizeof( te ); + } + while ( Thread32Next( h, &te ) ); + } + CloseHandle( h ); + } + ReadProcessMemory( stackTrace->process, exception, &remoteException, sizeof( remoteException ), NULL ); ReadProcessMemory( stackTrace->process, remoteException.ContextRecord, &remoteContextRecord, sizeof( remoteContextRecord ), NULL ); diff --git a/src/crashhandler/qgsstacktrace.h b/src/crashhandler/qgsstacktrace.h index fa220f25dcd..0f390e3c845 100644 --- a/src/crashhandler/qgsstacktrace.h +++ b/src/crashhandler/qgsstacktrace.h @@ -71,6 +71,7 @@ class QgsStackTrace #ifdef _MSC_VER HANDLE process; HANDLE thread; + std::vector threads; /** * Return a demangled stack backtrace of the caller function.