Index: trunk/src/shared/WheatyExceptionReport.cpp
===================================================================
--- trunk/src/shared/WheatyExceptionReport.cpp (revision 2)
+++ trunk/src/shared/WheatyExceptionReport.cpp (revision 28)
@@ -9,4 +9,5 @@
 #pragma warning(disable:4311)
 #include <windows.h>
+#include <tlhelp32.h>
 #include <stdio.h>
 #include <tchar.h>
@@ -328,4 +329,52 @@
 
 //===========================================================================
+void WheatyExceptionReport::printTracesForAllThreads()
+{
+  HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
+  THREADENTRY32 te32; 
+ 
+  DWORD dwOwnerPID = GetCurrentProcessId();
+  m_hProcess = GetCurrentProcess();
+  // Take a snapshot of all running threads  
+  hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
+  if( hThreadSnap == INVALID_HANDLE_VALUE ) 
+    return; 
+ 
+  // Fill in the size of the structure before using it. 
+  te32.dwSize = sizeof(THREADENTRY32 ); 
+ 
+  // Retrieve information about the first thread,
+  // and exit if unsuccessful
+  if( !Thread32First( hThreadSnap, &te32 ) ) 
+  {
+    CloseHandle( hThreadSnap );    // Must clean up the
+                                   //   snapshot object!
+    return;
+  }
+
+  // Now walk the thread list of the system,
+  // and display information about each thread
+  // associated with the specified process
+  do 
+  { 
+    if( te32.th32OwnerProcessID == dwOwnerPID )
+    {
+        CONTEXT context;
+        context.ContextFlags = 0xffffffff;
+        HANDLE threadHandle = OpenThread(THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION,false, te32.th32ThreadID);
+        if(threadHandle && GetThreadContext(threadHandle, &context))
+        {
+            WriteStackDetails( &context, false, threadHandle );
+        }
+        CloseHandle(threadHandle);
+    }
+  } while( Thread32Next(hThreadSnap, &te32 ) ); 
+
+//  Don't forget to clean up the snapshot object.
+  CloseHandle( hThreadSnap );
+}
+
+
+//===========================================================================
 // Open the report file, and write the desired information to it.  Called by
 // WheatyUnhandledExceptionFilter
@@ -412,5 +461,6 @@
     CONTEXT trashableContext = *pCtx;
 
-    WriteStackDetails( &trashableContext, false );
+    WriteStackDetails( &trashableContext, false, NULL );
+    printTracesForAllThreads();
 
 //    #ifdef _M_IX86                                          // X86 Only!
@@ -420,5 +470,5 @@
 
     trashableContext = *pCtx;
-    WriteStackDetails( &trashableContext, true );
+    WriteStackDetails( &trashableContext, true, NULL );
 
     _tprintf( _T("========================\r\n") );
@@ -552,5 +602,5 @@
 void WheatyExceptionReport::WriteStackDetails(
 PCONTEXT pContext,
-bool bWriteVariables )                                      // true if local/params should be output
+bool bWriteVariables, HANDLE pThreadHandle)                                      // true if local/params should be output
 {
     _tprintf( _T("\r\nCall stack:\r\n") );
@@ -592,5 +642,5 @@
         if ( ! StackWalk64(  dwMachineType,
             m_hProcess,
-            GetCurrentThread(),
+            pThreadHandle != NULL ? pThreadHandle : GetCurrentThread(),
             &sf,
             pContext,
Index: trunk/src/shared/WheatyExceptionReport.h
===================================================================
--- trunk/src/shared/WheatyExceptionReport.h (revision 2)
+++ trunk/src/shared/WheatyExceptionReport.h (revision 28)
@@ -80,6 +80,6 @@
             PEXCEPTION_POINTERS pExceptionInfo );
 
+        static void printTracesForAllThreads();
     private:
-
         // where report info is extracted and generated
         static void GenerateExceptionReport( PEXCEPTION_POINTERS pExceptionInfo );
@@ -93,5 +93,5 @@
             DWORD& section, DWORD_PTR& offset );
 
-        static void WriteStackDetails( PCONTEXT pContext, bool bWriteVariables );
+        static void WriteStackDetails( PCONTEXT pContext, bool bWriteVariables, HANDLE pThreadHandle);
 
         static BOOL CALLBACK EnumerateSymbolsCallback(PSYMBOL_INFO,ULONG, PVOID);
