At the moment, --trace-children (enabled by default) only works when the straced process is started by using strace with a command line.

This patch uses the undocumented NtSetInformationProcess(ProcessDebugFlags) call to make --trace-children work when attaching to a process with --pid

This patch removes the explicit DebugActiveProcess() on each child process: In my testing this was not needed when the process was created using CreateProcess() with the DEBUG_PROCESS flag, and failed error 87 when a process had been attached to with DebugActiveProcess() and then had the DEBUG_ONLY_THIS_PROCESS flag cleared.

In the alternative, the man page should be fixed to mention that tracing
child  processes is only possible when using a command line and not with --pid.

2011-09-12  Jon TURNEY  <[email protected]>

        * strace.cc (attach_process): Try to turn off DEBUG_ONLY_THIS_PROCESS
        if attaching to a process with the forkdebug flag set.
        (handle_output_debug_string): Apparently we don't need to explicitly
        attach for debugging when a child process starts
        * Makefile.in (strace.exe): Link with ntdll

At the moment, --trace-children only works when using strace with a command 
line.
This makes --trace-children work when attaching to a process by --pid

Index: utils/strace.cc
===================================================================
--- utils/strace.cc.orig
+++ utils/strace.cc
@@ -27,6 +27,7 @@ details. */
 #include "path.h"
 #undef cygwin_internal
 #include "loadlib.h"
+#include "ddk/ntapi.h"
 
 /* we *know* we're being built with GCC */
 #define alloca __builtin_alloca
@@ -293,6 +294,9 @@ load_cygwin ()
   return 1;
 }
 
+#define DEBUG_PROCESS_DETACH_ON_EXIT    0x00000001
+#define DEBUG_PROCESS_ONLY_THIS_PROCESS 0x00000002
+
 static void
 attach_process (pid_t pid)
 {
@@ -303,6 +307,23 @@ attach_process (pid_t pid)
   if (!DebugActiveProcess (child_pid))
     error (0, "couldn't attach to pid %d for debugging", child_pid);
 
+  if (forkdebug)
+    {
+      HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, child_pid);
+
+      if (h)
+        {
+          /* Try to turn off DEBUG_ONLY_THIS_PROCESS so we can follow forks */
+          /* This is only supported on XP and later */
+          ULONG DebugFlags = DEBUG_PROCESS_DETACH_ON_EXIT;
+          NTSTATUS status = NtSetInformationProcess(h, ProcessDebugFlags, 
&DebugFlags, sizeof(DebugFlags));
+          if (status)
+            warn (0, "Could not clear DEBUG_ONLY_THIS_PROCESS (%x), will not 
trace child processes", status);
+
+          CloseHandle(h);
+        }
+    }
+
   return;
 }
 
@@ -467,9 +488,6 @@ handle_output_debug_string (DWORD id, LP
 
   if (special == _STRACE_CHILD_PID)
     {
-      if (!DebugActiveProcess (n))
-       error (0, "couldn't attach to subprocess %d for debugging, "
-              "windows error %d", n, GetLastError ());
       return;
     }
 
Index: utils/Makefile.in
===================================================================
--- utils/Makefile.in.orig
+++ utils/Makefile.in
@@ -78,6 +78,7 @@ cygcheck.exe: MINGW_LDFLAGS += -lntdll
 cygpath.exe: ALL_LDFLAGS += -lcygwin -lntdll
 cygpath.exe: CXXFLAGS += -fno-threadsafe-statics
 ps.exe: ALL_LDFLAGS += -lcygwin -lntdll
+strace.exe: MINGW_LDFLAGS += -lntdll
 
 ldd.exe: ALL_LDFLAGS += -lpsapi
 

Reply via email to