127 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* cygwin.cc: general system debugging tool.
 | 
						|
 | 
						|
   Copyright 1996, 1998 Cygnus Solutions.
 | 
						|
 | 
						|
This file is part of Cygwin.
 | 
						|
 | 
						|
This software is a copyrighted work licensed under the terms of the
 | 
						|
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | 
						|
details. */
 | 
						|
 | 
						|
/* This program is intended to be a general tool for debugging cygwin.
 | 
						|
   Possibilities include
 | 
						|
   - dumping various internal data structures
 | 
						|
   - poking various values into system tables
 | 
						|
   - turning on strace'ing for arbitrary tasks
 | 
						|
   */
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <getopt.h>
 | 
						|
#include <windows.h>
 | 
						|
#include "winsup.h"
 | 
						|
 | 
						|
static char *prog_name;
 | 
						|
 | 
						|
static void
 | 
						|
usage (FILE *stream, int status)
 | 
						|
{
 | 
						|
  fprintf (stream, "\
 | 
						|
Usage: %s \\\n\
 | 
						|
       [-s|--strace pid mask]\\\n\
 | 
						|
       [-H|--help] [-V|--version]\n\
 | 
						|
",
 | 
						|
	   prog_name);
 | 
						|
  exit (status);
 | 
						|
}
 | 
						|
 | 
						|
static struct option long_options[] =
 | 
						|
{
 | 
						|
  { "version", no_argument, NULL, 'V' },
 | 
						|
  { "help", no_argument, NULL, 'H' },
 | 
						|
  { "strace", required_argument, NULL, 's' },
 | 
						|
  { 0, no_argument, 0, 0 }
 | 
						|
};
 | 
						|
 | 
						|
struct strace_args
 | 
						|
{
 | 
						|
  int pid;
 | 
						|
  int mask;
 | 
						|
  char *fn;
 | 
						|
};
 | 
						|
 | 
						|
/* Turn on strace'ing for the indicated pid.  */
 | 
						|
 | 
						|
static void
 | 
						|
set_strace (strace_args *args)
 | 
						|
{
 | 
						|
  shared_info *s = cygwin_getshared ();
 | 
						|
 | 
						|
  pinfo *p = s->p[args->pid];
 | 
						|
 | 
						|
  if (!p)
 | 
						|
    {
 | 
						|
      fprintf (stderr, "%s: process %d not found\n", prog_name, args->pid);
 | 
						|
      exit (1);
 | 
						|
    }
 | 
						|
 | 
						|
  p->strace_mask = args->mask;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
main (int argc, char *argv[])
 | 
						|
{
 | 
						|
  int c;
 | 
						|
  int seen_flag_p = 0;
 | 
						|
  int show_version_p = 0;
 | 
						|
  int set_strace_p = 0;
 | 
						|
  strace_args strace_args;
 | 
						|
 | 
						|
  prog_name = strrchr (argv[0], '/');
 | 
						|
  if (prog_name == NULL)
 | 
						|
    prog_name = strrchr (argv[0], '\\');
 | 
						|
  if (prog_name == NULL)
 | 
						|
    prog_name = argv[0];
 | 
						|
 | 
						|
  while ((c = getopt_long (argc, argv, "HVs:", long_options, (int *) 0))
 | 
						|
	 != EOF)
 | 
						|
    {
 | 
						|
      seen_flag_p = 1;
 | 
						|
 | 
						|
      switch (c)
 | 
						|
	{
 | 
						|
	case 'H':
 | 
						|
	  usage (stdout, 0);
 | 
						|
	  break;
 | 
						|
	case 'V':
 | 
						|
	  show_version_p = 1;
 | 
						|
	  break;
 | 
						|
	case 's':
 | 
						|
	  if (optind + 1 > argc)
 | 
						|
	    usage (stderr, 1);
 | 
						|
	  strace_args.pid = atoi (optarg);
 | 
						|
	  if (optind < argc)
 | 
						|
	    strace_args.mask = atoi (argv[optind++]);
 | 
						|
	  if (optind < argc)
 | 
						|
	    strace_args.fn = argv[optind++];
 | 
						|
	  set_strace_p = 1;
 | 
						|
	  break;
 | 
						|
	default:
 | 
						|
	  usage (stderr, 1);
 | 
						|
	  break;
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
  if (show_version_p)
 | 
						|
    printf ("CYGWIN version ???\n");
 | 
						|
 | 
						|
  if (!seen_flag_p || optind != argc)
 | 
						|
    usage (stderr, 1);
 | 
						|
 | 
						|
  if (set_strace_p)
 | 
						|
    set_strace (&strace_args);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 |