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"); }
struct bin *bin_add(const char *name, struct bin_head *head) { struct bin *b; int name_len; b = bin_find(name, head); if(b) return b; b = malloc(sizeof *b); if(!b) { perror("malloc"); return NULL; } name_len = strlen(name); b->name = malloc(name_len + 1); if (!b->name) { perror("malloc"); free(b); return NULL; } memcpy(b->name, name, name_len); b->name[name_len] = 0; TAILQ_INIT(&b->entries); LIST_INSERT_HEAD(head, b, list); return b; }
int main() { int arr[10] = {3,2,1,5,8,9,0,22,80,60}; bubble_sort(arr,N); printf("%d\n",bin_find(arr, N, -2)); return 0; }
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--; } } } }