* [PATCH] Improve strace to log most Windows debug events @ 2015-06-10 12:05 Jon TURNEY 2015-06-10 14:11 ` Corinna Vinschen 2015-06-10 18:44 ` Jon TURNEY 0 siblings, 2 replies; 7+ messages in thread From: Jon TURNEY @ 2015-06-10 12:05 UTC (permalink / raw) To: cygwin-patches; +Cc: Jon TURNEY Not sure if this is wanted, but on a couple of occasions recently I have been presented with strace output which contains an exception at an address in an unknown module (i.e. not in the cygwin DLL or the main executable), so here is a patch which adds some more information, including DLL load addresses, to help interpret such straces. 2015-06-07 Jon Turney <jon.turney@dronecode.org.uk> * strace.cc (proc_child): Log process and thread create and exit, and DLL load and unload. (GetFileNameFromHandle): New function. * Makefile.in (strace.exe): Link against psapi.dll. Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> --- winsup/utils/ChangeLog | 7 ++++++ winsup/utils/Makefile.in | 2 +- winsup/utils/strace.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index bfdb42a..7561a58 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,10 @@ +2015-06-07 Jon Turney <jon.turney@dronecode.org.uk> + + * strace.cc (proc_child): Log process and thread create and exit, + and DLL load and unload. + (GetFileNameFromHandle): New function. + * Makefile.in (strace.exe): Link against psapi.dll. + 2015-04-21 Corinna Vinschen <corinna@vinschen.de> * tzmap-from-unicode.org: Convert Calcutta to Kolkata. diff --git a/winsup/utils/Makefile.in b/winsup/utils/Makefile.in index fe81d87..4dfe349 100644 --- a/winsup/utils/Makefile.in +++ b/winsup/utils/Makefile.in @@ -101,7 +101,7 @@ cygcheck.exe: ${CYGCHECK_OBJS} cygpath.o: CXXFLAGS += -fno-threadsafe-statics cygpath.exe: CYGWIN_LDFLAGS += -lcygwin -luserenv -lntdll ps.exe: CYGWIN_LDFLAGS += -lcygwin -lpsapi -lntdll -strace.exe: MINGW_LDFLAGS += -lntdll +strace.exe: MINGW_LDFLAGS += -lntdll -lpsapi ldd.exe:CYGWIN_LDFLAGS += -lpsapi pldd.exe: CYGWIN_LDFLAGS += -lpsapi diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc index 73096ab..f54cab5 100644 --- a/winsup/utils/strace.cc +++ b/winsup/utils/strace.cc @@ -12,6 +12,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include <windows.h> +#include <psapi.h> #include <winternl.h> #define cygwin_internal cygwin_internal_dontuse #include <stdio.h> @@ -637,6 +638,36 @@ handle_output_debug_string (DWORD id, LPVOID p, unsigned mask, FILE *ofile) fflush (ofile); } +// This is a pretty tragic way to convert HANDLE -> filename, but this is the +// the way MSDN suggest to do it if you want to be portable to Windows versions +// prior to 6.0, where GetFinalPathNameByHandle() isn't available. +static BOOL +GetFileNameFromHandle(HANDLE hFile, WCHAR pszFilename[MAX_PATH+1]) +{ + HANDLE hFileMap; + BOOL result = FALSE; + + // Create a file mapping object. + hFileMap = CreateFileMapping (hFile, NULL, PAGE_READONLY, 0, 1, NULL); + if (hFileMap) + { + // Create a file mapping to get the file name. + void* pMem = MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 1); + if (pMem) + { + if (GetMappedFileNameW (GetCurrentProcess (), pMem, pszFilename, + MAX_PATH)) + { + result = TRUE; + } + UnmapViewOfFile(pMem); + } + CloseHandle(hFileMap); + } + + return result; +} + static DWORD proc_child (unsigned mask, FILE *ofile, pid_t pid) { @@ -670,19 +701,38 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid) switch (ev.dwDebugEventCode) { case CREATE_PROCESS_DEBUG_EVENT: + fprintf (ofile, "--- Process %lu created\n", ev.dwProcessId); if (ev.u.CreateProcessInfo.hFile) CloseHandle (ev.u.CreateProcessInfo.hFile); add_child (ev.dwProcessId, ev.u.CreateProcessInfo.hProcess); break; case CREATE_THREAD_DEBUG_EVENT: + fprintf (ofile, "--- Process %lu thread %lu created\n", + ev.dwProcessId, ev.dwThreadId); break; case LOAD_DLL_DEBUG_EVENT: + { + // lpImageName is not always populated, so find the filename for + // hFile instead + WCHAR dllname[MAX_PATH+1]; + 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); + } + if (ev.u.LoadDll.hFile) CloseHandle (ev.u.LoadDll.hFile); break; + case UNLOAD_DLL_DEBUG_EVENT: + fprintf (ofile, "--- Process %lu unloaded DLL at %p\n", + ev.dwProcessId, ev.u.UnloadDll.lpBaseOfDll); + break; + case OUTPUT_DEBUG_STRING_EVENT: handle_output_debug_string (ev.dwProcessId, ev.u.DebugString.lpDebugStringData, @@ -690,9 +740,17 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid) break; case EXIT_PROCESS_DEBUG_EVENT: + fprintf (ofile, "--- Process %lu exited with status 0x%lx\n", + ev.dwProcessId, ev.u.ExitProcess.dwExitCode); res = ev.u.ExitProcess.dwExitCode; remove_child (ev.dwProcessId); break; + + case EXIT_THREAD_DEBUG_EVENT: + fprintf (ofile, "--- Process %lu thread %lu exited with status 0x%lx\n", + ev.dwProcessId, ev.dwThreadId, ev.u.ExitThread.dwExitCode); + break; + case EXCEPTION_DEBUG_EVENT: if (ev.u.Exception.ExceptionRecord.ExceptionCode != (DWORD) STATUS_BREAKPOINT) -- 2.1.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Improve strace to log most Windows debug events 2015-06-10 12:05 [PATCH] Improve strace to log most Windows debug events Jon TURNEY @ 2015-06-10 14:11 ` Corinna Vinschen 2015-06-10 14:18 ` Corinna Vinschen 2015-06-10 18:44 ` Jon TURNEY 1 sibling, 1 reply; 7+ messages in thread From: Corinna Vinschen @ 2015-06-10 14:11 UTC (permalink / raw) To: cygwin-patches [-- Attachment #1: Type: text/plain, Size: 969 bytes --] Hi Jon, On Jun 10 13:05, Jon TURNEY wrote: > Not sure if this is wanted, but on a couple of occasions recently I have been > presented with strace output which contains an exception at an address in an > unknown module (i.e. not in the cygwin DLL or the main executable), so here is a > patch which adds some more information, including DLL load addresses, to help > interpret such straces. That's a nice addition. Two points, though: - Do we *always* want that output or do we want a way to switch it on and off? If the latter, we can simply add another _STRACE_foo option for it. - The GetFileNameFromHandle function could be much simpler. Rather than opening a mapping object for ev.u.LoadDll.hFile, just use the existing mapping object from ev.u.LoadDll.lpBaseOfDll. Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat [-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Improve strace to log most Windows debug events 2015-06-10 14:11 ` Corinna Vinschen @ 2015-06-10 14:18 ` Corinna Vinschen 2015-06-10 15:44 ` Corinna Vinschen 0 siblings, 1 reply; 7+ messages in thread From: Corinna Vinschen @ 2015-06-10 14:18 UTC (permalink / raw) To: cygwin-patches [-- Attachment #1: Type: text/plain, Size: 1119 bytes --] On Jun 10 16:11, Corinna Vinschen wrote: > Hi Jon, > > On Jun 10 13:05, Jon TURNEY wrote: > > Not sure if this is wanted, but on a couple of occasions recently I have been > > presented with strace output which contains an exception at an address in an > > unknown module (i.e. not in the cygwin DLL or the main executable), so here is a > > patch which adds some more information, including DLL load addresses, to help > > interpret such straces. > > That's a nice addition. Two points, though: > > - Do we *always* want that output or do we want a way to switch it on > and off? If the latter, we can simply add another _STRACE_foo option > for it. > > - The GetFileNameFromHandle function could be much simpler. Rather than > opening a mapping object for ev.u.LoadDll.hFile, just use the existing > mapping object from ev.u.LoadDll.lpBaseOfDll. ...with the process handle taken from get_child(ev.dwProcessId). Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat [-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Improve strace to log most Windows debug events 2015-06-10 14:18 ` Corinna Vinschen @ 2015-06-10 15:44 ` Corinna Vinschen 2015-06-10 17:23 ` Corinna Vinschen 0 siblings, 1 reply; 7+ messages in thread From: Corinna Vinschen @ 2015-06-10 15:44 UTC (permalink / raw) To: cygwin-patches [-- Attachment #1: Type: text/plain, Size: 1529 bytes --] On Jun 10 16:18, Corinna Vinschen wrote: > On Jun 10 16:11, Corinna Vinschen wrote: > > Hi Jon, > > > > On Jun 10 13:05, Jon TURNEY wrote: > > > Not sure if this is wanted, but on a couple of occasions recently I have been > > > presented with strace output which contains an exception at an address in an > > > unknown module (i.e. not in the cygwin DLL or the main executable), so here is a > > > patch which adds some more information, including DLL load addresses, to help > > > interpret such straces. > > > > That's a nice addition. Two points, though: > > > > - Do we *always* want that output or do we want a way to switch it on > > and off? If the latter, we can simply add another _STRACE_foo option > > for it. > > > > - The GetFileNameFromHandle function could be much simpler. Rather than > > opening a mapping object for ev.u.LoadDll.hFile, just use the existing > > mapping object from ev.u.LoadDll.lpBaseOfDll. > > ...with the process handle taken from get_child(ev.dwProcessId). And since I'm generally fuzzy and unclear in my first reply: Of course, ev.u.LoadDll.lpBaseOfDll is not the mapping *object*, but the mapping *address*. So you neither have to call CreateFileMapping nor MapViewOfFile. Just call GetMappedFileNameW (get_child (ev.dwProcessId), ev.u.LoadDll.lpBaseOfDll, ...) Sorry, Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat [-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Improve strace to log most Windows debug events 2015-06-10 15:44 ` Corinna Vinschen @ 2015-06-10 17:23 ` Corinna Vinschen 2015-06-10 18:47 ` Jon TURNEY 0 siblings, 1 reply; 7+ messages in thread From: Corinna Vinschen @ 2015-06-10 17:23 UTC (permalink / raw) To: cygwin-patches [-- Attachment #1: Type: text/plain, Size: 3689 bytes --] On Jun 10 17:44, Corinna Vinschen wrote: > On Jun 10 16:18, Corinna Vinschen wrote: > > On Jun 10 16:11, Corinna Vinschen wrote: > > > Hi Jon, > > > > > > On Jun 10 13:05, Jon TURNEY wrote: > > > > Not sure if this is wanted, but on a couple of occasions recently I have been > > > > presented with strace output which contains an exception at an address in an > > > > unknown module (i.e. not in the cygwin DLL or the main executable), so here is a > > > > patch which adds some more information, including DLL load addresses, to help > > > > interpret such straces. > > > > > > That's a nice addition. Two points, though: > > > > > > - Do we *always* want that output or do we want a way to switch it on > > > and off? If the latter, we can simply add another _STRACE_foo option > > > for it. > > > > > > - The GetFileNameFromHandle function could be much simpler. Rather than > > > opening a mapping object for ev.u.LoadDll.hFile, just use the existing > > > mapping object from ev.u.LoadDll.lpBaseOfDll. > > > > ...with the process handle taken from get_child(ev.dwProcessId). > > And since I'm generally fuzzy and unclear in my first reply: > > Of course, ev.u.LoadDll.lpBaseOfDll is not the mapping *object*, but the > mapping *address*. So you neither have to call CreateFileMapping nor > MapViewOfFile. Just call GetMappedFileNameW (get_child (ev.dwProcessId), > ev.u.LoadDll.lpBaseOfDll, ...) This works for me resulting in Win32 pathnames. These are only the affected diff hunks, I omited the rest. Does that work for you? Btw., I don't like using MAX_PATH as maximum path length, but I think DLL paths can't be longer anyway, so that should be ok... diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc index 73096ab..0661e17 100644 --- a/winsup/utils/strace.cc +++ b/winsup/utils/strace.cc @@ -54,6 +54,8 @@ static BOOL close_handle (HANDLE h, DWORD ok); #define CloseHandle(h) close_handle(h, 0) +static void *drive_map; + struct child_list { DWORD id; @@ -637,6 +639,30 @@ handle_output_debug_string (DWORD id, LPVOID p, unsigned mask, FILE *ofile) fflush (ofile); } +static BOOL +GetFileNameFromHandle(HANDLE hFile, WCHAR pszFilename[MAX_PATH+1]) +{ + BOOL result = FALSE; + ULONG len = 0; + OBJECT_NAME_INFORMATION *ntfn = (OBJECT_NAME_INFORMATION *) alloca (65536); + NTSTATUS status = NtQueryObject (hFile, ObjectNameInformation, + ntfn, 65536, &len); + if (NT_SUCCESS (status)) + { + PWCHAR win32path = ntfn->Name.Buffer; + win32path[ntfn->Name.Length / sizeof (WCHAR)] = L'\0'; + + /* NtQueryObject returns a native NT path. (Try to) convert to Win32. */ + if (drive_map) + win32path = (PWCHAR) cygwin_internal (CW_MAP_DRIVE_MAP, drive_map, + win32path); + pszFilename[0] = L'\0'; + wcsncat (pszFilename, win32path, MAX_PATH); + result = TRUE; + } + return result; +} + static DWORD proc_child (unsigned mask, FILE *ofile, pid_t pid) { @@ -1090,7 +1143,13 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr); if (toggle) dotoggle (pid); else - ExitProcess (dostrace (mask, ofile, pid, argv + optind)); + { + drive_map = (void *) cygwin_internal (CW_ALLOC_DRIVE_MAP); + DWORD ret = dostrace (mask, ofile, pid, argv + optind); + if (drive_map) + cygwin_internal (CW_FREE_DRIVE_MAP, drive_map); + ExitProcess (ret); + } return 0; } Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat [-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Improve strace to log most Windows debug events 2015-06-10 17:23 ` Corinna Vinschen @ 2015-06-10 18:47 ` Jon TURNEY 0 siblings, 0 replies; 7+ messages in thread From: Jon TURNEY @ 2015-06-10 18:47 UTC (permalink / raw) To: cygwin-patches On 10/06/2015 18:23, Corinna Vinschen wrote: > On Jun 10 17:44, Corinna Vinschen wrote: >> On Jun 10 16:18, Corinna Vinschen wrote: >>> On Jun 10 16:11, Corinna Vinschen wrote: >>>> Hi Jon, >>>> >>>> On Jun 10 13:05, Jon TURNEY wrote: >>>>> Not sure if this is wanted, but on a couple of occasions recently I have been >>>>> presented with strace output which contains an exception at an address in an >>>>> unknown module (i.e. not in the cygwin DLL or the main executable), so here is a >>>>> patch which adds some more information, including DLL load addresses, to help >>>>> interpret such straces. >>>> >>>> That's a nice addition. Two points, though: >>>> >>>> - Do we *always* want that output or do we want a way to switch it on >>>> and off? If the latter, we can simply add another _STRACE_foo option >>>> for it. I'm not sure it makes much sense to use a _STRACE_foo flag, since those form a mask applied to a set of flags emitted by the cygwin DLL. I added a command line option to turn this additional logging off. >>>> >>>> - The GetFileNameFromHandle function could be much simpler. Rather than >>>> opening a mapping object for ev.u.LoadDll.hFile, just use the existing >>>> mapping object from ev.u.LoadDll.lpBaseOfDll. >>> >>> ...with the process handle taken from get_child(ev.dwProcessId). >> >> And since I'm generally fuzzy and unclear in my first reply: >> >> Of course, ev.u.LoadDll.lpBaseOfDll is not the mapping *object*, but the >> mapping *address*. So you neither have to call CreateFileMapping nor >> MapViewOfFile. Just call GetMappedFileNameW (get_child (ev.dwProcessId), >> ev.u.LoadDll.lpBaseOfDll, ...) > > This works for me resulting in Win32 pathnames. These are only the > affected diff hunks, I omited the rest. Does that work for you? > > Btw., I don't like using MAX_PATH as maximum path length, but I think > DLL paths can't be longer anyway, so that should be ok... > > > diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc > index 73096ab..0661e17 100644 > --- a/winsup/utils/strace.cc > +++ b/winsup/utils/strace.cc Yes, that seems to work. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] Improve strace to log most Windows debug events 2015-06-10 12:05 [PATCH] Improve strace to log most Windows debug events Jon TURNEY 2015-06-10 14:11 ` Corinna Vinschen @ 2015-06-10 18:44 ` Jon TURNEY 1 sibling, 0 replies; 7+ messages in thread From: Jon TURNEY @ 2015-06-10 18:44 UTC (permalink / raw) To: cygwin-patches; +Cc: Jon TURNEY Not sure if this is wanted, but on a couple of occasions recently I have been presented with strace output which contains an exception at an address in an unknown module (i.e. not in the cygwin DLL or the main executable), so here is a patch which adds some more information, including DLL load addresses, to help interpret such straces. v2: Use NtQueryObject() for HANDLE -> filename conversion Add new '-e' option to toggle this additional logging 2015-06-07 Jon Turney <jon.turney@dronecode.org.uk> * strace.cc (proc_child): Log process and thread create and exit, and DLL load and unload. (GetFileNameFromHandle): New function. Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> --- winsup/doc/utils.xml | 1 + winsup/utils/ChangeLog | 6 ++++ winsup/utils/strace.cc | 75 ++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/winsup/doc/utils.xml b/winsup/doc/utils.xml index adafc2b..673da3b 100644 --- a/winsup/doc/utils.xml +++ b/winsup/doc/utils.xml @@ -2002,6 +2002,7 @@ Trace system calls and signals -b, --buffer-size=SIZE set size of output file buffer -d, --no-delta don't display the delta-t microsecond timestamp + -e, --events log all Windows DEBUG_EVENTS (toggle - default true) -f, --trace-children trace child processes (toggle - default true) -h, --help output usage information and exit -m, --mask=MASK set message filter mask diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index f9a25b2..5a68a40 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,9 @@ +2015-06-07 Jon Turney <jon.turney@dronecode.org.uk> + + * strace.cc (proc_child): Log process and thread create and exit, + and DLL load and unload. + (GetFileNameFromHandle): New function. + 2015-06-10 Corinna Vinschen <corinna@vinschen.de> * ps.cc (main): Widen UID field in long format to accommodate longer diff --git a/winsup/utils/strace.cc b/winsup/utils/strace.cc index 73096ab..4b0d669 100644 --- a/winsup/utils/strace.cc +++ b/winsup/utils/strace.cc @@ -40,6 +40,7 @@ static int forkdebug = 1; static int numerror = 1; static int show_usecs = 1; static int delta = 1; +static int events = 1; static int hhmmss; static int bufsize; static int new_window; @@ -54,6 +55,8 @@ static BOOL close_handle (HANDLE h, DWORD ok); #define CloseHandle(h) close_handle(h, 0) +static void *drive_map; + struct child_list { DWORD id; @@ -637,6 +640,30 @@ handle_output_debug_string (DWORD id, LPVOID p, unsigned mask, FILE *ofile) fflush (ofile); } +static BOOL +GetFileNameFromHandle(HANDLE hFile, WCHAR pszFilename[MAX_PATH+1]) +{ + BOOL result = FALSE; + ULONG len = 0; + OBJECT_NAME_INFORMATION *ntfn = (OBJECT_NAME_INFORMATION *) alloca (65536); + NTSTATUS status = NtQueryObject (hFile, ObjectNameInformation, + ntfn, 65536, &len); + if (NT_SUCCESS (status)) + { + PWCHAR win32path = ntfn->Name.Buffer; + win32path[ntfn->Name.Length / sizeof (WCHAR)] = L'\0'; + + /* NtQueryObject returns a native NT path. (Try to) convert to Win32. */ + if (drive_map) + win32path = (PWCHAR) cygwin_internal (CW_MAP_DRIVE_MAP, drive_map, + win32path); + pszFilename[0] = L'\0'; + wcsncat (pszFilename, win32path, MAX_PATH); + result = TRUE; + } + return result; +} + static DWORD proc_child (unsigned mask, FILE *ofile, pid_t pid) { @@ -670,19 +697,42 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid) switch (ev.dwDebugEventCode) { case CREATE_PROCESS_DEBUG_EVENT: + if (events) + fprintf (ofile, "--- Process %lu created\n", ev.dwProcessId); if (ev.u.CreateProcessInfo.hFile) CloseHandle (ev.u.CreateProcessInfo.hFile); add_child (ev.dwProcessId, ev.u.CreateProcessInfo.hProcess); break; case CREATE_THREAD_DEBUG_EVENT: + if (events) + fprintf (ofile, "--- Process %lu thread %lu created\n", + ev.dwProcessId, ev.dwThreadId); break; case LOAD_DLL_DEBUG_EVENT: + if (events) + { + // lpImageName is not always populated, so find the filename for + // hFile instead + WCHAR dllname[MAX_PATH+1]; + 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); + } + if (ev.u.LoadDll.hFile) CloseHandle (ev.u.LoadDll.hFile); break; + case UNLOAD_DLL_DEBUG_EVENT: + if (events) + fprintf (ofile, "--- Process %lu unloaded DLL at %p\n", + ev.dwProcessId, ev.u.UnloadDll.lpBaseOfDll); + break; + case OUTPUT_DEBUG_STRING_EVENT: handle_output_debug_string (ev.dwProcessId, ev.u.DebugString.lpDebugStringData, @@ -690,9 +740,19 @@ proc_child (unsigned mask, FILE *ofile, pid_t pid) break; case EXIT_PROCESS_DEBUG_EVENT: + if (events) + fprintf (ofile, "--- Process %lu exited with status 0x%lx\n", + 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); + break; + case EXCEPTION_DEBUG_EVENT: if (ev.u.Exception.ExceptionRecord.ExceptionCode != (DWORD) STATUS_BREAKPOINT) @@ -873,6 +933,7 @@ Trace system calls and signals\n\ \n\ -b, --buffer-size=SIZE set size of output file buffer\n\ -d, --no-delta don't display the delta-t microsecond timestamp\n\ + -e, --events log all Windows DEBUG_EVENTS (toggle - default true)\n\ -f, --trace-children trace child processes (toggle - default true)\n\ -h, --help output usage information and exit\n\ -m, --mask=MASK set message filter mask\n\ @@ -928,6 +989,7 @@ Trace system calls and signals\n\ struct option longopts[] = { {"buffer-size", required_argument, NULL, 'b'}, + {"events", no_argument, NULL, 'e'}, {"help", no_argument, NULL, 'h'}, {"flush-period", required_argument, NULL, 'S'}, {"hex", no_argument, NULL, 'H'}, @@ -946,7 +1008,7 @@ struct option longopts[] = { {NULL, 0, NULL, 0} }; -static const char *const opts = "+b:dhHfm:no:p:qS:tTuVw"; +static const char *const opts = "+b:dehHfm:no:p:qS:tTuVw"; static void print_version () @@ -994,6 +1056,9 @@ main (int argc, char **argv) case 'd': delta ^= 1; break; + case 'e': + events ^= 1; + break; case 'f': forkdebug ^= 1; break; @@ -1090,7 +1155,13 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr); if (toggle) dotoggle (pid); else - ExitProcess (dostrace (mask, ofile, pid, argv + optind)); + { + drive_map = (void *) cygwin_internal (CW_ALLOC_DRIVE_MAP); + DWORD ret = dostrace (mask, ofile, pid, argv + optind); + if (drive_map) + cygwin_internal (CW_FREE_DRIVE_MAP, drive_map); + ExitProcess (ret); + } return 0; } -- 2.1.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-06-10 18:47 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-06-10 12:05 [PATCH] Improve strace to log most Windows debug events Jon TURNEY 2015-06-10 14:11 ` Corinna Vinschen 2015-06-10 14:18 ` Corinna Vinschen 2015-06-10 15:44 ` Corinna Vinschen 2015-06-10 17:23 ` Corinna Vinschen 2015-06-10 18:47 ` Jon TURNEY 2015-06-10 18:44 ` Jon TURNEY
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).