void ltrace_init(int argc, char **argv) { struct opt_p_t *opt_p_tmp; atexit(normal_exit); signal(SIGINT, signal_exit); /* Detach processes when interrupted */ signal(SIGTERM, signal_exit); /* ... or killed */ argv = process_options(argc, argv); init_global_config(); while (opt_F) { /* If filename begins with ~, expand it to the user's home */ /* directory. This does not correctly handle ~yoda, but that */ /* isn't as bad as it seems because the shell will normally */ /* be doing the expansion for us; only the hardcoded */ /* ~/.ltrace.conf should ever use this code. */ if (opt_F->filename[0] == '~') { char path[PATH_MAX]; char *home_dir = getenv("HOME"); if (home_dir) { strncpy(path, home_dir, PATH_MAX - 1); path[PATH_MAX - 1] = '\0'; strncat(path, opt_F->filename + 1, PATH_MAX - strlen(path) - 1); read_config_file(path); } } else { read_config_file(opt_F->filename); } struct opt_F_t *next = opt_F->next; if (opt_F->own_filename) free(opt_F->filename); free(opt_F); opt_F = next; } if (command) { /* Check that the binary ABI is supported before * calling execute_program. */ struct ltelf lte = {}; open_elf(<e, command); do_close_elf(<e); pid_t pid = execute_program(command, argv); struct Process *proc = open_program(command, pid); if (proc == NULL) { fprintf(stderr, "couldn't open program '%s': %s\n", command, strerror(errno)); exit(EXIT_FAILURE); } trace_set_options(proc); continue_process(pid); } opt_p_tmp = opt_p; while (opt_p_tmp) { open_pid(opt_p_tmp->pid); opt_p_tmp = opt_p_tmp->next; } }
void ltrace_init(int argc, char **argv) { struct opt_p_t *opt_p_tmp; #ifdef HAVE_PYTHON Py_Initialize(); #endif atexit(normal_exit); signal(SIGINT, signal_exit); /* Detach processes when interrupted */ signal(SIGTERM, signal_exit); /* ... or killed */ argv = process_options(argc, argv); while (opt_F) { /* If filename begins with ~, expand it to the user's home */ /* directory. This does not correctly handle ~yoda, but that */ /* isn't as bad as it seems because the shell will normally */ /* be doing the expansion for us; only the hardcoded */ /* ~/.ltrace.conf should ever use this code. */ if (opt_F->filename[0] == '~') { char path[PATH_MAX]; char *home_dir = getenv("HOME"); if (home_dir) { strncpy(path, home_dir, PATH_MAX - 1); path[PATH_MAX - 1] = '\0'; strncat(path, opt_F->filename + 1, PATH_MAX - strlen(path) - 1); read_config_file(path); } } else { read_config_file(opt_F->filename); } opt_F = opt_F->next; } if (opt_e) { struct opt_e_t *tmp = opt_e; while (tmp) { debug(1, "Option -e: %s\n", tmp->name); tmp = tmp->next; } } if (command) { /* Check that the binary ABI is supported before * calling execute_program. */ struct ltelf lte = {}; open_elf(<e, command); open_program(command, execute_program(command, argv), 0); } opt_p_tmp = opt_p; while (opt_p_tmp) { open_pid(opt_p_tmp->pid); opt_p_tmp = opt_p_tmp->next; } }
void ltrace_init(int argc, char **argv) { setlocale(LC_ALL, ""); struct opt_p_t *opt_p_tmp; atexit(normal_exit); signal(SIGINT, signal_exit); /* Detach processes when interrupted */ signal(SIGTERM, signal_exit); /* ... or killed */ argv = process_options(argc, argv); init_global_config(); if (command) { /* Check that the binary ABI is supported before * calling execute_program. */ { struct ltelf lte; if (ltelf_init(<e, command) == 0) ltelf_destroy(<e); else exit(EXIT_FAILURE); } pid_t pid = execute_program(command, argv); struct process *proc = open_program(command, pid); if (proc == NULL) { fprintf(stderr, "couldn't open program '%s': %s\n", command, strerror(errno)); exit(EXIT_FAILURE); } trace_set_options(proc); continue_process(pid); } opt_p_tmp = opt_p; while (opt_p_tmp) { open_pid(opt_p_tmp->pid); opt_p_tmp = opt_p_tmp->next; } }
/* * Used to find, extract and dump state from * a running bootchartd process. */ int buffers_extract_and_dump (const char *output_path, Arguments *remote_args) { int i, pid, ret = 0; DumpState *state; assert (!chdir (output_path)); pid = bootchart_find_running_pid (remote_args); if (pid < 0) { log ("Failed to find the collector's pid\n"); return 1; } log ("Extracting profile data from pid %d\n", pid); /* the kernel for reasons of it's own really likes to return ESRCH - No such process from pread randomly, so retry a bit */ for (i = 0; i < 8; i++) { if (!(state = open_pid (pid))) return 1; if (find_chunks (state)) { ret = 1; log ("Couldn't find state structures on pid %d's stack%s\n", pid, i < 7 ? ", retrying" : " aborting"); close_pid (state, 1); } else { ret = 0; dump_buffers (state); close_wait_pid (state, 0); break; } } return ret; }