int tracing_loop(tracee_t* tracee, addr_t start) { int signal, ret, count = 0; addr_t addr; pverbose(1, "\nStarting tracing !\n\n"); if (!start) { if (proc_step(tracee->proc, 0) == -1) errexit("ftrace: proc_step, %s", ftrace_strerror(errno)); } tracee->status = STEP; while (1) { ret = proc_wait_debug_event(tracee->proc, &signal); if (ret == -1) errexit("ftrace: proc_wait_debug_event, %s", ftrace_strerror(errno)); switch (ret) { case DEBUG_EVENT: count++; if (tracer_quit) return (0); /* ** Treat event */ if (start) { addr = start; ret = proc_seek_calls(tracee->proc, &addr); if (ret == -1) errexit("ftrace: proc_seek_calls, %s", ftrace_strerror(errno)); print_call(tracee, ret, addr); start = 0; } addr = 0; ret = proc_seek_calls(tracee->proc, &addr); if (ret == -1) errexit("ftrace: proc_seek_calls, %s", ftrace_strerror(errno)); print_call(tracee, ret, addr); if (proc_step(tracee->proc, 0) == -1) errexit("ftrace: proc_step, %s", ftrace_strerror(errno)); break; case SIGNAL_EVENT: pverbose(1, "Program received signal %d, %s\n", signal, sys_siglist[signal]); proc_step(tracee->proc, signal); break; case EXIT_EVENT: pverbose(1, "\nProgram exited normally.\n"); return (0); case EXIT_SIGNALED_EVENT: pverbose(1, "\nProgram exited with signal %d, %s\n", signal, sys_siglist[signal]); return (0); default: errexit("ftrace: proc_wait_debug_event, Unknow Error !"); } } return (-1); }
//********************************************************************************************************************** vector<string> ClearcutCommand::setParameters(){ try { CommandParameter pphylip("phylip", "InputTypes", "", "", "FastaPhylip", "FastaPhylip", "none","tree",false,false,true); parameters.push_back(pphylip); CommandParameter pfasta("fasta", "InputTypes", "", "", "FastaPhylip", "FastaPhylip", "none","tree",false,false,true); parameters.push_back(pfasta); CommandParameter pverbose("verbose", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pverbose); CommandParameter pquiet("quiet", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pquiet); CommandParameter pversion("version", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pversion); CommandParameter pseed("seed", "String", "", "", "*", "", "","",false,false); parameters.push_back(pseed); CommandParameter pnorandom("norandom", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pnorandom); CommandParameter pshuffle("shuffle", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pshuffle); CommandParameter pneighbor("neighbor", "Boolean", "", "T", "", "", "","",false,false); parameters.push_back(pneighbor); CommandParameter pexpblen("expblen", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pexpblen); CommandParameter pexpdist("expdist", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pexpdist); CommandParameter pDNA("DNA", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pDNA); CommandParameter pprotein("protein", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pprotein); CommandParameter pjukes("jukes", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pjukes); CommandParameter pkimura("kimura", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pkimura); CommandParameter pstdout("stdout", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pstdout); CommandParameter pntrees("ntrees", "Number", "", "1", "", "", "","",false,false); parameters.push_back(pntrees); CommandParameter pmatrixout("matrixout", "String", "", "", "", "", "","",false,false); parameters.push_back(pmatrixout); CommandParameter pinputdir("inputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(pinputdir); CommandParameter poutputdir("outputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(poutputdir); vector<string> myArray; for (int i = 0; i < parameters.size(); i++) { myArray.push_back(parameters[i].name); } return myArray; } catch(exception& e) { m->errorOut(e, "ClearcutCommand", "setParameters"); exit(1); } }
static void print_backt(bin_handler_t* binh, addr_t addr) { bin_t* bin; int i; sym_t* sym; debug_t* debug; nbrtab++; for (i = 0; i < nbrtab; i++) pverbose(1, "\t"); pverbose(1, " 0x%x", addr); bin = bin_find(binh, addr); if (bin) { sym = sym_get_frm_addr(bin->syms, addr, APPROACHED); if (sym) { pverbose(2, " (%s)", sym->name); debug = debug_get_frm_addr(bin->debugs, sym->addr); if (debug) pverbose(2, " @ %s:%d", debug->file, debug->line); } else pverbose(2, " (??)"); } pverbose(1, "\n"); }
void core_trace(char* path, char* binpath) { core_obj_t* core = NULL; bin_handler_t* binh = NULL; backtrace_t* backtrace = NULL; backt_t* backt = NULL; core = core_new(path); if (core == NULL) errexit("ftrace: core_new:, %s", ftrace_strerror(errno)); /* ** Init binaries. */ if (binpath) binh = bin_create_handler(binpath); else binh = bin_create_handler(core_get_bin_path(core)); if (binh == NULL) errexit("ftrace: bin_create_handler, %s", ftrace_strerror(errno)); if (binh->tracee) bin_refresh_depends_list(core_get_depends_list(core, binh->tracee->obj), binh); backtrace = core_backtrace(core); if (backtrace == NULL) errexit("ftrace: core_backtrace, %s", ftrace_strerror(errno)); /* ** Start backtrace. */ pverbose(1, "\nStarting backtrace of %s\n\n", path); for (; backtrace; ) { backt = (backt_t*) backtrace->value; print_backt(binh, backt->addr); backtrace = list_del(backtrace, backt); free(backt); } pverbose(1, "\n"); }
int init_loop(tracee_t* tracee, addr_t* will_start) { int signal, ret, brk_set = 0; list_t* cur; brkp_t* brkp; /* ** Address where the tracing will start. */ *will_start = 0; /* ** Init binaries. */ tracee->binh = bin_create_handler(tracee->proc->path); if (tracee->binh == NULL) errexit("ftrace: bin_create_handler, %s", ftrace_strerror(errno)); bin_refresh_depends_list(proc_get_depends_list(tracee->proc), tracee->binh); /* ** Inject breakpoints. */ brkps_inject(tracee); /* ** Waiting for breakpoint ? */ for (cur = tracee->brkps; cur; cur = cur->next) { if (((brkp_t*) cur->value)->set) { brk_set = 1; break; } if (cur == tracee->brkps->prev) break; } /* ** No breakpoint setted, trace ! */ if (!brk_set && !tracee->brkps_toset) { /* ** Remove FTrace breakpoints */ for (cur = tracee->fbrkps; cur; cur = cur->next) { if (((brkp_t*) cur->value)->set) { if (proc_unset_breakpoint(tracee->proc, (brkp_t*) cur->value) == -1) errexit("ftrace: proc_unset_breakpoint, %s", ftrace_strerror(errno)); } if (cur == tracee->fbrkps->prev) break; } return (TRACEE_OK); } /* ** Else wait for breakpoint hit. */ tracee->status = RUN; if (proc_continue(tracee->proc, 0) == -1) errexit("ftrace: proc_continue, %s", ftrace_strerror(errno)); while (1) { ret = proc_wait_debug_event(tracee->proc, &signal); if (ret == -1) errexit("ftrace: proc_wait_debug_event, %s", ftrace_strerror(errno)); switch (ret) { case DEBUG_EVENT: if (tracer_quit) return (0); /* ** if ftrace breakpoint: */ brkp = proc_seek_brkps(tracee->proc, tracee->fbrkps); if (brkp && brkp->set) { /* ** Lookup if any shared objects has been load. ** If there is a new so, try de resolve unsolved user breakpoint. */ if (bin_refresh_depends_list(proc_get_depends_list(tracee->proc), tracee->binh)) brkps_try_resolved(tracee); /* ** Unset ftrace one shot breakpoint */ if (proc_unset_breakpoint(tracee->proc, brkp) == -1) errexit("ftrace: proc_unset_breakpoint, %s", ftrace_strerror(errno)); /* ** Step back after restore and continue to seek user breakpoint. */ if (proc_step_addr(tracee->proc, brkp->addr, 0) == -1) errexit("ftrace: proc_step_addr, %s", ftrace_strerror(errno)); break; } /* ** if user breakpoint: */ brkp = proc_seek_brkps(tracee->proc, tracee->brkps); if (brkp && brkp->set) { /* ** Breakpoint hit! ** Remove every breakpoints and start tracing ! */ /* ** Remove user breakpoints. */ for (cur = tracee->brkps; cur; cur = cur->next) { if (((brkp_t*) cur->value)->set) { if (proc_unset_breakpoint(tracee->proc, (brkp_t*) cur->value) == -1) errexit("ftrace: proc_unset_breakpoint, %s", ftrace_strerror(errno)); } if (cur == tracee->brkps->prev) break; } /* ** Remove ftrace breakpoints. */ for (cur = tracee->fbrkps; cur; cur = cur->next) { if (((brkp_t*) cur->value)->set) { if (proc_unset_breakpoint(tracee->proc, (brkp_t*) cur->value) == -1) errexit("ftrace: proc_unset_breakpoint, %s", ftrace_strerror(errno)); } if (cur == tracee->fbrkps->prev) break; } /* ** Step back after restore. */ if (proc_step_addr(tracee->proc, brkp->addr, 0) == -1) errexit("ftrace: proc_step_addr, %s", ftrace_strerror(errno)); *will_start = brkp->addr; return (TRACEE_OK); } if (proc_continue(tracee->proc, 0) == -1) errexit("ftrace: proc_continue, %s", ftrace_strerror(errno)); break; case SIGNAL_EVENT: pwarn("Program received signal %d, %s\n", signal, sys_siglist[signal]); if (proc_continue(tracee->proc, signal) == -1) errexit("ftrace: proc_continue, %s", ftrace_strerror(errno)); break; case EXIT_EVENT: pverbose(1, "\nProgram exited normally.\n"); return (TRACEE_EXIT); break; case EXIT_SIGNALED_EVENT: pverbose(1, "Program exited with signal %d, %s\n", signal, sys_siglist[signal]); return (TRACEE_EXIT); break; default: errexit("ftrace: proc_wait_debug_event, Unknow Error !"); } } return (-1); }
static void print_call(tracee_t* tracee, int ret, addr_t addr) { bin_t* bin; int i; arg_t* return_info; if (ret > 0) { if (ret == CALL || ret == EXTCALL || ret == PLTCALL) { nbrtab++; /* ** Try to get binary which contains the addr. ** Reload depends if not found and try again. */ bin = bin_find(tracee->binh, addr); if (!bin) { bin_refresh_depends_list(proc_get_depends_list(tracee->proc), tracee->binh); bin = bin_find(tracee->binh, addr); } for (i = 0; i < nbrtab; i++) pverbose(1, "\t|"); #ifdef __USE_LONG_ADDR_T__ pverbose(1, " 0x%lx", addr); #else pverbose(1, " 0x%x", addr); #endif /* __USE_LONG_ADDR_T__ */ print_binsym(tracee, bin, addr, ret); pverbose(1, "\n"); if (ret == EXTCALL) nbrtab--; } else if (ret == RET) { /* ** HAN ! */ if (nbrtab > 0) { /* ** Print ret return. */ if (return_debuginfo_list) { return_info = (arg_t*) return_debuginfo_list->value; if (return_info) { if (proc_seek_return_value(tracee->proc, return_info)) { for (i = 0; i < nbrtab; i++) pverbose(3, "\t|"); pverbose(3, " %s %s() = %s\n", return_info->type, return_info->name, return_info->value); } } return_debuginfo_list = list_del(return_debuginfo_list, return_info); } /* ** Print ret address */ for (i = 0; i < nbrtab; i++) pverbose(1, "\t|"); #ifdef __USE_LONG_ADDR_T__ pverbose(1, " ret @ 0x%lx", addr); #else pverbose(1, " ret @ 0x%x", addr); #endif /* __USE_LONG_ADDR_T__ */ pverbose(1, "\n"); nbrtab--; } } } }
static void print_binsym(tracee_t* tracee, bin_t* bin, addr_t addr, int type) { sym_t* sym; debug_t* debug; list_t* list = NULL; arg_t* arg; int i; if (bin) { sym = sym_get_frm_addr(bin->syms, addr, EXACT); if (sym) { pverbose(2, " (%s)", sym->name); if (type == EXTCALL) pverbose(2, " @ EXT"); else if (type == PLTCALL) pverbose(2, " @ PLT"); debug = debug_get_frm_addr(bin->debugs, sym->addr); if (debug) { pverbose(2, " @ %s:%d", debug->file, debug->line); if (proc_seek_args(tracee->proc, debug->args) != -1) { pverbose(3, "\n"); for (i = 0; i < nbrtab; i++) pverbose(3, "\t|"); if (debug->ret) pverbose(3, " %s %s(\n", debug->ret->type, debug->name); else pverbose(3, " ?? %s(\n", debug->name); for (list = debug->args->prev; list; list = list->prev) { for (i = 0; i < nbrtab; i++) pverbose(3, "\t|"); arg = (arg_t*) list->value; pverbose(3, "\t%s\t%s = %s;\n", arg->type, arg->name, arg->value); if (list == debug->args) break; } for (i = 0; i < nbrtab; i++) pverbose(3, "\t|"); pverbose(3, " );"); } return_debuginfo_list = list_add(return_debuginfo_list, (void*) debug->ret); } return; } } pverbose(2, " (??)"); if (type == EXTCALL) pverbose(2, " @ EXT"); else if (type == PLTCALL) pverbose(2, " @ PLT"); return_debuginfo_list = list_add(return_debuginfo_list, NULL); }