diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc
index fbb901f3a..94431bb52 100644
--- a/winsup/cygwin/external.cc
+++ b/winsup/cygwin/external.cc
@@ -331,6 +331,10 @@ cygwin_internal (cygwin_getinfo_types t, ...)
 	}
 	break;
 
+      case CW_MAX_CYGWIN_PID:
+	res = MAX_PID;
+	break;
+
       case CW_EXTRACT_DOMAIN_AND_USER:
 	{
 	  WCHAR nt_domain[MAX_DOMAIN_NAME_LEN + 1];
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
index afc193fb7..fc91d04ac 100644
--- a/winsup/cygwin/include/sys/cygwin.h
+++ b/winsup/cygwin/include/sys/cygwin.h
@@ -159,6 +159,7 @@ typedef enum
     CW_EXCEPTION_RECORD_FROM_SIGINFO_T,
     CW_CYGHEAP_PROFTHR_ALL,
     CW_WINPID_TO_CYGWIN_PID,
+    CW_MAX_CYGWIN_PID,
   } cygwin_getinfo_types;
 
 #define CW_LOCK_PINFO CW_LOCK_PINFO
@@ -222,6 +223,7 @@ typedef enum
 #define CW_EXCEPTION_RECORD_FROM_SIGINFO_T CW_EXCEPTION_RECORD_FROM_SIGINFO_T
 #define CW_CYGHEAP_PROFTHR_ALL CW_CYGHEAP_PROFTHR_ALL
 #define CW_WINPID_TO_CYGWIN_PID CW_WINPID_TO_CYGWIN_PID
+#define CW_MAX_CYGWIN_PID CW_MAX_CYGWIN_PID
 
 /* Token type for CW_SET_EXTERNAL_TOKEN */
 enum
diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc
index 21c0835d4..c8b2e2cf5 100644
--- a/winsup/utils/strace.cc
+++ b/winsup/utils/strace.cc
@@ -672,6 +672,25 @@ GetFileNameFromHandle(HANDLE hFile, WCHAR pszFilename[MAX_PATH+1])
   return result;
 }
 
+static char *
+cygwin_pid (DWORD winpid)
+{
+  static char buf[48];
+  static DWORD max_cygpid = 0;
+  DWORD cygpid;
+
+  if (!max_cygpid)
+    max_cygpid = (DWORD) cygwin_internal (CW_MAX_CYGWIN_PID);
+
+  cygpid = (DWORD) cygwin_internal (CW_WINPID_TO_CYGWIN_PID, winpid);
+
+  if (cygpid >= max_cygpid)
+    snprintf (buf, sizeof buf, "%lu", winpid);
+  else
+    snprintf (buf, sizeof buf, "%lu (pid: %lu)", winpid, cygpid);
+  return buf;
+}
+
 static DWORD
 proc_child (unsigned mask, FILE *ofile, pid_t pid)
 {
@@ -706,7 +725,8 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid)
 	{
 	case CREATE_PROCESS_DEBUG_EVENT:
 	  if (events)
-	    fprintf (ofile, "--- Process %lu created\n", ev.dwProcessId);
+	    fprintf (ofile, "--- Process %s created\n",
+		     cygwin_pid (ev.dwProcessId));
 	  if (ev.u.CreateProcessInfo.hFile)
 	    CloseHandle (ev.u.CreateProcessInfo.hFile);
 	  add_child (ev.dwProcessId, ev.u.CreateProcessInfo.hProcess);
@@ -714,8 +734,8 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid)
 
 	case CREATE_THREAD_DEBUG_EVENT:
 	  if (events)
-	    fprintf (ofile, "--- Process %lu thread %lu created\n",
-		     ev.dwProcessId, ev.dwThreadId);
+	    fprintf (ofile, "--- Process %s thread %lu created\n",
+		     cygwin_pid (ev.dwProcessId), ev.dwThreadId);
 	  break;
 
 	case LOAD_DLL_DEBUG_EVENT:
@@ -727,8 +747,9 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid)
 	      if (!GetFileNameFromHandle(ev.u.LoadDll.hFile, dllname))
 		wcscpy(dllname, L"(unknown)");
 
-	      fprintf (ofile, "--- Process %lu loaded %ls at %p\n",
-		       ev.dwProcessId, dllname, ev.u.LoadDll.lpBaseOfDll);
+	      fprintf (ofile, "--- Process %s loaded %ls at %p\n",
+		       cygwin_pid (ev.dwProcessId), dllname,
+		       ev.u.LoadDll.lpBaseOfDll);
 	    }
 
 	  if (ev.u.LoadDll.hFile)
@@ -737,8 +758,8 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid)
 
 	case UNLOAD_DLL_DEBUG_EVENT:
 	  if (events)
-	    fprintf (ofile, "--- Process %lu unloaded DLL at %p\n",
-		     ev.dwProcessId, ev.u.UnloadDll.lpBaseOfDll);
+	    fprintf (ofile, "--- Process %s unloaded DLL at %p\n",
+		     cygwin_pid (ev.dwProcessId), ev.u.UnloadDll.lpBaseOfDll);
 	  break;
 
 	case OUTPUT_DEBUG_STRING_EVENT:
@@ -749,16 +770,18 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid)
 
 	case EXIT_PROCESS_DEBUG_EVENT:
 	  if (events)
-	    fprintf (ofile, "--- Process %lu exited with status 0x%lx\n",
-		     ev.dwProcessId, ev.u.ExitProcess.dwExitCode);
+	    fprintf (ofile, "--- Process %s exited with status 0x%lx\n",
+		     cygwin_pid (ev.dwProcessId), ev.u.ExitProcess.dwExitCode);
 	  res = ev.u.ExitProcess.dwExitCode;
 	  remove_child (ev.dwProcessId);
 	  break;
 
 	case EXIT_THREAD_DEBUG_EVENT:
 	  if (events)
-	    fprintf (ofile, "--- Process %lu thread %lu exited with status 0x%lx\n",
-		     ev.dwProcessId, ev.dwThreadId, ev.u.ExitThread.dwExitCode);
+	    fprintf (ofile, "--- Process %s thread %lu exited with "
+			    "status 0x%lx\n",
+		     cygwin_pid (ev.dwProcessId), ev.dwThreadId,
+		     ev.u.ExitThread.dwExitCode);
 	  break;
 
 	case EXCEPTION_DEBUG_EVENT:
@@ -770,8 +793,8 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid)
 	    default:
 	      status = DBG_EXCEPTION_NOT_HANDLED;
 	      if (ev.u.Exception.dwFirstChance)
-		fprintf (ofile, "--- Process %lu, exception %08lx at %p\n",
-			 ev.dwProcessId,
+		fprintf (ofile, "--- Process %s, exception %08lx at %p\n",
+			 cygwin_pid (ev.dwProcessId),
 			 ev.u.Exception.ExceptionRecord.ExceptionCode,
 			 ev.u.Exception.ExceptionRecord.ExceptionAddress);
 	      break;