* 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:
Jon TURNEY 2011-09-15 16:49:51 +00:00
parent c9925bf497
commit 02a7f96ef7
3 changed files with 30 additions and 3 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}