static int frame_callback (Dwfl_Frame *state, void *frame_arg) { Dwarf_Addr pc; bool isactivation; if (! dwfl_frame_pc (state, &pc, &isactivation)) { error (0, 0, "%s", dwfl_errmsg (-1)); return DWARF_CB_ABORT; } Dwarf_Addr pc_adjusted = pc - (isactivation ? 0 : 1); /* Get PC->SYMNAME. */ Dwfl_Thread *thread = dwfl_frame_thread (state); Dwfl *dwfl = dwfl_thread_dwfl (thread); Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted); const char *symname = NULL; if (mod) symname = dwfl_module_addrname (mod, pc_adjusted); printf ("%#" PRIx64 "\t%s\n", (uint64_t) pc, symname); if (symname && (strcmp (symname, "main") == 0 || strcmp (symname, ".main") == 0)) { kill (dwfl_pid (dwfl), SIGKILL); exit (0); } return DWARF_CB_OK; }
static pid_t next_thread(Dwfl *dwfl, void *arg, void **thread_argp) { /* there is only the current thread */ if (*thread_argp != NULL) return 0; *thread_argp = arg; return dwfl_pid(dwfl); }
static pid_t next_thread(Dwfl *dwfl, void *arg, void **thread_argp) { /* We want only single thread to be processed. */ if (*thread_argp != NULL) return 0; *thread_argp = arg; return dwfl_pid(dwfl); }