/* Set tracing after a signal. */ void set_tracelevel(void) { if (new_tracelevel == tracelevel) return; /* If tracing entirely off, and there was no tracefile specified * on the command line, then leave it off. */ if (new_tracelevel > tracelevel && ftrace == NULL) { if (savetracename[0] != '\0') { set_tracefile(savetracename,sigtrace_pat,0); } else if (inittracename[0] != '\0') { set_tracefile(inittracename,sigtrace_pat,0); } else { new_tracelevel = 0; return; } } else { tracelevel_msg(sigtrace_pat, 0); } }
int main(int argc, char *argv[]) { int port = 2344; const char *config = "sys161.conf"; const char *kernel = NULL; int usetcp=0; char *argstr = NULL; int j, opt; size_t argsize=0; int debugwait=0; int pass_signals=0; #ifdef USE_TRACE int profiling=0; #endif int use_second_console=0; const char *second_console = NULL; unsigned ncpus; /* This must come absolutely first so msg() can be used. */ console_earlyinit(); if (sizeof(u_int32_t)!=4) { /* * Just in case. */ msg("sys161 requires sizeof(u_int32_t)==4"); die(); } while ((opt = mygetopt(argc, argv, "c:f:p:Pst:wk:"))!=-1) { switch (opt) { case 'c': config = myoptarg; break; case 'f': #ifdef USE_TRACE set_tracefile(myoptarg); #endif break; case 'p': port = atoi(myoptarg); usetcp=1; break; case 'P': #ifdef USE_TRACE profiling = 1; #endif break; case 's': pass_signals = 1; break; case 't': #ifdef USE_TRACE set_traceflags(myoptarg); #endif break; case 'w': debugwait = 1; break; case 'k': use_second_console = 1; second_console = myoptarg; break; default: usage(); break; } } if (myoptind==argc) { usage(); } kernel = argv[myoptind++]; for (j=myoptind; j<argc; j++) { argsize += strlen(argv[j])+1; } argstr = malloc(argsize+1); if (!argstr) { msg("malloc failed"); die(); } *argstr = 0; for (j=myoptind; j<argc; j++) { strcat(argstr, argv[j]); if (j<argc-1) strcat(argstr, " "); } /* This must come before bus_config in case a network card needs it */ mkdir(".sockets", 0700); console_init(pass_signals, use_second_console, second_console); clock_init(); ncpus = bus_config(config); initstats(ncpus); cpu_init(ncpus); if (usetcp) { gdb_inet_init(port); } else { unlink(".sockets/gdb"); gdb_unix_init(".sockets/gdb"); } unlink(".sockets/meter"); meter_init(".sockets/meter"); load_kernel(kernel, argstr); msg("System/161 %s, compiled %s %s", VERSION, __DATE__, __TIME__); #ifdef USE_TRACE print_traceflags(); if (profiling) { prof_setup(); } #endif if (debugwait) { stoploop(); } run(); #ifdef USE_TRACE if (profiling) { prof_write(); } #endif bus_cleanup(); console_cleanup(); clock_cleanup(); return 0; }
int main(int argc, char **argv, char **envp) { tnfctl_errcode_t err = TNFCTL_ERR_NONE; int sys_err; tnfctl_trace_attrs_t trace_attrs; tnfctl_event_t event = TNFCTL_EVENT_EINTR; pid_t prex_pid; /* internationalization stuff */ (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */ #endif (void) textdomain(TEXT_DOMAIN); g_argv = argv; prex_pid = getpid(); #if defined(DEBUG) fprintf(stderr, "### prex_pid = %d ###\n", prex_pid); #endif prex_dmodel = get_data_model(prex_pid); #if defined(DEBUG) fprintf(stderr, "### prex_dmodel = %d ###\n", prex_dmodel); #endif scanargs(argc, argv); if (g_kernelmode) { /* prexing the kernel */ err = tnfctl_kernel_open(&g_hndl); if (err) { err_fatal(gettext( "%s: trouble attaching to the kernel: %s\n"), argv[0], tnfctl_strerror(err)); } } else { /* prexing a user process */ if (g_targetpid != 0) { /* check data model */ check_pid_model(argv, envp); /* attach case */ err = tnfctl_pid_open(g_targetpid, &g_hndl); if (err == TNFCTL_ERR_NOLIBTNFPROBE) { err_fatal(gettext( "%s: missing symbols, is " "libtnfprobe.so loaded in target?\n"), argv[0], tnfctl_strerror(err)); } else if (err) { err_fatal(gettext( "%s: trouble attaching to target " "process: %s\n"), argv[0], tnfctl_strerror(err)); } } else { /* check elf class model */ check_exec_model(argv, envp); /* exec case */ err = tnfctl_exec_open(g_cmdname, g_cmdargs, NULL, g_preload, NULL, &g_hndl); if (err == TNFCTL_ERR_NONE) err = tnfctl_trace_attrs_get(g_hndl, &trace_attrs); if (err) { err_fatal(gettext( "%s: trouble creating target process: " "%s\n"), argv[0], tnfctl_strerror(err)); } g_targetpid = trace_attrs.targ_pid; } sys_err = set_signal(); if (sys_err) err_fatal(gettext( "%s: trouble setting up signal handler: %s\n"), argv[0], strerror(err)); } /* initialize the source stack for the parser */ source_init(); if (!g_kernelmode) { /* set the tracefile name and size */ err = set_tracefile(g_hndl); if (err) { (void) fprintf(stderr, gettext( "%s: trouble initializing tracefile: %s\n"), argv[0], tnfctl_strerror(err)); goto Cleanup; } err = check_trace_error(g_hndl); if (err) { (void) fprintf(stderr, gettext( "%s: cannot read tracing status : %s\n"), argv[0], tnfctl_strerror(err)); goto Cleanup; } } /* accept commands from stdin the first time through */ g_getcmds = B_TRUE; /* set up default aliases */ set_default_cmd(); /* set up creator/destructor function to call for new probes */ err = set_probe_discovery_callback(g_hndl); if (err) { (void) fprintf(stderr, gettext( "%s: error in probe discovery : %s\n"), argv[0], tnfctl_strerror(err)); goto Cleanup; } if (g_kernelmode) { prbk_warn_pfilter_empty(); } while (err == TNFCTL_ERR_NONE) { if (g_kernelmode || g_getcmds) { g_getcmds = B_FALSE; get_commands(); } if (!g_kernelmode && (g_getcmds == B_FALSE)) { err = tnfctl_continue(g_hndl, &event, NULL); if (err) { (void) fprintf(stderr, gettext( "%s: cannot continue target : %s\n"), argv[0], tnfctl_strerror(err)); goto Cleanup; } } err = check_trace_error(g_hndl); if (err) { (void) fprintf(stderr, gettext( "%s: cannot read tracing status : %s\n"), argv[0], tnfctl_strerror(err)); goto Cleanup; } if (!g_kernelmode) { if (event == TNFCTL_EVENT_EXEC) { (void) printf(gettext( "Target process exec'd\n")); quit(B_FALSE, B_TRUE); /* quit resume */ } else if (event == TNFCTL_EVENT_EXIT) { /* target exited */ (void) fprintf(stderr, gettext( "%s: target process exited\n"), g_argv[0]); goto Cleanup; } else if (event == TNFCTL_EVENT_TARGGONE) { /* target terminated */ (void) fprintf(stderr, gettext("%s: target process disappeared (without calling exit)\n"), g_argv[0]); goto Cleanup; } } } Cleanup: err = tnfctl_close(g_hndl, TNFCTL_TARG_DEFAULT); if (err) (void) fprintf(stderr, gettext( "%s: error on closing : %s\n"), argv[0], tnfctl_strerror(err)); exit(0); return (0); }