summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/external.cc4
-rw-r--r--winsup/cygwin/include/sys/cygwin.h2
-rw-r--r--winsup/utils/strace.cc49
3 files changed, 42 insertions, 13 deletions
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;