25 #include <sys/ptrace.h>
93 #define __TARGET_OVERLAY 0x200000
96 {
"overlay",
__TARGET_OVERLAY,
"[<target_id>:]<thread_name_or_id>:<spec_opts>",0,
"Lookup name or id as an overlay target once the main target is instantiated, and try to open it. All dumptarget options then apply to the overlay.",0 },
97 {
"at-symbol",
'A',
"SYMBOL",0,
"Wait for a probe on this symbol/address to be hit before inserting all the other probes.",0 },
98 {
"until-symbol",
'U',
"SYMBOL",0,
"Remove all probes once a probe on this symbol/address is hit.",0 },
99 {
"bts",
'B',0,0,
"Enable BTS (if XenTT) (starting at at-symbol if one was provided; otherwise, enable immediately).",0 },
100 {
"stop-at-until",
'S',0,0,
"Stop probing once the until symbol/address is reached.",0 },
101 {
"raw",
'v',0,0,
"Enable raw mode.",0 },
102 {
"post",
'P',0,0,
"Enable post handlers.",0 },
103 {
"quiet",
'q',0,0,
"Silent but deadly.",0 },
121 g_hash_table_iter_init(&iter,
probes);
122 while (g_hash_table_iter_next(&iter,
127 g_hash_table_iter_remove(&iter);
129 g_hash_table_destroy(
probes);
135 static int cleaning = 0;
145 for (j =
ots_len - 1; j >= 0; --j) {
161 array_list_deep_free(shadow_stack);
183 "Ending trace (%d) (hits on probes not from root set: %d).\n",
186 fprintf(stderr,
"Ended trace.\n");
192 #ifdef ENABLE_DISTORM
194 struct probe *trigger,
struct probe *base);
196 struct probe *trigger,
struct probe *base);
204 &funcstart,NULL,NULL,NULL,NULL)) {
206 "Could not resolve base addr for function %s!\n",
214 if (!g_hash_table_lookup(
disfuncs,(gpointer)funcstart)) {
220 char *buf =
malloc(bufsiz);
223 NULL,retaddr_save,NULL,0,1);
226 struct probe *rprobe;
265 g_hash_table_insert(
probes,(gpointer)cprobe,(gpointer)cprobe);
267 "Registered %d call probes in function %s.\n",
278 g_hash_table_insert(
probes,(gpointer)rprobe,(gpointer)rprobe);
280 "Registered %d return probes in function %s.\n",
285 g_hash_table_insert(
disfuncs,(gpointer)funcstart,(gpointer)1);
292 struct probe *trigger,
struct probe *base) {
305 fprintf(stderr,
"Could not read SP in retaddr_save!\n");
310 retaddr =
malloc(
sizeof(*retaddr));
312 (
unsigned char *)retaddr)) {
313 fprintf(stderr,
"Could not read top of stack in retaddr_save!\n");
320 fprintf(stderr,
"Could not read IP in retaddr_save!\n");
330 "(SAVE) call 0x%"PRIxADDR" (<UNKNOWN>)"
331 " (from within %s): retaddr = 0x%"PRIxADDR
332 " (skipping unknown function!)"
333 " (handler_data = %s) (stack depth = %d) (thread = %s)\n",
335 (
char *)handler_data,array_list_len(shadow_stack),buf);
342 "(SAVE) call 0x%"PRIxADDR
" (%s)"
343 " (from within %s): retaddr = 0x%"PRIxADDR
344 " (handler_data = %s) (stack depth = %d) (thread = %s)\n",
347 *retaddr,(
char *)handler_data,array_list_len(shadow_stack),buf);
359 array_list_add(shadow_stack,retaddr);
361 instrument_func(bsymbol,0);
367 result_t retaddr_check(
struct probe *probe,
tid_t tid,
void *handler_data,
368 struct probe *trigger,
struct probe *base) {
371 ADDR *oldretaddr = NULL;
380 if (array_list_len(shadow_stack) == 0) {
388 fprintf(stderr,
"Could not read SP in retaddr_check!\n");
392 oldretaddr = (
ADDR *)array_list_remove(shadow_stack);
395 (
unsigned char *)&newretaddr)) {
396 fprintf(stderr,
"Could not read top of stack in retaddr_check!\n");
401 if (newretaddr != *oldretaddr) {
404 "(CHECK) %s (0x%"PRIxADDR
"): newretaddr = 0x%"PRIxADDR
";"
405 " oldretaddr = 0x%"PRIxADDR
406 " (handler_data = %s) (stack depth = %d) (thread = %s)"
407 " ---- STACK CORRUPTION!\n",
409 newretaddr,*oldretaddr,
410 (
char *)handler_data,array_list_len(shadow_stack),buf);
415 "(CHECK) %s (0x%"PRIxADDR
"): newretaddr = 0x%"PRIxADDR
";"
416 " oldretaddr = 0x%"PRIxADDR
417 " (handler_data = %s) (stack depth = %d) (thread = %s)\n",
419 newretaddr,*oldretaddr,
420 (
char *)handler_data,array_list_len(shadow_stack),buf);
425 (
unsigned char *)oldretaddr)) {
426 fprintf(stderr,
"Could not reset top of stack in retaddr_check!\n");
431 fprintf(stdout,
"Reset stack after corruption!\n");
444 struct probe *trigger,
struct probe *base) {
456 "%s (0x%"PRIxADDR
") (thread %"PRIiTID") (at_symbol hit)\n",
466 struct probe *trigger,
struct probe *base) {
478 "%s (0x%"PRIxADDR
") (thread %"PRIiTID") (until_symbol hit)\n",
488 struct probe *trigger,
struct probe *base) {
509 fprintf(stdout,
"%s (0x%"PRIxADDR
") (thread %"PRIiTID") ",
538 for (j = 0; j < value->
bufsiz; ++j) {
539 printf(
"%02hhx",value->
buf[j]);
554 fprintf(stdout,
" (handler_data = %s)\n",(
char *)handler_data);
568 struct probe *trigger,
struct probe *base) {
580 fprintf(stdout,
"%s (0x%"PRIxADDR
") post handler (thread %"PRIiTID")",
583 fprintf(stdout,
" (handler_data = %s)\n",(
char *)handler_data);
593 struct probe *trigger,
struct probe *base) {
597 fprintf(stdout,
"%s (0x%"PRIxADDR
") (pre)\n",
607 struct probe *trigger,
struct probe *base) {
611 fprintf(stdout,
"%s (0x%"PRIxADDR
") (post)\n",
621 struct probe *trigger,
struct probe *base) {
629 fprintf(stdout,
"%s (0x%"PRIxADDR
") (pre): watched raw value: 0x%x\n",
639 struct probe *trigger,
struct probe *base) {
647 fprintf(stdout,
"%s (0x%"PRIxADDR
") (post): watched raw value: 0x%x\n",
657 struct probe *trigger,
struct probe *base) {
660 struct bsymbol *bsymbol = probe->
bsymbol;
673 fprintf(stdout,
"%s (0x%"PRIxADDR
") (pre) = ",
679 for (j = 0; j < value->
bufsiz; ++j) {
680 printf(
"%02hhx",value->
buf[j]);
686 fprintf(stdout,
"%s (0x%"PRIxADDR
") (pre): could not read value: %s",
689 fprintf(stdout,
" (handler_data = %s)\n",(
char *)handler_data);
700 struct probe *trigger,
struct probe *base) {
703 struct bsymbol *bsymbol = probe->
bsymbol;
716 fprintf(stdout,
"%s (0x%"PRIxADDR
") (post) = ",
721 for (j = 0; j < value->
bufsiz; ++j) {
722 printf(
"%02hhx",value->
buf[j]);
728 fprintf(stdout,
"%s (0x%"PRIxADDR
") (post): could not read value: %s",
731 fprintf(stdout,
" (handler_data = %s)\n",(
char *)handler_data);
747 ADDR func_phys_base = 0;
754 &func_phys_base,NULL,NULL,NULL,NULL);
755 fprintf(stdout,
"Single step %d (thread %"PRIiTID") (msg %d) 0x%"PRIxADDR
" (%s:+%d)!\n",
757 (
int)(ipval - func_phys_base));
762 fprintf(stdout,
"Single step %d (thread %"PRIiTID") (msg %d) 0x%"PRIxADDR
"!\n",
763 msg_detail,tid,msg,ipval);
775 char *argptr,*argptr2;
788 return ARGP_ERR_UNKNOWN;
791 if (state->quoted > 0)
792 opts->
argc = state->quoted - state->next;
794 opts->
argc = state->argc - state->next;
795 if (opts->
argc > 0) {
797 memcpy(opts->
argv,&state->argv[state->next],opts->
argc*
sizeof(
char *));
798 state->next += opts->
argc;
805 case ARGP_KEY_NO_ARGS:
806 case ARGP_KEY_SUCCESS:
840 argptr = index(arg,
':');
842 verror(
"bad overlay spec!\n");
846 ospec =
calloc(1,
sizeof(*ospec));
852 argv_list = array_list_create(32);
853 array_list_append(argv_list,
"dumptarget_overlay");
859 argptr2 = index(argptr,
':');
867 while (*argptr ==
' ')
875 while (*argptr !=
'\0') {
876 if (*argptr ==
'\\') {
895 else if (inquote && *argptr == quotechar) {
902 else if (*argptr ==
'\'' || *argptr ==
'"') {
908 else if (!inquote && *argptr ==
' ') {
909 *nargptr = *argptr =
'\0';
911 array_list_append(argv_list,vargptr);
932 array_list_append(argv_list,vargptr);
935 array_list_append(argv_list,NULL);
938 array_list_len(argv_list) - 1,
939 (
char **)argv_list->
list,
943 array_list_free(argv_list);
947 array_list_free(argv_list);
951 return ARGP_ERR_UNKNOWN;
957 int main(
int argc,
char **argv) {
991 verror(
"could not parse target arguments!\n");
997 signal(SIGQUIT,
sigh);
998 signal(SIGABRT,
sigh);
999 signal(SIGKILL,
sigh);
1000 signal(SIGSEGV,
sigh);
1001 signal(SIGPIPE,
sigh);
1002 signal(SIGALRM,
sigh);
1003 signal(SIGTERM,
sigh);
1004 signal(SIGUSR1,
sigh);
1005 signal(SIGUSR2,
sigh);
1012 verror(
"could not instantiate target!\n");
1017 fprintf(stderr,
"could not open target!\n");
1027 targetstr = strdup(
"<UNNAMED_TARGET>");
1029 targetstr = strdup(tmp);
1062 verror(
"could not find overlay thread '%s' in base target '%s',"
1072 verror(
"could not instantiate overlay on base '%s' thread '%s'!\n",
1079 fprintf(stderr,
"could not open overlay on base '%s' thread '%s'!\n",
1096 symbols = (
struct bsymbol **)
malloc(
sizeof(
struct bsymbol *)*
opts.
argc);
1097 memset(symbols,0,
sizeof(
struct bsymbol *)*
opts.
argc);
1099 shadow_stack = array_list_create(64);
1101 probes = g_hash_table_new(g_direct_hash,g_direct_equal);
1102 disfuncs = g_hash_table_new(g_direct_hash,g_direct_equal);
1112 addrs[
i] = strtoll(
opts.
argv[i],NULL,16);
1116 struct array_list *addrlist = array_list_create(0);
1117 struct array_list *symlist = array_list_create(0);
1118 struct bsymbol *bsymbol = NULL;
1122 memset(retcodes,0,
sizeof(
int)*
opts.
argc);
1123 memset(retcode_strs,0,
sizeof(
char *)*
opts.
argc);
1127 char *srcfile = NULL;
1128 char *symname = NULL;
1132 char *retcode_str = index(
opts.
argv[i],
':');
1135 if (*(retcode_str+1) ==
'L') {
1137 *retcode_str =
'\0';
1139 line = retcodes[
i] = atoi(retcode_str + 1);
1140 retcode_strs[
i] = retcode_str;
1142 else if (*(retcode_str+1) ==
's') {
1143 *retcode_str =
'\0';
1145 retcodes[
i] = atoi(retcode_str + 1);
1146 retcode_strs[
i] = retcode_str;
1148 else if (*(retcode_str+1) ==
'r') {
1149 *retcode_str =
'\0';
1151 retcode_strs[
i] = retcode_str;
1152 retcodes[
i] = (
REGVAL)atoi(retcode_str);
1154 else if (*(retcode_str+1) ==
'o') {
1155 *retcode_str =
'\0';
1157 retcode_strs[
i] = retcode_str;
1159 retcodes[
i] = atoi(retcode_str);
1164 *retcode_str =
'\0';
1166 symname = retcode_str;
1172 if (strncmp(symname,
"0x",2) == 0) {
1173 array_list_add(addrlist,
opts.
argv[i]);
1174 array_list_add(symlist,NULL);
1181 fprintf(stderr,
"Could not find symbol %s!\n",
opts.
argv[i]);
1188 for (j =
ots_len - 1; (j + 1) > 0; --j) {
1200 fprintf(stderr,
"Could not find symbol %s!\n",
1208 array_list_add(symlist,bsymbol);
1209 array_list_add(addrlist,NULL);
1218 fprintf(stderr,
"Could not convert %s to address!\n",
at_symbol);
1237 fprintf(stderr,
"Could not find symbol %s!\n",
opts.
argv[i]);
1244 fprintf(stderr,
"pause at symbol %s is not a function!\n",
1264 fprintf(stdout,
"Starting looking for at_symbol %s!\n",
1280 printf(
"%s finished (did not find pause point!\n",
1285 printf(
"%s monitoring failed (did not find pause"
1286 " point)!\n",targetstr);
1290 printf(
"%s monitoring failed with %d (did not find"
1291 " pause point)!\n",targetstr,tstat);
1299 printf(
"%s monitoring found at_symbol %s; removing "
1300 " pause probe and doing the real thing.\n",
1310 #if defined(ENABLE_XEN) && defined(CONFIG_DETERMINISTIC_TIMETRAVEL)
1312 printf(
"Enabling BTS!\n");
1315 verror(
"failed to enable BTS!\n");
1326 fprintf(stderr,
"Could not convert %s to address!\n",
until_symbol);
1345 fprintf(stderr,
"Could not find until_symbol %s!\n",
opts.
argv[i]);
1352 fprintf(stderr,
"util_symbol %s is not a function!\n",
1370 until_probe = probe;
1372 fprintf(stdout,
"Starting looking for until_symbol %s!\n",
1378 for (i = 0; i < array_list_len(symlist); ++
i) {
1379 bsymbol = (
struct bsymbol *)array_list_item(symlist,i);
1401 if (i <
opts.
argc && retcode_strs[i]
1402 && *retcode_strs[i] ==
'w') {
1411 && ((i <
opts.
argc && retcode_strs[i]
1412 && (*retcode_strs[i] ==
'c'
1413 || *retcode_strs[i] ==
'C')))) {
1414 #ifndef ENABLE_DISTORM
1416 "Could not instrument function %s;"
1417 " DISTORM not configured in!\n",
1422 if ((funcstart = instrument_func(bsymbol,1)) == 0) {
1424 "Could not instrument function %s (0x%"PRIxADDR
")!\n",
1432 && ((i <
opts.
argc && retcode_strs[i]
1433 && (*retcode_strs[i] ==
'e'
1434 || *retcode_strs[i] ==
'E')))) {
1435 #ifndef ENABLE_DISTORM
1437 "Could not instrument function %s entry/returns;"
1438 " DISTORM not configured in!\n",
1448 if (!probe_register_function_ee(probe,
PROBEPOINT_SW,bsymbol,0,1,1)) {
1450 "Could not instrument function %s entry/returns!\n",
1455 g_hash_table_insert(
probes,(gpointer)probe,(gpointer)probe);
1465 if (i <
opts.
argc && retcode_strs[i] && *retcode_strs[i] ==
'L') {
1489 g_hash_table_insert(
probes,(gpointer)probe,(gpointer)probe);
1493 "Registered probe %s at 0x%"PRIxADDR
".\n",
1500 if (i <
opts.
argc && retcode_strs[i]
1501 && *retcode_strs[i] ==
's') {
1504 fprintf(stderr,
"could not create action!\n");
1509 fprintf(stderr,
"could not schedule action!\n");
1516 else if (i <
opts.
argc && retcode_strs[i]) {
1519 fprintf(stderr,
"could not create action!\n");
1524 fprintf(stderr,
"could not schedule action!\n");
1535 "Failed to register probe on '%s'\n",
1553 array_list_free(symlist);
1554 array_list_free(addrlist);
1562 for (i = 0; i < array_list_len(addrlist); ++
i) {
1563 char *rawaddr = (
char *)array_list_item(addrlist,i);
1569 char *endptr = NULL;
1570 ADDR paddr = (
ADDR)strtoull(rawaddr,&endptr,16);
1573 fprintf(stderr,
"Bad address %s!\n",rawaddr);
1586 if (i <
opts.
argc && retcode_strs[i] && *retcode_strs[i] ==
'w') {
1594 else if (i <
opts.
argc && retcode_strs[i] && *retcode_strs[i] ==
'r') {
1602 else if (i <
opts.
argc && retcode_strs[i] && *retcode_strs[i] ==
'o') {
1605 verror(
"No target with ID %d for addr 0x%"PRIxADDR
";"
1606 " aborting!\n",retcodes[i],paddr);
1636 g_hash_table_insert(
probes,(gpointer)probe,(gpointer)probe);
1639 "Registered probe %s at 0x%"PRIxADDR
".\n",rawaddr,paddr);
1650 array_list_free(symlist);
1651 array_list_free(addrlist);
1658 array_list_free(symlist);
1659 array_list_free(addrlist);
1669 fprintf(stdout,
"Starting main debugging loop!\n");
1672 struct timeval poll_tv = { 0,0 };
1679 poll_tv.tv_usec = 10000;
1690 printf(
"%s monitoring found at_symbol %s; removing"
1703 #if defined(ENABLE_XEN) && defined(CONFIG_DETERMINISTIC_TIMETRAVEL)
1705 printf(
"Disabling BTS at until probe.\n");
1708 verror(
"failed to disable BTS!\n");
1712 printf(
"Stopping monitoring at until probe.\n");
1718 else if (until_probe)
1737 (
unsigned char *)word) != NULL) {
1738 printf(
"0x%" PRIxADDR
" = ",addrs[i]);
1740 printf(
"%02hhx",word[j]);
1745 printf(
"0x%" PRIxADDR
": could not read value: %s\n",
1746 addrs[i],strerror(errno));
1751 fprintf(stderr,
"could not resume target %s thread %"PRIiTID"\n",
1760 printf(
"%s exiting, removing probes safely...\n",targetstr);
1764 fprintf(stderr,
"could not resume target %s thread %"PRIiTID"\n",
1778 printf(
"%s finished.\n",targetstr);
1783 printf(
"%s monitoring failed!\n",targetstr);
1788 printf(
"%s monitoring failed with %d!\n",targetstr,tstat);
struct bsymbol * bsymbol_create(struct lsymbol *lsymbol, struct memregion *region)
struct target * target_instantiate_overlay(struct target *target, tid_t tid, struct target_spec *spec)
int target_thread_snprintf(struct target *target, tid_t tid, char *buf, int bufsiz, int detail, char *sep, char *kvsep)
struct value * target_load_symbol(struct target *target, struct target_location_ctxt *tlctxt, struct bsymbol *bsymbol, load_flags_t flags)
tid_t target_lookup_overlay_thread_by_name(struct target *target, char *name)
struct action * action_return(REGVAL retval)
int probe_unregister(struct probe *probe, int force)
struct bsymbol * target_lookup_sym_line(struct target *target, char *filename, int line, SMOFFSET *offset, ADDR *addr)
struct bsymbol * until_bsymbol
void * target_argp_driver_state(struct argp_state *state)
REFCNT lsymbol_release(struct lsymbol *lsymbol)
void value_dump_simple(struct value *value, struct dump_info *ud)
tid_t target_lookup_overlay_thread_by_id(struct target *target, int id)
struct target_spec * tspec
struct lsymbol * lsymbol_create_from_symbol(struct symbol *symbol)
int target_lsymbol_resolve_bounds(struct target *target, struct target_location_ctxt *tlctxt, struct lsymbol *lsymbol, ADDR base_addr, ADDR *start, ADDR *end, int *is_noncontiguous, ADDR *alt_start, ADDR *alt_end)
static uint64_t unsigned int i
struct bsymbol * target_lookup_sym(struct target *target, const char *name, const char *delim, char *srcfile, symbol_type_flag_t ftype)
result_t ss_handler(struct action *action, struct target_thread *thread, struct probe *probe, struct probepoint *probepoint, handler_msg_t msg, int msg_detail, void *handler_data)
REFCNT action_release(struct action *action)
struct array_list * shadow_stack
#define v_g_slist_foreach(gslhead, gslcur, elm)
int target_resume(struct target *target)
struct target_location_ctxt * target_location_ctxt_create_from_bsymbol(struct target *target, tid_t tid, struct bsymbol *bsymbol)
int target_disable_feature(struct target *target, int feature)
result_t function_dump_args(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
int target_pause(struct target *target)
result_t var_post(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
tid_t target_gettid(struct target *target)
result_t addr_var_pre(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
char * bsymbol_get_name(struct bsymbol *bsymbol)
int target_close(struct target *target)
#define verror(format,...)
error_t dt_argp_parse_opt(int key, char *arg, struct argp_state *state)
unsigned char * target_read_addr(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
struct probe * probe_register_addr(struct probe *probe, ADDR addr, probepoint_type_t type, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize, struct bsymbol *bsymbol)
result_t(* probe_handler_t)(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
int symbol_is_inlined(struct symbol *symbol)
int target_snprintf(struct target *target, char *buf, int bufsiz)
REGVAL target_read_reg(struct target *target, tid_t tid, REG reg)
ADDR probe_addr(struct probe *probe)
char * lsymbol_get_name(struct lsymbol *lsymbol)
struct overlay_spec ** ospecs
REFCNT bsymbol_release(struct bsymbol *bsymbol)
REFCNT bsymbol_free(struct bsymbol *bsymbol, int force)
int probe_free(struct probe *probe, int force)
struct dt_argp_state opts
void target_free_spec(struct target_spec *spec)
int symbol_type_flags_match(struct symbol *symbol, symbol_type_flag_t flags)
char * target_name(struct target *target)
struct action * action_singlestep(int nsteps)
struct argp_option dt_argp_opts[]
void value_free(struct value *value)
struct bsymbol * target_lookup_sym_addr(struct target *target, ADDR addr)
int probe_num_sources(struct probe *probe)
int target_enable_feature(struct target *target, int feature, void *arg)
struct probe * probe_create(struct target *target, tid_t tid, struct probe_ops *pops, const char *name, probe_handler_t pre_handler, probe_handler_t post_handler, void *handler_data, int autofree, int tracked)
void * realloc(void *ptr, size_t size)
struct probe * probe_register_inlined_symbol(struct probe *probe, struct bsymbol *bsymbol, int do_primary, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize)
result_t var_pre(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
void * calloc(size_t nmemb, size_t size)
result_t addr_var_post(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
int main(int argc, char **argv)
struct target * target_lookup_target_id(int id)
result_t function_post(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
#define REF_DEBUG_REPORT_FINISH()
int target_finalize(struct target *target)
struct symbol * bsymbol_get_symbol(struct bsymbol *bsymbol)
char * base_thread_name_or_id
target_status_t target_poll(struct target *target, struct timeval *tv, target_poll_outcome_t *outcome, int *pstatus)
GSList * symbol_get_members(struct symbol *symbol, symbol_type_flag_t flags)
int target_open(struct target *target)
target_status_t target_monitor(struct target *target)
void target_location_ctxt_free(struct target_location_ctxt *tlctxt)
struct target_spec * spec
int linux_userproc_at_syscall(struct target *target, tid_t tid)
struct target_spec * target_argp_driver_parse_one(struct argp *driver_parser, void *driver_state, int argc, char **argv, target_type_t target_types, int filter_quoted)
struct target * target_instantiate(struct target_spec *spec, struct evloop *evloop)
struct probe * probe_register_line(struct probe *probe, char *filename, int line, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize)
struct bsymbol * at_bsymbol
void * malloc(size_t size)
struct target_thread * thread
target_type_t target_type(struct target *target)
unsigned long target_write_addr(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
result_t until_handler(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
char * probe_name(struct probe *probe)
struct probe * probe_register_symbol(struct probe *probe, struct bsymbol *bsymbol, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize)
struct probe * until_probe
struct target_spec * spec
result_t addr_code_pre(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
result_t at_handler(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
int action_sched(struct probe *probe, struct action *action, action_whence_t whence, action_handler_t handler, void *handler_data)
struct memregion * region
void target_driver_argp_init_children(struct argp_state *state)
struct bsymbol ** symbols
struct probepoint * probepoint
void bsymbol_dump(struct bsymbol *bsymbol, struct dump_info *ud)
result_t addr_code_post(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)