* strace.cc (attach_process): Try to turn off DEBUG_ONLY_THIS_PROCESS
if Attaching to a process with the trace-children 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
This commit is contained in:
		| @@ -1,3 +1,11 @@ | ||||
| 2011-09-12  Jon TURNEY  <jon.turney@dronecode.org.uk> | ||||
|  | ||||
| 	* strace.cc (attach_process): Try to turn off DEBUG_ONLY_THIS_PROCESS | ||||
| 	if Attaching to a process with the trace-children 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 | ||||
|  | ||||
| 2011-08-21  Christopher Faylor  <me.cygwin2011@cgf.cx> | ||||
|  | ||||
| 	* Makefile.in: Check for header file existence when building dumper.exe | ||||
|   | ||||
| @@ -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 | ||||
|  | ||||
|   | ||||
| @@ -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, LPVOID p, unsigned mask, FILE *ofile) | ||||
|  | ||||
|   if (special == _STRACE_CHILD_PID) | ||||
|     { | ||||
|       if (!DebugActiveProcess (n)) | ||||
| 	error (0, "couldn't attach to subprocess %d for debugging, " | ||||
| 	       "windows error %d", n, GetLastError ()); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user