* Makefile.in (MINGW_INCLUDES): Change cygwin include.
* strace.cc: Use specific cygwin includes, as required. (load_cygwin): New function. Loads cygwin DLL, if necessary. (attach_process): Attaches strace to a running process. (dostrace): Accept pid argument. Attach to pid if supplied. (usage): Describe -p option. Correct system description. (longopts): Alphabetize. (opts): Ditto. (main): Ditto. Handle -p option. * Makefile.in (CXXFLAGS): Ensure that important settings are preserved even when overriden by command line.
This commit is contained in:
parent
494a66d9c5
commit
de6f83626a
|
@ -1,3 +1,20 @@
|
||||||
|
2002-01-28 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* Makefile.in (MINGW_INCLUDES): Change cygwin include.
|
||||||
|
* strace.cc: Use specific cygwin includes, as required.
|
||||||
|
(load_cygwin): New function. Loads cygwin DLL, if necessary.
|
||||||
|
(attach_process): Attaches strace to a running process.
|
||||||
|
(dostrace): Accept pid argument. Attach to pid if supplied.
|
||||||
|
(usage): Describe -p option. Correct system description.
|
||||||
|
(longopts): Alphabetize.
|
||||||
|
(opts): Ditto.
|
||||||
|
(main): Ditto. Handle -p option.
|
||||||
|
|
||||||
|
2002-01-21 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* Makefile.in (CXXFLAGS): Ensure that important settings are preserved
|
||||||
|
even when overriden by command line.
|
||||||
|
|
||||||
2002-01-21 Christopher Faylor <cgf@redhat.com>
|
2002-01-21 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* Makefile.in: Build intermediate cygcheck.o to force use of MINGW_CXXFLAGS.
|
* Makefile.in: Build intermediate cygcheck.o to force use of MINGW_CXXFLAGS.
|
||||||
|
|
|
@ -36,7 +36,7 @@ CXXFLAGS+=-fno-exceptions -fno-rtti -DHAVE_DECL_GETOPT=0
|
||||||
|
|
||||||
include $(srcdir)/../Makefile.common
|
include $(srcdir)/../Makefile.common
|
||||||
|
|
||||||
MINGW_INCLUDES:=$(MINGW_INCLUDES) $(cygwin_include) $(w32api_include)
|
MINGW_INCLUDES:=$(MINGW_INCLUDES) $(w32api_include) -I$(updir)
|
||||||
|
|
||||||
libbfd:=${shell $(CC) -L$(bupdir2)/bfd --print-file-name=libbfd.a}
|
libbfd:=${shell $(CC) -L$(bupdir2)/bfd --print-file-name=libbfd.a}
|
||||||
libintl:=${shell $(CC) -L$(bupdir2)/intl --print-file-name=libintl.a}
|
libintl:=${shell $(CC) -L$(bupdir2)/intl --print-file-name=libintl.a}
|
||||||
|
|
|
@ -10,6 +10,7 @@ This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
details. */
|
details. */
|
||||||
|
|
||||||
|
#define cygwin_internal cygwin_internal_dontuse
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
@ -19,7 +20,10 @@ details. */
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include "sys/strace.h"
|
#include <errno.h>
|
||||||
|
#include "cygwin/include/sys/strace.h"
|
||||||
|
#include "cygwin/include/sys/cygwin.h"
|
||||||
|
#undef cygwin_internal
|
||||||
|
|
||||||
/* GCC runtime library's C++ EH code unfortunately pulls in stdio, and we
|
/* GCC runtime library's C++ EH code unfortunately pulls in stdio, and we
|
||||||
get undefine references to __impure_ptr, and hence the following
|
get undefine references to __impure_ptr, and hence the following
|
||||||
|
@ -250,6 +254,49 @@ ctrl_c (DWORD)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD (*cygwin_internal) (int, ...);
|
||||||
|
|
||||||
|
static int
|
||||||
|
load_cygwin ()
|
||||||
|
{
|
||||||
|
static HMODULE h;
|
||||||
|
|
||||||
|
if (cygwin_internal)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (h)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!(h = LoadLibrary ("cygwin1.dll")))
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!(cygwin_internal = (DWORD (*) (int, ...)) GetProcAddress (h, "cygwin_internal")))
|
||||||
|
{
|
||||||
|
errno = ENOSYS;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
attach_process (pid_t pid)
|
||||||
|
{
|
||||||
|
load_cygwin ();
|
||||||
|
child_pid = (DWORD) cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
|
||||||
|
if (!child_pid)
|
||||||
|
error (0, "no such pid - %d", pid);
|
||||||
|
|
||||||
|
if (!DebugActiveProcess (child_pid))
|
||||||
|
error (0, "couldn't attach to pid %d<%d> for debugging", pid, child_pid);
|
||||||
|
|
||||||
|
(void) cygwin_internal (CW_STRACE_ON, pid);
|
||||||
|
printf ("Attached to pid %d (windows pid %u)\n", pid, (unsigned) child_pid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_child (char **argv)
|
create_child (char **argv)
|
||||||
{
|
{
|
||||||
|
@ -596,9 +643,14 @@ proc_child (unsigned mask, FILE *ofile)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dostrace (unsigned mask, FILE *ofile, char **argv)
|
dostrace (unsigned mask, FILE *ofile, pid_t pid, char **argv)
|
||||||
{
|
{
|
||||||
create_child (argv);
|
if (*argv && pid)
|
||||||
|
error (0, "can't use -p with program argument");
|
||||||
|
if (!pid)
|
||||||
|
create_child (argv);
|
||||||
|
else
|
||||||
|
attach_process (pid);
|
||||||
proc_child (mask, ofile);
|
proc_child (mask, ofile);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -733,6 +785,7 @@ Usage: strace [OPTIONS] <command-line>\n\
|
||||||
-h, --help display this help info\n\
|
-h, --help display this help info\n\
|
||||||
-m, --mask=MASK set message filter mask\n\
|
-m, --mask=MASK set message filter mask\n\
|
||||||
-o, --output=FILENAME set output file to FILENAME\n\
|
-o, --output=FILENAME set output file to FILENAME\n\
|
||||||
|
-p, --pid=n attach to executing program with cygwin pid n\n\
|
||||||
-n, --crack-error-numbers output descriptive text instead of error\n\
|
-n, --crack-error-numbers output descriptive text instead of error\n\
|
||||||
numbers for Windows errors\n\
|
numbers for Windows errors\n\
|
||||||
-S, --flush-period=PERIOD flush buffered strace output every PERIOD secs\n\
|
-S, --flush-period=PERIOD flush buffered strace output every PERIOD secs\n\
|
||||||
|
@ -762,7 +815,7 @@ Usage: strace [OPTIONS] <command-line>\n\
|
||||||
sigp 0x00800 (_STRACE_SIGP) Trace signal and process handling.\n\
|
sigp 0x00800 (_STRACE_SIGP) Trace signal and process handling.\n\
|
||||||
minimal 0x01000 (_STRACE_MINIMAL) Very minimal strace output.\n\
|
minimal 0x01000 (_STRACE_MINIMAL) Very minimal strace output.\n\
|
||||||
exitdump 0x04000 (_STRACE_EXITDUMP) Dump strace cache on exit.\n\
|
exitdump 0x04000 (_STRACE_EXITDUMP) Dump strace cache on exit.\n\
|
||||||
system 0x08000 (_STRACE_SYSTEM) Cache strace messages.\n\
|
system 0x08000 (_STRACE_SYSTEM) Serious error which goes to console and log.\n\
|
||||||
nomutex 0x10000 (_STRACE_NOMUTEX) Don't use mutex for synchronization.\n\
|
nomutex 0x10000 (_STRACE_NOMUTEX) Don't use mutex for synchronization.\n\
|
||||||
malloc 0x20000 (_STRACE_MALLOC) Trace malloc calls.\n\
|
malloc 0x20000 (_STRACE_MALLOC) Trace malloc calls.\n\
|
||||||
thread 0x40000 (_STRACE_THREAD) Thread-locking calls.\n\
|
thread 0x40000 (_STRACE_THREAD) Thread-locking calls.\n\
|
||||||
|
@ -776,28 +829,30 @@ version ()
|
||||||
}
|
}
|
||||||
|
|
||||||
struct option longopts[] = {
|
struct option longopts[] = {
|
||||||
{"help", no_argument, NULL, 'h'},
|
|
||||||
{"version", no_argument, NULL, 'v'},
|
|
||||||
{"buffer-size", required_argument, NULL, 'b'},
|
{"buffer-size", required_argument, NULL, 'b'},
|
||||||
{"mask", required_argument, NULL, 'm'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
{"output", required_argument, NULL, 'o'},
|
|
||||||
{"trace-children", no_argument, NULL, 'f'},
|
|
||||||
{"crack-error-numbers", no_argument, NULL, 'n'},
|
|
||||||
{"no-delta", no_argument, NULL, 'd'},
|
|
||||||
{"usecs", no_argument, NULL, 'u'},
|
|
||||||
{"timestamp", no_argument, NULL, 't'},
|
|
||||||
{"new-window", no_argument, NULL, 'w'},
|
|
||||||
{"flush-period", required_argument, NULL, 'S'},
|
{"flush-period", required_argument, NULL, 'S'},
|
||||||
|
{"mask", required_argument, NULL, 'm'},
|
||||||
|
{"new-window", no_argument, NULL, 'w'},
|
||||||
|
{"output", required_argument, NULL, 'o'},
|
||||||
|
{"no-delta", no_argument, NULL, 'd'},
|
||||||
|
{"pid", required_argument, NULL, 'p'},
|
||||||
|
{"timestamp", no_argument, NULL, 't'},
|
||||||
|
{"trace-children", no_argument, NULL, 'f'},
|
||||||
|
{"translate-error-numbers", no_argument, NULL, 'n'},
|
||||||
|
{"usecs", no_argument, NULL, 'u'},
|
||||||
|
{"version", no_argument, NULL, 'v'},
|
||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const opts = "hvb:m:o:fndutwS:";
|
static const char *const opts = "b:dhfm:no:p:S:tuvw";
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
unsigned mask = 0;
|
unsigned mask = 0;
|
||||||
FILE *ofile = NULL;
|
FILE *ofile = NULL;
|
||||||
|
pid_t attach_pid = 0;
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
if (!(pgm = strrchr (*argv, '\\')) && !(pgm = strrchr (*argv, '/')))
|
if (!(pgm = strrchr (*argv, '\\')) && !(pgm = strrchr (*argv, '/')))
|
||||||
|
@ -808,21 +863,19 @@ main (int argc, char **argv)
|
||||||
while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF)
|
while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF)
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
case 'h':
|
case 'b':
|
||||||
// Print help and exit
|
bufsize = atoi (optarg);
|
||||||
usage ();
|
|
||||||
return 1;
|
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'd':
|
||||||
// Print version info and exit
|
delta ^= 1;
|
||||||
version ();
|
|
||||||
return 1;
|
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
forkdebug ^= 1;
|
forkdebug ^= 1;
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'h':
|
||||||
bufsize = atoi (optarg);
|
// Print help and exit
|
||||||
|
usage ();
|
||||||
|
return 1;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
{
|
{
|
||||||
|
@ -836,6 +889,9 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'n':
|
||||||
|
numerror ^= 1;
|
||||||
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if ((ofile = fopen (optarg, "w")) == NULL)
|
if ((ofile = fopen (optarg, "w")) == NULL)
|
||||||
error (1, "can't open %s", optarg);
|
error (1, "can't open %s", optarg);
|
||||||
|
@ -843,27 +899,27 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr);
|
||||||
(void) fcntl (fileno (ofile), F_SETFD, 0);
|
(void) fcntl (fileno (ofile), F_SETFD, 0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'p':
|
||||||
numerror ^= 1;
|
attach_pid = strtol (optarg, NULL, 10);
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
flush_period = strtol (optarg, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
hhmmss ^= 1;
|
hhmmss ^= 1;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
|
||||||
delta ^= 1;
|
|
||||||
break;
|
|
||||||
case 'u':
|
case 'u':
|
||||||
// FIXME: This option isn't handled properly/at all by the
|
// FIXME: currently unimplemented
|
||||||
// program's logic. It seems to be the default, does it
|
|
||||||
// need to just be removed?
|
|
||||||
usecs ^= 1;
|
usecs ^= 1;
|
||||||
break;
|
break;
|
||||||
|
case 'v':
|
||||||
|
// Print version info and exit
|
||||||
|
version ();
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
new_window ^= 1;
|
new_window ^= 1;
|
||||||
break;
|
break;
|
||||||
case 'S':
|
|
||||||
flush_period = strtol (optarg, NULL, 10);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mask)
|
if (!mask)
|
||||||
|
@ -875,7 +931,7 @@ character #%d.\n", optarg, (int) (endptr - optarg), endptr);
|
||||||
if (!ofile)
|
if (!ofile)
|
||||||
ofile = stdout;
|
ofile = stdout;
|
||||||
|
|
||||||
dostrace (mask, ofile, argv + optind);
|
dostrace (mask, ofile, attach_pid, argv + optind);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef CloseHandle
|
#undef CloseHandle
|
||||||
|
|
Loading…
Reference in New Issue