33 #define DEFAULT_TRACE_BUFFER_SIZE 5242880 62 #ifdef IN_PROCESS_AGENT 67 trace_vdebug (const
char *fmt, ...)
73 vsprintf (buf, fmt, ap);
74 fprintf (stderr,
PROG "/tracepoint: %s\n", buf);
78 #define trace_debug_1(level, fmt, args...) \ 80 if (level <= debug_threads) \ 81 trace_vdebug ((fmt), ##args); \ 86 #define trace_debug_1(level, fmt, args...) \ 88 if (level <= debug_threads) \ 90 debug_printf ((fmt), ##args); \ 91 debug_printf ("\n"); \ 97 #define trace_debug(FMT, args...) \ 98 trace_debug_1 (1, FMT, ##args) 103 #ifdef IN_PROCESS_AGENT 104 # define gdb_tp_heap_buffer IPA_SYM_EXPORTED_NAME (gdb_tp_heap_buffer) 105 # define gdb_jump_pad_buffer IPA_SYM_EXPORTED_NAME (gdb_jump_pad_buffer) 106 # define gdb_jump_pad_buffer_end IPA_SYM_EXPORTED_NAME (gdb_jump_pad_buffer_end) 107 # define gdb_trampoline_buffer IPA_SYM_EXPORTED_NAME (gdb_trampoline_buffer) 108 # define gdb_trampoline_buffer_end IPA_SYM_EXPORTED_NAME (gdb_trampoline_buffer_end) 109 # define gdb_trampoline_buffer_error IPA_SYM_EXPORTED_NAME (gdb_trampoline_buffer_error) 110 # define collecting IPA_SYM_EXPORTED_NAME (collecting) 111 # define gdb_collect_ptr IPA_SYM_EXPORTED_NAME (gdb_collect_ptr) 112 # define stop_tracing IPA_SYM_EXPORTED_NAME (stop_tracing) 113 # define flush_trace_buffer IPA_SYM_EXPORTED_NAME (flush_trace_buffer) 114 # define about_to_request_buffer_space IPA_SYM_EXPORTED_NAME (about_to_request_buffer_space) 115 # define trace_buffer_is_full IPA_SYM_EXPORTED_NAME (trace_buffer_is_full) 116 # define stopping_tracepoint IPA_SYM_EXPORTED_NAME (stopping_tracepoint) 117 # define expr_eval_result IPA_SYM_EXPORTED_NAME (expr_eval_result) 118 # define error_tracepoint IPA_SYM_EXPORTED_NAME (error_tracepoint) 119 # define tracepoints IPA_SYM_EXPORTED_NAME (tracepoints) 120 # define tracing IPA_SYM_EXPORTED_NAME (tracing) 121 # define trace_buffer_ctrl IPA_SYM_EXPORTED_NAME (trace_buffer_ctrl) 122 # define trace_buffer_ctrl_curr IPA_SYM_EXPORTED_NAME (trace_buffer_ctrl_curr) 123 # define trace_buffer_lo IPA_SYM_EXPORTED_NAME (trace_buffer_lo) 124 # define trace_buffer_hi IPA_SYM_EXPORTED_NAME (trace_buffer_hi) 125 # define traceframe_read_count IPA_SYM_EXPORTED_NAME (traceframe_read_count) 126 # define traceframe_write_count IPA_SYM_EXPORTED_NAME (traceframe_write_count) 127 # define traceframes_created IPA_SYM_EXPORTED_NAME (traceframes_created) 128 # define trace_state_variables IPA_SYM_EXPORTED_NAME (trace_state_variables) 129 # define get_raw_reg_ptr IPA_SYM_EXPORTED_NAME (get_raw_reg_ptr) 130 # define get_trace_state_variable_value_ptr \ 131 IPA_SYM_EXPORTED_NAME (get_trace_state_variable_value_ptr) 132 # define set_trace_state_variable_value_ptr \ 133 IPA_SYM_EXPORTED_NAME (set_trace_state_variable_value_ptr) 134 # define ust_loaded IPA_SYM_EXPORTED_NAME (ust_loaded) 135 # define helper_thread_id IPA_SYM_EXPORTED_NAME (helper_thread_id) 136 # define cmd_buf IPA_SYM_EXPORTED_NAME (cmd_buf) 137 # define ipa_tdesc_idx IPA_SYM_EXPORTED_NAME (ipa_tdesc_idx) 140 #ifndef IN_PROCESS_AGENT 185 IPA_SYM(gdb_jump_pad_buffer_end),
186 IPA_SYM(gdb_trampoline_buffer),
187 IPA_SYM(gdb_trampoline_buffer_end),
188 IPA_SYM(gdb_trampoline_buffer_error),
193 IPA_SYM(about_to_request_buffer_space),
201 IPA_SYM(trace_buffer_ctrl_curr),
209 IPA_SYM(get_trace_state_variable_value_ptr),
210 IPA_SYM(set_trace_state_variable_value_ptr),
230 warning (
"In-process agent not loaded");
240 warning (
"Error reading ust_loaded in lib");
254 "E.In-process agent library not loaded in process. " 255 "Fast and static tracepoints unavailable.");
266 "E.UST library not loaded in process. " 267 "Static tracepoints unavailable.");
269 sprintf (
buffer,
"E.GDBserver was built without static tracepoints support");
352 #ifdef IN_PROCESS_AGENT 356 memcpy (myaddr, (
void *) (uintptr_t) memaddr, len);
365 #if defined(__GNUC__) 366 # define UNKNOWN_SIDE_EFFECTS() asm ("") 368 # define UNKNOWN_SIDE_EFFECTS() do {} while (0) 375 UNKNOWN_SIDE_EFFECTS();
379 flush_trace_buffer (
void)
382 UNKNOWN_SIDE_EFFECTS();
387 #ifndef IN_PROCESS_AGENT 391 trace_debug (
"tracepoint_handler: tracepoint at 0x%s hit",
429 void *pval = (
void *) (uintptr_t) val;
433 *val = (uintptr_t) pval;
440 void *pval = (
void *) (uintptr_t) val;
442 (
unsigned char *) &pval,
sizeof (pval));
465 #define COPY_FIELD_TO_BUF(BUF, OBJ, FIELD) \ 467 memcpy (BUF, &(OBJ)->FIELD, sizeof ((OBJ)->FIELD)); \ 468 BUF += sizeof ((OBJ)->FIELD); \ 512 #ifndef IN_PROCESS_AGENT 586 memcpy (p, &aexpr->
length, 4);
624 switch (action->
type)
635 error (
"Unknown trace action '%c'.", action->
type);
641 switch (action->
type)
652 error (
"Unknown trace action '%c'.", action->
type);
750 #ifndef IN_PROCESS_AGENT 801 #ifndef IN_PROCESS_AGENT 851 #ifndef IN_PROCESS_AGENT 860 "terror:in the attic",
861 "terror:empty expression",
862 "terror:empty stack",
863 "terror:stack overflow",
864 "terror:stack underflow",
865 "terror:unhandled opcode",
866 "terror:unrecognized opcode",
867 "terror:divide by zero" 906 #ifdef IN_PROCESS_AGENT 940 # if defined(__GNUC__) 941 # define ATTR_PACKED __attribute__ ((packed)) 974 #define TRACEFRAME_EOB_MARKER_SIZE offsetof (struct traceframe, data) 985 #ifndef IN_PROCESS_AGENT 1145 #define GDBSERVER_FLUSH_COUNT_MASK 0xfffffff0 1150 #define GDBSERVER_FLUSH_COUNT_MASK_PREV 0x7ff00000 1151 #define GDBSERVER_FLUSH_COUNT_MASK_CURR 0x0007ff00 1155 #define GDBSERVER_UPDATED_FLUSH_COUNT_BIT 0x80000000 1157 #ifdef IN_PROCESS_AGENT 1161 # define TRACE_BUFFER_CTRL_CURR \ 1162 (trace_buffer_ctrl_curr & ~GDBSERVER_FLUSH_COUNT_MASK) 1171 # define TRACE_BUFFER_CTRL_CURR 0 1176 #define trace_buffer_start (trace_buffer_ctrl[TRACE_BUFFER_CTRL_CURR].start) 1177 #define trace_buffer_free (trace_buffer_ctrl[TRACE_BUFFER_CTRL_CURR].free) 1178 #define trace_buffer_end_free \ 1179 (trace_buffer_ctrl[TRACE_BUFFER_CTRL_CURR].end_free) 1180 #define trace_buffer_wrap (trace_buffer_ctrl[TRACE_BUFFER_CTRL_CURR].wrap) 1185 #define FIRST_TRACEFRAME() ((struct traceframe *) trace_buffer_start) 1191 #define NEXT_TRACEFRAME_1(TF) \ 1192 (((unsigned char *) (TF)) + sizeof (struct traceframe) + (TF)->data_size) 1194 #define NEXT_TRACEFRAME(TF) \ 1195 ((struct traceframe *) (NEXT_TRACEFRAME_1 (TF) \ 1196 - ((NEXT_TRACEFRAME_1 (TF) >= trace_buffer_wrap) \ 1197 ? (trace_buffer_wrap - trace_buffer_lo) \ 1209 #define traceframe_count \ 1210 ((unsigned int) (traceframe_write_count - traceframe_read_count)) 1217 #ifndef IN_PROCESS_AGENT 1247 #ifndef IN_PROCESS_AGENT 1293 #ifdef IN_PROCESS_AGENT 1297 struct fast_tracepoint_ctx
1302 int regcache_initted;
1303 unsigned char *regspace;
1305 unsigned char *regs;
1311 struct static_tracepoint_ctx
1318 int regcache_initted;
1323 unsigned char *regspace;
1326 struct registers *regs;
1351 #ifndef IN_PROCESS_AGENT 1359 #ifndef IN_PROCESS_AGENT 1367 #ifndef IN_PROCESS_AGENT 1370 struct tracepoint *tpoint,
int current_step);
1380 #ifndef IN_PROCESS_AGENT 1392 #if defined(__GNUC__) 1393 # define memory_barrier() asm volatile ("" : : : "memory") 1395 # define memory_barrier() do {} while (0) 1401 #define cmpxchg(mem, oldval, newval) \ 1402 __sync_val_compare_and_swap (mem, oldval, newval) 1410 trace_debug (
"Tracepoint %d at %s %s eval reports error %d",
1413 #ifdef IN_PROCESS_AGENT 1443 #ifndef IN_PROCESS_AGENT 1454 &ipa_trace_buffer_lo);
1456 &ipa_trace_buffer_hi);
1458 ipa_trace_buffer_ctrl.
start = ipa_trace_buffer_lo;
1459 ipa_trace_buffer_ctrl.
free = ipa_trace_buffer_lo;
1460 ipa_trace_buffer_ctrl.
end_free = ipa_trace_buffer_hi;
1461 ipa_trace_buffer_ctrl.
wrap = ipa_trace_buffer_hi;
1465 (
unsigned char *) &ipa_trace_buffer_ctrl,
1466 sizeof (ipa_trace_buffer_ctrl));
1472 (
unsigned char *) &ipa_traceframe,
1473 sizeof (ipa_traceframe));
1500 #ifdef IN_PROCESS_AGENT 1503 about_to_request_buffer_space (
void)
1507 UNKNOWN_SIDE_EFFECTS();
1518 unsigned char *rslt;
1521 #ifdef IN_PROCESS_AGENT 1522 unsigned int prev, prev_filtered;
1523 unsigned int commit_count;
1524 unsigned int commit;
1525 unsigned int readout;
1528 unsigned char *new_start;
1531 trace_debug (
"Want to allocate %ld+%ld bytes in trace buffer",
1532 (
long) amt, (
long)
sizeof (
struct traceframe));
1537 #ifdef IN_PROCESS_AGENT 1543 prev = trace_buffer_ctrl_curr;
1545 curr = prev_filtered + 1;
1549 about_to_request_buffer_space ();
1567 trace_debug (
"Trace buffer [%d] start=%d free=%d endfree=%d wrap=%d hi=%d",
1595 trace_debug (
"Upper part too small, setting wraparound");
1602 if (tbctrl->
free + amt <= tbctrl->end_free)
1605 #ifdef IN_PROCESS_AGENT 1611 flush_trace_buffer ();
1615 trace_debug (
"gdbserver flushed buffer, retrying");
1626 trace_debug (
"Not enough space in the trace buffer");
1630 trace_debug (
"Need more space in the trace buffer");
1635 if (oldest->
tpnum == 0)
1654 if (new_start < tbctrl->start)
1659 tbctrl->
start = new_start;
1663 "Trace buffer [%d], start=%d free=%d " 1664 "endfree=%d wrap=%d hi=%d",
1680 rslt = tbctrl->
free;
1691 #ifdef IN_PROCESS_AGENT 1700 readout =
cmpxchg (&trace_buffer_ctrl_curr, prev, commit);
1701 if (readout != prev)
1703 trace_debug (
"GDBserver has touched the trace buffer, restarting." 1704 " (prev=%08x, commit=%08x, readout=%08x)",
1705 prev, commit, readout);
1715 about_to_request_buffer_space ();
1721 unsigned int refetch;
1725 refetch = trace_buffer_ctrl_curr;
1727 if (refetch == commit
1731 trace_debug (
"change is effective: (prev=%08x, commit=%08x, " 1732 "readout=%08x, refetch=%08x)",
1733 prev, commit, readout, refetch);
1737 trace_debug (
"GDBserver has touched the trace buffer, not effective." 1738 " (prev=%08x, commit=%08x, readout=%08x, refetch=%08x)",
1739 prev, commit, readout, refetch);
1758 trace_debug (
"Trace buffer [%d] start=%d free=%d " 1759 "endfree=%d wrap=%d hi=%d",
1771 #ifndef IN_PROCESS_AGENT 1805 tpoint->
cond = NULL;
1815 tpoint->
next = NULL;
1838 tp_next = &(*tp_next)->
next)
1840 tpoint->
next = *tp_next;
1849 #ifndef IN_PROCESS_AGENT 1872 for (tp =
tracepoints, tp_prev = NULL; tp && tp != tpoint;
1873 tp_prev = tp, tp = tp->
next)
1898 tpoint = prev_tp->
next;
1901 for (; tpoint; tpoint = tpoint->
next)
1902 if (tpoint->
number == num)
1927 const char *act_start = act;
1940 action = &maction->
base;
1943 is_neg = (*act ==
'-');
1954 trace_debug (
"Want to collect %s bytes at 0x%s (basereg %d)",
1965 action = &raction->
base;
1970 while (isxdigit(*act))
1980 action = &raction->
base;
1982 trace_debug (
"Want to collect static trace data");
1995 action = &xaction->
base;
2002 trace_debug (
"unknown trace action '%c', ignoring...", *act);
2049 #ifdef IN_PROCESS_AGENT 2051 for (tsv = alloced_trace_state_variables; tsv; tsv = tsv->
next)
2082 #ifdef IN_PROCESS_AGENT 2085 tsv->
next = alloced_trace_state_variables;
2086 alloced_trace_state_variables = tsv;
2106 trace_debug (
"No trace state variable %d, skipping value get", num);
2117 trace_debug (
"get_trace_state_variable_value(%d) ==> %s",
2132 trace_debug (
"No trace state variable %d, skipping value set", num);
2160 trace_debug (
"No trace state variable %d, skipping name set", num);
2176 trace_debug (
"No trace state variable %d, skipping getter set", num);
2204 static unsigned char *
2208 unsigned char *block;
2235 #ifndef IN_PROCESS_AGENT 2298 ? (lo <= tfaddr && tfaddr <= hi)
2299 : (lo > tfaddr || tfaddr > hi))
2328 if (tframe->
tpnum == num)
2339 #ifndef IN_PROCESS_AGENT 2406 sprintf (cmd,
"unprobe_marker_at:%s",
paddress (address));
2422 prev_stpoint = NULL;
2429 if (tpoint->
handle == NULL)
2432 "never installed, nothing to clear",
2437 switch (tpoint->
type)
2456 if (prev_stpoint != NULL
2465 prev_stpoint = tpoint;
2483 int trail_hyphen = 0;
2490 packet += strlen (
"QTDP:");
2514 " at 0x%s already exists",
2522 tpoint->
enabled = (*packet ==
'E');
2531 while (*packet ==
':')
2541 else if (*packet ==
'S')
2546 else if (*packet ==
'X')
2550 else if (*packet ==
'-')
2552 else if (*packet ==
'\0')
2555 trace_debug (
"Unknown optional tracepoint field");
2564 "enabled %d step %" PRIu64
" pass %" PRIu64,
2574 trace_debug (
"Tracepoint error: tracepoint %d at 0x%s not found",
2615 tpoint->
handle = (
void *) -1;
2638 if (strcmp (
own_buf,
"OK") != 0)
2659 char *srctype, *src;
2663 packet += strlen (
"QTDPsrc:");
2675 trace_debug (
"Tracepoint error: tracepoint %d at 0x%s not found",
2682 packet = strchr (packet,
':');
2683 srctype = (
char *)
xmalloc (packet - saved + 1);
2684 memcpy (srctype, saved, packet - saved);
2685 srctype[packet - saved] =
'\0';
2691 src = (
char *)
xmalloc (slen + 1);
2696 newlast->
type = srctype;
2698 newlast->
next = NULL;
2723 packet += strlen (
"QTDV:");
2732 nbytes = strlen (packet) / 2;
2733 varname = (
char *)
xmalloc (nbytes + 1);
2735 varname[nbytes] =
'\0';
2739 tsv->
name = varname;
2753 packet += strlen (enable ?
"QTEnable:" :
"QTDisable:");
2764 trace_debug (
"Tracepoint %d at 0x%s is already %s",
2766 enable ?
"enabled" :
"disabled");
2772 enable ?
"Enabling" :
"Disabling",
2786 trace_debug (
"Failed to temporarily stop inferior threads");
2797 "inferior process memory");
2821 packet += strlen (
"qTV:");
2877 packet += strlen (
"QTro");
2879 while (*packet ==
':')
2891 trace_debug (
"Added readonly region from 0x%s to 0x%s",
2908 if (roreg->
start <= addr && (addr + length - 1) <= roreg->
end)
2927 "error extracting jump_pad_buffer");
2939 trace_debug (
"claim_jump_space reserves %s bytes at %s",
2960 "error extracting trampoline_buffer");
2967 "error extracting trampoline_buffer_end");
2977 trace_debug (
"claim_trampoline_space failed to reserve %s bytes",
2984 trace_debug (
"claim_trampoline_space reserves %s bytes at %s",
3003 "error extracting trampoline_buffer_end");
3009 strcpy (buf,
"was claiming");
3014 "error extracting errbuf");
3020 return trampoline_end != 0;
3035 sprintf (cmd,
"probe_marker_at:%s",
paddress (address));
3042 strcpy (errout, cmd);
3065 #define MAX_JUMP_SIZE 20 3085 trace_debug (
"Requested a fast tracepoint on an instruction " 3086 "that is of less than the minimum length.");
3093 error (
"error extracting gdb_collect_ptr");
3100 trampoline_size = 0;
3109 &trampoline, &trampoline_size,
3122 if (tpoint->
handle != NULL)
3130 jentry = ((jentry + 7) & ~0x7);
3159 trace_debug (
"Requested a %s tracepoint, but fast " 3160 "tracepoints aren't supported.",
3168 trace_debug (
"Requested a static tracepoint, but static " 3169 "tracepoints are not supported.");
3179 tpoint->
handle = (
void *) -1;
3186 if (tpoint->
handle == NULL)
3200 struct tracepoint *tpoint, *prev_ftpoint, *prev_stpoint;
3222 prev_ftpoint = NULL;
3225 prev_stpoint = NULL;
3234 error (
"Error setting ipa_tdesc_idx variable in lib");
3262 trace_debug (
"Requested a %s tracepoint, but fast " 3263 "tracepoints aren't supported.",
3265 ?
"static" :
"fast");
3274 if (prev_ftpoint != NULL
3299 prev_ftpoint = tpoint;
3306 trace_debug (
"Requested a static tracepoint, but static " 3307 "tracepoints are not supported.");
3313 if (prev_stpoint != NULL
3315 tpoint->
handle = (
void *) -1;
3320 tpoint->
handle = (
void *) -1;
3324 prev_stpoint = tpoint;
3344 if (tpoint->
handle == NULL)
3354 if (*packet ==
'\0')
3374 "Error setting tracing variable in lib");
3381 "Error clearing stopping_tracepoint variable" 3388 "Error clearing trace_buffer_is_full variable" 3395 error (
"Error setting stop_tracing breakpoint");
3401 error (
"Error setting flush_trace_buffer breakpoint");
3441 "Error clearing tracing variable in lib");
3451 "tracepoint %d was hit %" PRIu64
" times",
3459 trace_debug (
"Stopping the trace because the trace buffer is full");
3464 trace_debug (
"Stopping the trace because of an expression eval error");
3468 #ifndef IN_PROCESS_AGENT 3471 trace_debug (
"Stopping the trace because GDB disconnected");
3477 trace_debug (
"Stopping the trace because of a tstop command");
3543 packet += strlen (
"QTDisconnected:");
3560 packet += strlen (
"QTFrame:");
3564 packet += strlen (
"pc:");
3571 packet += strlen (
"range:");
3575 trace_debug (
"Want to find next traceframe in the range 0x%s to 0x%s",
3581 packet += strlen (
"outside:");
3586 "outside the range 0x%s to 0x%s",
3592 packet += strlen (
"tdp:");
3601 tfnum = (int) frame;
3604 trace_debug (
"Want to stop looking at traceframes");
3609 trace_debug (
"Want to look at traceframe %d", tfnum);
3625 char *stop_reason_rsp = NULL;
3626 char *buf1, *buf2, *buf3;
3634 slen = strlen (str);
3635 buf1 = (
char *)
alloca (slen * 2 + 1);
3639 slen = strlen (str);
3640 buf2 = (
char *)
alloca (slen * 2 + 1);
3644 slen = strlen (str);
3645 buf3 = (
char *)
alloca (slen * 2 + 1);
3648 trace_debug (
"Returning trace status as %d, stop reason %s",
3667 const char *result_name;
3671 result_name = stop_reason_rsp + strlen (
"terror:");
3672 hexstr_len = strlen (result_name) * 2;
3674 = (
char *)
alloca (strlen (
"terror:") + hexstr_len + 1);
3675 strcpy (p,
"terror:");
3681 if (strcmp (stop_reason_rsp,
"tstop") == 0)
3683 stop_reason_rsp = (
char *)
alloca (strlen (
"tstop:") + strlen (buf3) + 1);
3684 strcpy (stop_reason_rsp,
"tstop:");
3685 strcat (stop_reason_rsp, buf3);
3691 "tframes:%x;tcreated:%x;" 3692 "tfree:%x;tsize:%s;" 3695 "starttime:%s;stoptime:%s;" 3696 "username:%s;notes:%s:",
3715 packet += strlen (
"qTP:");
3726 trace_debug (
"Tracepoint error: tracepoint %d at 0x%s not found",
3751 sprintf (packet,
"T%x:%s:%c:%" PRIx64
":%" PRIx64, tpoint->
number,
3756 sprintf (packet + strlen (packet),
":F%x", tpoint->
orig_size);
3758 sprintf (packet + strlen (packet),
":S");
3763 sprintf (packet + strlen (packet),
":X%x,%s",
3777 char *taction,
int step)
3779 sprintf (packet,
"%c%x:%s:%s",
3794 len = strlen (src->
str);
3795 buf = (
char *)
alloca (len * 2 + 1);
3798 sprintf (packet,
"Z%x:%s:%s:%x:%x:%s",
3800 src->
type, 0, len, buf);
3810 trace_debug (
"Returning first tracepoint definition piece");
3819 strcpy (packet,
"l");
3830 trace_debug (
"Returning subsequent tracepoint definition piece");
3836 strcpy (packet,
"l");
3838 else if (cur_action < cur_tpoint->numactions)
3844 else if (cur_step_action < cur_tpoint->num_step_actions)
3868 strcpy (packet,
"l");
3878 char *buf = (
char *)
"";
3883 namelen = strlen (tsv->
name);
3884 buf = (
char *)
alloca (namelen * 2 + 1);
3889 tsv->
getter ? 1 : 0, buf);
3898 trace_debug (
"Returning first trace state variable definition");
3905 strcpy (packet,
"l");
3913 trace_debug (
"Returning additional trace state variable definition");
3921 strcpy (packet,
"l");
3924 strcpy (packet,
"l");
3973 strcpy (buf,
"close");
3990 strcpy (packet,
"0");
4008 packet += strlen (
"qTBuffer:");
4014 trace_debug (
"Want to get trace buffer, %d bytes at offset 0x%s",
4044 if (num >= (
PBUFSIZ - 16) / 2 )
4056 packet += strlen (
"QTBuffer:circular:");
4079 packet += strlen (
"QTBuffer:size:");
4082 if (strcmp (packet,
"-1") == 0)
4100 char *saved, *user, *notes, *stopnote;
4103 packet += strlen (
"QTNotes:");
4109 packet += strlen (
"user:");
4111 packet = strchr (packet,
';');
4112 nbytes = (packet - saved) / 2;
4113 user = (
char *)
xmalloc (nbytes + 1);
4115 user[nbytes] =
'\0';
4123 packet += strlen (
"notes:");
4125 packet = strchr (packet,
';');
4126 nbytes = (packet - saved) / 2;
4127 notes = (
char *)
xmalloc (nbytes + 1);
4129 notes[nbytes] =
'\0';
4137 packet += strlen (
"tstop:");
4139 packet = strchr (packet,
';');
4140 nbytes = (packet - saved) / 2;
4141 stopnote = (
char *)
xmalloc (nbytes + 1);
4143 stopnote[nbytes] =
'\0';
4159 if (strcmp (
"QTinit", packet) == 0)
4194 else if (strcmp (
"QTStart", packet) == 0)
4199 else if (strcmp (
"QTStop", packet) == 0)
4204 else if (
startswith (packet,
"QTDisconnected:"))
4214 else if (
startswith (packet,
"QTBuffer:circular:"))
4219 else if (
startswith (packet,
"QTBuffer:size:"))
4236 if (strcmp (
"qTStatus", packet) == 0)
4246 else if (strcmp (
"qTfP", packet) == 0)
4251 else if (strcmp (
"qTsP", packet) == 0)
4256 else if (strcmp (
"qTfV", packet) == 0)
4261 else if (strcmp (
"qTsV", packet) == 0)
4276 else if (strcmp (
"qTfSTM", packet) == 0)
4281 else if (strcmp (
"qTsSTM", packet) == 0)
4291 else if (strcmp (
"qTMinFTPILen", packet) == 0)
4301 #ifndef IN_PROCESS_AGENT 4398 trace_debug (
"Thread %s finished a single-step for tracepoint %d at 0x%s",
4405 while (wstep != NULL)
4410 trace_debug (
"NO TRACEPOINT %d at 0x%s FOR THREAD %s!",
4415 *wstep_link = wstep->
next;
4417 wstep = *wstep_link;
4431 trace_debug (
"Thread %s done stepping for tracepoint %d at 0x%s",
4436 *wstep_link = wstep->
next;
4438 wstep = *wstep_link;
4451 wstep_link = &wstep->
next;
4452 wstep = *wstep_link;
4486 int ipa_trace_buffer_is_full;
4488 int ipa_expr_eval_result;
4494 &ipa_trace_buffer_is_full);
4497 &ipa_stopping_tracepoint);
4501 &ipa_error_tracepoint);
4505 &ipa_expr_eval_result);
4509 "stopping_tracepoint: %s, " 4510 "ipa_expr_eval_result: %d, " 4511 "error_tracepoint: %s, ",
4512 ipa_trace_buffer_is_full,
4513 paddress (ipa_stopping_tracepoint),
4514 ipa_expr_eval_result,
4519 if (ipa_trace_buffer_is_full)
4521 if (ipa_stopping_tracepoint)
4523 if (ipa_error_tracepoint)
4527 if (ipa_stopping_tracepoint != 0)
4543 trace_debug (
"lib stopped at flush_trace_buffer");
4578 trace_debug (
"Thread %s at address of tracepoint %d at 0x%s",
4613 #if defined IN_PROCESS_AGENT && defined HAVE_UST 4614 struct ust_marker_data;
4642 trace_debug (
"Making new traceframe for tracepoint %d at 0x%s, hit %" PRIu64,
4649 for (acti = 0; acti < tpoint->
numactions; ++acti)
4651 #ifndef IN_PROCESS_AGENT 4652 trace_debug (
"Tracepoint %d at 0x%s about to do action '%s'",
4664 if (tframe == NULL &&
tracing)
4668 #ifndef IN_PROCESS_AGENT 4679 "tracepoint %d at 0x%s, step %d of %" PRIu64
", hit %" PRIu64,
4690 trace_debug (
"Tracepoint %d at 0x%s about to do step action '%s'",
4701 if (tframe == NULL &&
tracing)
4707 #ifdef IN_PROCESS_AGENT 4719 #ifdef IN_PROCESS_AGENT 4724 struct fast_tracepoint_ctx *fctx = (
struct fast_tracepoint_ctx *) ctx;
4725 if (!fctx->regcache_initted)
4727 fctx->regcache_initted = 1;
4737 struct static_tracepoint_ctx *sctx
4738 = (
struct static_tracepoint_ctx *) ctx;
4740 if (!sctx->regcache_initted)
4742 sctx->regcache_initted = 1;
4747 supply_static_tracepoint_registers (&sctx->regcache,
4748 (
const unsigned char *)
4750 sctx->tpoint->address);
4777 switch (taction->
type)
4789 trace_debug (
"Want to collect %s bytes at 0x%s (basereg %d)",
4791 paddress (maction->addr), maction->basereg);
4799 unsigned char *regspace;
4811 if (regspace == NULL)
4813 trace_debug (
"Trace buffer block allocation failed, skipping");
4827 #ifndef IN_PROCESS_AGENT 4838 trace_debug (
"Storing stop pc (0x%s) in regblock",
4870 #if defined IN_PROCESS_AGENT && defined HAVE_UST 4871 trace_debug (
"Want to collect static trace data");
4872 collect_ust_data_at_tracepoint (ctx, tframe);
4874 trace_debug (
"warning: collecting static trace data, " 4875 "but static tracepoints are not supported");
4906 #ifdef IN_PROCESS_AGENT 4909 struct fast_tracepoint_ctx *fctx = (
struct fast_tracepoint_ctx *) ctx;
4930 trace_debug (
"Tracepoint %d at 0x%s condition evals to %s",
4933 return (value ? 1 : 0);
4943 unsigned char *mspace;
4945 unsigned short blocklen;
4955 while (remaining > 0)
4959 blocklen = (remaining > 65535 ? 65535 : remaining);
4960 sp = 1 +
sizeof (from) +
sizeof (blocklen) + blocklen;
4968 memcpy (mspace, &from,
sizeof (from));
4969 mspace +=
sizeof (from);
4970 memcpy (mspace, &blocklen,
sizeof (blocklen));
4971 mspace +=
sizeof (blocklen);
4975 remaining -= blocklen;
4985 unsigned char *buf, *mspace;
4987 unsigned short blocklen, i;
4992 while (remaining > 0)
4996 blocklen = (remaining > 65535 ? 65535 : remaining);
5000 buf = (
unsigned char *)
xmalloc (blocklen + 1);
5001 for (i = 0; i < blocklen; ++i)
5013 remaining = blocklen;
5017 sp = 1 +
sizeof (from) +
sizeof (blocklen) + blocklen;
5028 memcpy ((
void *) mspace, (
void *) &from,
sizeof (from));
5029 mspace +=
sizeof (from);
5030 memcpy ((
void *) mspace, (
void *) &blocklen,
sizeof (blocklen));
5031 mspace +=
sizeof (blocklen);
5033 memcpy ((
void *) mspace, (
void *) buf, blocklen);
5034 remaining -= blocklen;
5046 unsigned char *vspace;
5050 1 + sizeof (n) +
sizeof (
LONGEST));
5056 memcpy (vspace + 1, &n,
sizeof (n));
5058 memcpy (vspace + 1 +
sizeof (n), &val,
sizeof (val));
5063 #ifndef IN_PROCESS_AGENT 5071 char *wantedp = (
char *) data;
5073 if (*wantedp == blocktype)
5086 static unsigned char *
5089 int (*callback) (
char blocktype,
5090 unsigned char *dataptr,
5094 unsigned char *dataptr;
5104 for (dataptr = database;
5105 dataptr < database + datasize;
5109 unsigned short mlen;
5115 datasize = dataptr - database;
5119 blocktype = *dataptr++;
5121 if ((*callback) (blocktype, dataptr, data))
5133 memcpy (&mlen, dataptr,
sizeof (mlen));
5134 dataptr += (
sizeof (mlen) + mlen);
5138 dataptr += (
sizeof (int) +
sizeof (
LONGEST));
5142 memcpy (&mlen, dataptr,
sizeof (mlen));
5143 dataptr += (
sizeof (mlen) + mlen);
5146 trace_debug (
"traceframe %d has unknown block type 0x%x",
5159 static unsigned char *
5161 int tfnum,
char type_wanted)
5167 static unsigned char *
5170 unsigned char *regblock;
5176 if (regblock == NULL)
5177 trace_debug (
"traceframe %d has no register data", tfnum);
5187 unsigned char *dataptr;
5200 if (dataptr == NULL)
5222 unsigned char *dataptr;
5226 if (dataptr == NULL)
5237 unsigned char *buf,
ULONGEST length,
5241 unsigned char *database, *dataptr;
5242 unsigned int datasize;
5244 unsigned short mlen;
5257 database = dataptr = &tframe->
data[0];
5262 - (dataptr - database),
5263 tfnum,
'M')) != NULL)
5265 memcpy (&maddr, dataptr,
sizeof (maddr));
5266 dataptr +=
sizeof (maddr);
5267 memcpy (&mlen, dataptr,
sizeof (mlen));
5268 dataptr +=
sizeof (mlen);
5275 if (maddr <= addr && addr < (maddr + mlen))
5277 ULONGEST amt = (maddr + mlen) - addr;
5281 memcpy (buf, dataptr + (addr - maddr), amt);
5290 trace_debug (
"traceframe %d has no memory data for the desired region",
5302 unsigned char *database, *dataptr;
5303 unsigned int datasize;
5326 database = dataptr = &tframe->
data[0];
5332 - (dataptr - database),
5333 tfnum,
'V')) != NULL)
5335 memcpy (&vnum, dataptr,
sizeof (vnum));
5336 dataptr +=
sizeof (vnum);
5338 trace_debug (
"traceframe %d has variable %d", tfnum, vnum);
5343 memcpy (val, dataptr,
sizeof (*val));
5352 trace_debug (
"traceframe %d has no data for variable %d",
5362 unsigned char *buf,
ULONGEST length,
5366 unsigned char *database, *dataptr;
5367 unsigned int datasize;
5368 unsigned short mlen;
5381 database = &tframe->
data[0];
5387 if (dataptr != NULL)
5389 memcpy (&mlen, dataptr,
sizeof (mlen));
5390 dataptr +=
sizeof (mlen);
5393 if (
offset + length > mlen)
5396 memcpy (buf, dataptr, length);
5404 trace_debug (
"traceframe %d has no static trace data", tfnum);
5423 unsigned short mlen;
5426 memcpy (&maddr, dataptr,
sizeof (maddr));
5427 dataptr +=
sizeof (maddr);
5428 memcpy (&mlen, dataptr,
sizeof (mlen));
5429 dataptr +=
sizeof (mlen);
5431 "<memory start=\"0x%s\" length=\"0x%s\"/>\n",
5439 memcpy (&vnum, dataptr,
sizeof (vnum));
5449 warning (
"Unhandled trace block type (%d) '%c ' " 5450 "while building trace frame info.",
5451 blocktype, blocktype);
5552 #ifndef IN_PROCESS_AGENT 5576 CORE_ADDR ipa_gdb_jump_pad_buffer, ipa_gdb_jump_pad_buffer_end;
5578 CORE_ADDR ipa_gdb_trampoline_buffer_end;
5580 int needs_breakpoint;
5607 needs_breakpoint = 0;
5611 &ipa_gdb_jump_pad_buffer))
5614 "error extracting `gdb_jump_pad_buffer'");
5617 &ipa_gdb_jump_pad_buffer_end))
5620 "error extracting `gdb_jump_pad_buffer_end'");
5624 &ipa_gdb_trampoline_buffer))
5627 "error extracting `gdb_trampoline_buffer'");
5630 &ipa_gdb_trampoline_buffer_end))
5633 "error extracting `gdb_trampoline_buffer_end'");
5636 if (ipa_gdb_jump_pad_buffer <= stop_pc
5637 && stop_pc < ipa_gdb_jump_pad_buffer_end)
5644 warning (
"in jump pad, but no matching tpoint?");
5649 trace_debug (
"in jump pad of tpoint (%d, %s); jump_pad(%s, %s); " 5662 needs_breakpoint = 1;
5664 else if (ipa_gdb_trampoline_buffer <= stop_pc
5665 && stop_pc < ipa_gdb_trampoline_buffer_end)
5672 warning (
"in trampoline, but no matching tpoint?");
5677 trace_debug (
"in trampoline of tpoint (%d, %s); trampoline(%s, %s)",
5686 needs_breakpoint = 1;
5700 " failed reading 'collecting' in the inferior");
5704 if (!ipa_collecting)
5706 trace_debug (
"fast_tracepoint_collecting: not collecting" 5707 " (and nobody is).");
5713 (
unsigned char *) &ipa_collecting_obj,
5714 sizeof (ipa_collecting_obj)) != 0)
5717 if (ipa_collecting_obj.thread_area != thread_area)
5719 trace_debug (
"fast_tracepoint_collecting: not collecting " 5720 "(another thread is)");
5728 warning (
"fast_tracepoint_collecting: collecting, " 5729 "but tpoint %s not found?",
5736 needs_breakpoint = 1;
5748 if (needs_breakpoint)
5755 fast_tracepoint_collecting, returning continue-until-break at %s",
5764 trace_debug (
"fast_tracepoint_collecting, returning " 5765 "need-single-step (%s-%s)",
5775 #ifdef IN_PROCESS_AGENT 5791 gdb_collect (
struct tracepoint *tpoint,
unsigned char *regs)
5793 struct fast_tracepoint_ctx ctx;
5803 ctx.regcache_initted = 0;
5807 if (ctx.regspace == NULL)
5809 trace_debug (
"Trace buffer block allocation failed, skipping");
5813 for (ctx.tpoint = tpoint;
5814 ctx.tpoint != NULL && ctx.tpoint->address == tpoint->
address;
5815 ctx.tpoint = ctx.tpoint->next)
5817 if (!ctx.tpoint->enabled)
5822 if (ctx.tpoint->
type != tpoint->
type)
5826 if (ctx.tpoint->cond == NULL
5831 ctx.tpoint->address, ctx.tpoint);
5864 typedef void (*gdb_collect_ptr_type) (
struct tracepoint *,
unsigned char *);
5865 typedef ULONGEST (*get_raw_reg_ptr_type) (
const unsigned char *, int);
5866 typedef LONGEST (*get_trace_state_variable_value_ptr_type) (int);
5867 typedef void (*set_trace_state_variable_value_ptr_type) (int,
LONGEST);
5880 #ifndef IN_PROCESS_AGENT 5888 error (
"error extracting get_raw_reg_ptr");
5901 error (
"error extracting get_trace_state_variable_value_ptr");
5914 error (
"error extracting set_trace_state_variable_value_ptr");
5927 trace_debug (
"Starting condition compilation for tracepoint %d\n",
5944 trace_debug (
"Condition compilation for tracepoint %d complete\n",
5953 trace_debug (
"Condition compilation for tracepoint %d failed, " 5989 "couldn't get target heap head pointer");
6020 #define UALIGN(V, N) (((V) + ((N) - 1)) & ~((N) - 1)) 6039 if (tpoint->
cond != NULL)
6044 jentry =
UALIGN (jentry, 8);
6050 jentry =
UALIGN (jentry, 8);
6054 target_tracepoint = *tpoint;
6062 target_tracepoint.
next = NULL;
6068 sizeof (target_tracepoint));
6093 if (ipa_action != 0)
6095 + i *
sizeof (*tpoint->
actions),
6101 #define IPA_PROTO_FAST_TRACE_FLAG 0 6102 #define IPA_PROTO_FAST_TRACE_ADDR_ON_TARGET 2 6103 #define IPA_PROTO_FAST_TRACE_JUMP_PAD 10 6104 #define IPA_PROTO_FAST_TRACE_FJUMP_SIZE 18 6105 #define IPA_PROTO_FAST_TRACE_FJUMP_INSN 22 6117 strcpy (p,
"FastTrace:");
6140 p[0] = action->
type;
6170 trace_debug (
"agent: read from cmd_buf 0x%x 0x%x\n",
6213 &tp_prev_target_next_addr))
6216 "error reading `tp_prev->next'");
6222 tp_prev_target_next_addr);
6277 target_tsv.
next = NULL;
6280 sizeof (target_tsv));
6282 if (tsv->
name != NULL)
6284 size_t size = strlen (tsv->
name) + 1;
6287 (
unsigned char *) tsv->
name, size);
6315 unsigned int ipa_traceframe_read_count, ipa_traceframe_write_count;
6316 unsigned int ipa_traceframe_read_count_racy, ipa_traceframe_write_count_racy;
6319 unsigned int curr_tbctrl_idx;
6320 unsigned int ipa_trace_buffer_ctrl_curr;
6321 unsigned int ipa_trace_buffer_ctrl_curr_old;
6323 struct breakpoint *about_to_request_buffer_space_bkpt;
6328 &ipa_traceframe_read_count_racy))
6336 &ipa_traceframe_write_count_racy))
6339 trace_debug (
"ipa_traceframe_count (racy area): %d (w=%d, r=%d)",
6340 ipa_traceframe_write_count_racy
6341 - ipa_traceframe_read_count_racy,
6342 ipa_traceframe_write_count_racy,
6343 ipa_traceframe_read_count_racy);
6345 if (ipa_traceframe_write_count_racy == ipa_traceframe_read_count_racy)
6348 about_to_request_buffer_space_bkpt
6353 &ipa_trace_buffer_ctrl_curr))
6356 ipa_trace_buffer_ctrl_curr_old = ipa_trace_buffer_ctrl_curr;
6361 unsigned int prev, counter;
6375 ipa_trace_buffer_ctrl_curr))
6379 ipa_trace_buffer_ctrl_curr_old,
6380 ipa_trace_buffer_ctrl_curr);
6392 &ipa_traceframe_read_count))
6395 &ipa_traceframe_write_count))
6400 trace_debug (
"ipa_traceframe_count (blocked area): %d (w=%d, r=%d)",
6401 ipa_traceframe_write_count - ipa_traceframe_read_count,
6402 ipa_traceframe_write_count, ipa_traceframe_read_count);
6404 if (ipa_traceframe_write_count != ipa_traceframe_write_count_racy
6405 || ipa_traceframe_read_count != ipa_traceframe_read_count_racy)
6406 trace_debug (
"note that ipa_traceframe_count's parts changed");
6413 ipa_trace_buffer_ctrl_addr
6417 (
unsigned char *) &ipa_trace_buffer_ctrl,
6422 &ipa_trace_buffer_lo))
6425 &ipa_trace_buffer_hi))
6431 trace_debug (
"Lib: Trace buffer [%d] start=%d free=%d " 6432 "endfree=%d wrap=%d hi=%d",
6434 (
int) (ipa_trace_buffer_ctrl.start - ipa_trace_buffer_lo),
6435 (
int) (ipa_trace_buffer_ctrl.free - ipa_trace_buffer_lo),
6436 (
int) (ipa_trace_buffer_ctrl.end_free - ipa_trace_buffer_lo),
6437 (
int) (ipa_trace_buffer_ctrl.wrap - ipa_trace_buffer_lo),
6438 (
int) (ipa_trace_buffer_hi - ipa_trace_buffer_lo));
6442 #define IPA_FIRST_TRACEFRAME() (ipa_trace_buffer_ctrl.start) 6444 #define IPA_NEXT_TRACEFRAME_1(TF, TFOBJ) \ 6445 ((TF) + sizeof (struct traceframe) + (TFOBJ)->data_size) 6447 #define IPA_NEXT_TRACEFRAME(TF, TFOBJ) \ 6448 (IPA_NEXT_TRACEFRAME_1 (TF, TFOBJ) \ 6449 - ((IPA_NEXT_TRACEFRAME_1 (TF, TFOBJ) >= ipa_trace_buffer_ctrl.wrap) \ 6450 ? (ipa_trace_buffer_ctrl.wrap - ipa_trace_buffer_lo) \ 6455 while (ipa_traceframe_write_count - ipa_traceframe_read_count)
6459 unsigned char *block;
6464 error (
"Uploading: couldn't read traceframe at %s\n",
paddress (tf));
6466 if (ipa_tframe.tpnum == 0)
6469 "Uploading: No (more) fast traceframes, but" 6470 " ipa_traceframe_count == %u??\n",
6471 ipa_traceframe_write_count
6472 - ipa_traceframe_read_count);
6490 ipa_tframe.data_size);
6495 block, ipa_tframe.data_size))
6496 error (
"Uploading: Couldn't read traceframe data at %s\n",
6508 if (tf < ipa_trace_buffer_ctrl.start)
6510 trace_debug (
"Lib: Discarding past the wraparound");
6511 ipa_trace_buffer_ctrl.wrap = ipa_trace_buffer_hi;
6513 ipa_trace_buffer_ctrl.start = tf;
6514 ipa_trace_buffer_ctrl.end_free = ipa_trace_buffer_ctrl.start;
6515 ++ipa_traceframe_read_count;
6517 if (ipa_trace_buffer_ctrl.start == ipa_trace_buffer_ctrl.free
6518 && ipa_trace_buffer_ctrl.start == ipa_trace_buffer_ctrl.end_free)
6521 "Trace buffer [%d] start=%d free=%d endfree=%d",
6523 (
int) (ipa_trace_buffer_ctrl.start
6524 - ipa_trace_buffer_lo),
6525 (
int) (ipa_trace_buffer_ctrl.free
6526 - ipa_trace_buffer_lo),
6527 (
int) (ipa_trace_buffer_ctrl.end_free
6528 - ipa_trace_buffer_lo));
6530 ipa_trace_buffer_ctrl.start = ipa_trace_buffer_lo;
6531 ipa_trace_buffer_ctrl.free = ipa_trace_buffer_lo;
6532 ipa_trace_buffer_ctrl.end_free = ipa_trace_buffer_hi;
6533 ipa_trace_buffer_ctrl.wrap = ipa_trace_buffer_hi;
6537 "Lib: Trace buffer [%d] start=%d free=%d " 6538 "endfree=%d wrap=%d hi=%d",
6540 (
int) (ipa_trace_buffer_ctrl.start - ipa_trace_buffer_lo),
6541 (
int) (ipa_trace_buffer_ctrl.free - ipa_trace_buffer_lo),
6542 (
int) (ipa_trace_buffer_ctrl.end_free
6543 - ipa_trace_buffer_lo),
6544 (
int) (ipa_trace_buffer_ctrl.wrap - ipa_trace_buffer_lo),
6545 (
int) (ipa_trace_buffer_hi - ipa_trace_buffer_lo));
6549 (
unsigned char *) &ipa_trace_buffer_ctrl,
6554 ipa_traceframe_read_count);
6556 trace_debug (
"Done uploading traceframes [%d]\n", curr_tbctrl_idx);
6561 about_to_request_buffer_space_bkpt = NULL;
6570 #ifdef IN_PROCESS_AGENT 6583 #define tracepoint ust_tracepoint 6584 #include <ust/ust.h> 6587 extern int serialize_to_text (
char *outbuf,
int bufsize,
6588 const char *fmt, va_list ap);
6590 #define GDB_PROBE_NAME "gdb" 6599 int (*serialize_to_text) (
char *outbuf,
int bufsize,
6600 const char *fmt, va_list ap);
6602 int (*ltt_probe_register) (
struct ltt_available_probe *pdata);
6603 int (*ltt_probe_unregister) (
struct ltt_available_probe *pdata);
6605 int (*ltt_marker_connect) (
const char *channel,
const char *mname,
6607 int (*ltt_marker_disconnect) (
const char *channel,
const char *mname,
6610 void (*marker_iter_start) (
struct marker_iter *iter);
6611 void (*marker_iter_next) (
struct marker_iter *iter);
6612 void (*marker_iter_stop) (
struct marker_iter *iter);
6613 void (*marker_iter_reset) (
struct marker_iter *iter);
6621 #define GET_UST_SYM(SYM) \ 6624 if (ust_ops.SYM == NULL) \ 6625 ust_ops.SYM = (typeof (&SYM)) dlsym (RTLD_DEFAULT, #SYM); \ 6626 if (ust_ops.SYM == NULL) \ 6630 #define USTF(SYM) ust_ops.SYM 6637 GET_UST_SYM (serialize_to_text);
6639 GET_UST_SYM (ltt_probe_register);
6640 GET_UST_SYM (ltt_probe_unregister);
6641 GET_UST_SYM (ltt_marker_connect);
6642 GET_UST_SYM (ltt_marker_disconnect);
6644 GET_UST_SYM (marker_iter_start);
6645 GET_UST_SYM (marker_iter_next);
6646 GET_UST_SYM (marker_iter_stop);
6647 GET_UST_SYM (marker_iter_reset);
6657 ust_marker_to_static_tracepoint (
const struct marker *mdata)
6666 if (tpoint->
address == (uintptr_t) mdata->location)
6679 gdb_probe (
const struct marker *mdata,
void *probe_private,
6680 struct registers *regs,
void *call_private,
6681 const char *fmt, va_list *args)
6684 struct static_tracepoint_ctx ctx;
6696 ctx.regcache_initted = 0;
6704 if (ctx.regspace == NULL)
6706 trace_debug (
"Trace buffer block allocation failed, skipping");
6710 tpoint = ust_marker_to_static_tracepoint (mdata);
6714 "loc:0x%p, ch:\"%s\",n:\"%s\",f:\"%s\"",
6715 mdata->location, mdata->channel,
6716 mdata->name, mdata->format);
6726 ctx.tpoint = tpoint;
6729 "loc:0x%p, ch:\"%s\",n:\"%s\",f:\"%s\"",
6730 mdata->location, mdata->channel,
6731 mdata->name, mdata->format);
6734 if (tpoint->
cond == NULL
6770 struct static_tracepoint_ctx *umd = (
struct static_tracepoint_ctx *) ctx;
6771 unsigned char *bufspace;
6774 unsigned short blocklen;
6778 trace_debug (
"Wanted to collect static trace data, " 6779 "but there's no static trace data");
6783 va_copy (copy, *umd->args);
6784 size = USTF(serialize_to_text) (NULL, 0, umd->fmt, copy);
6791 1 + sizeof (blocklen) + size + 1);
6792 if (bufspace == NULL)
6794 trace_debug (
"Trace buffer block allocation failed, skipping");
6801 blocklen = size + 1;
6802 memcpy (bufspace + 1, &blocklen,
sizeof (blocklen));
6804 va_copy (copy, *umd->args);
6805 USTF(serialize_to_text) ((
char *) bufspace + 1 +
sizeof (blocklen),
6806 size + 1, umd->fmt, copy);
6809 trace_debug (
"Storing static tracepoint data in regblock: %s",
6810 bufspace + 1 +
sizeof (blocklen));
6814 static struct ltt_available_probe gdb_ust_probe =
6824 #ifndef IN_PROCESS_AGENT 6839 trace_debug (
"run_inferior_command: running: %s", cmd);
6854 #include <sys/socket.h> 6857 #ifndef UNIX_PATH_MAX 6858 #define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path) 6862 #define SOCK_DIR P_tmpdir 6871 init_named_socket (
const char *
name)
6874 struct sockaddr_un addr;
6876 result = fd = socket (PF_UNIX, SOCK_STREAM, 0);
6883 addr.sun_family = AF_UNIX;
6885 strncpy (addr.sun_path,
name, UNIX_PATH_MAX);
6886 addr.sun_path[UNIX_PATH_MAX - 1] =
'\0';
6892 result = unlink (
name);
6899 warning (
"socket %s already exists; overwriting",
name);
6902 result = bind (fd, (
struct sockaddr *) &addr,
sizeof (addr));
6910 result = listen (fd, 1);
6921 static char agent_socket_name[UNIX_PATH_MAX];
6924 gdb_agent_socket_init (
void)
6928 result =
xsnprintf (agent_socket_name, UNIX_PATH_MAX,
"%s/gdb_ust%d",
6929 SOCK_DIR, getpid ());
6930 if (result >= UNIX_PATH_MAX)
6932 trace_debug (
"string overflow allocating socket name");
6936 fd = init_named_socket (agent_socket_name);
6938 warning (
"Error initializing named socket (%s) for communication with the " 6939 "ust helper thread. Check that directory exists and that it " 6940 "is writable.", agent_socket_name);
6948 static const struct marker *next_st;
6955 struct marker_iter iter;
6957 USTF(marker_iter_reset) (&iter);
6958 USTF(marker_iter_start) (&iter);
6965 const struct marker *
6966 next_marker (
const struct marker *m)
6968 struct marker_iter iter;
6970 USTF(marker_iter_reset) (&iter);
6971 USTF(marker_iter_start) (&iter);
6973 for (; iter.marker != NULL; USTF(marker_iter_next) (&iter))
6975 if (iter.marker == m)
6977 USTF(marker_iter_next) (&iter);
6989 cstr_to_hexstr (
const char *str)
6991 int len = strlen (str);
6992 char *hexstr =
xmalloc (len * 2 + 1);
7001 response_ust_marker (
char *packet,
const struct marker *st)
7003 char *strid, *format, *tmp;
7005 next_st = next_marker (st);
7007 tmp =
xmalloc (strlen (st->channel) + 1 +
7008 strlen (st->name) + 1);
7009 sprintf (tmp,
"%s/%s", st->channel, st->name);
7011 strid = cstr_to_hexstr (tmp);
7014 format = cstr_to_hexstr (st->format);
7016 sprintf (packet,
"m%s:%s:%s",
7017 paddress ((uintptr_t) st->location),
7031 trace_debug (
"Returning first trace state variable definition");
7033 if (first_marker ())
7034 response_ust_marker (packet, first_marker ());
7036 strcpy (packet,
"l");
7047 response_ust_marker (packet, next_st);
7049 strcpy (packet,
"l");
7059 struct marker_iter iter;
7061 p +=
sizeof (
"unprobe_marker_at:") - 1;
7065 USTF(marker_iter_reset) (&iter);
7066 USTF(marker_iter_start) (&iter);
7067 for (; iter.marker != NULL; USTF(marker_iter_next) (&iter))
7068 if ((uintptr_t ) iter.marker->location == address)
7072 result = USTF(ltt_marker_disconnect) (iter.marker->channel,
7076 warning (
"could not disable marker %s/%s",
7077 iter.marker->channel, iter.marker->name);
7089 struct marker_iter iter;
7092 p +=
sizeof (
"probe_marker_at:") - 1;
7096 USTF(marker_iter_reset) (&iter);
7098 for (USTF(marker_iter_start) (&iter), m = iter.marker;
7100 USTF(marker_iter_next) (&iter), m = iter.marker)
7101 if ((uintptr_t ) m->location == address)
7106 "ltt_marker_connect (marker = %s/%s)",
7107 m->channel, m->name);
7109 result = USTF(ltt_marker_connect) (m->channel, m->name,
7111 if (result && result != -EEXIST)
7112 trace_debug (
"ltt_marker_connect (marker = %s/%s, errno = %d)",
7113 m->channel, m->name, -result);
7117 sprintf (packet,
"E.could not connect marker: channel=%s, name=%s",
7118 m->channel, m->name);
7122 strcpy (packet,
"OK");
7126 sprintf (packet,
"E.no marker found at 0x%s",
paddress (address));
7135 struct marker_iter iter;
7138 p +=
sizeof (
"qTSTMat:") - 1;
7142 USTF(marker_iter_reset) (&iter);
7144 for (USTF(marker_iter_start) (&iter), m = iter.marker;
7146 USTF(marker_iter_next) (&iter), m = iter.marker)
7147 if ((uintptr_t ) m->location == address)
7149 response_ust_marker (packet, m);
7153 strcpy (packet,
"l");
7163 USTF(ltt_probe_register) (&gdb_ust_probe);
7168 #include <sys/syscall.h> 7171 gdb_agent_remove_socket (
void)
7173 unlink (agent_socket_name);
7179 gdb_agent_helper_thread (
void *arg)
7183 atexit (gdb_agent_remove_socket);
7187 listen_fd = gdb_agent_socket_init ();
7192 if (listen_fd == -1)
7194 warning (
"could not create sync socket\n");
7201 struct sockaddr_un sockaddr;
7207 tmp =
sizeof (sockaddr);
7211 fd = accept (listen_fd, (
struct sockaddr *) &sockaddr, &tmp);
7214 while (fd == -512 || (fd == -1 &&
errno == EINTR));
7218 warning (
"Accept returned %d, error: %s\n",
7225 ret = read (fd, buf, 1);
7226 }
while (ret == -1 &&
errno == EINTR);
7230 warning (
"reading socket (fd=%d) failed with %s",
7243 else if (strcmp (
"qTfSTM", cmd_buf) == 0)
7247 else if (strcmp (
"qTsSTM", cmd_buf) == 0)
7251 else if (
startswith (cmd_buf,
"unprobe_marker_at:"))
7255 else if (
startswith (cmd_buf,
"probe_marker_at:"))
7267 ret = write (fd, buf, 1);
7273 unlink (agent_socket_name);
7290 #include <pthread.h> 7297 gdb_agent_init (
void)
7307 sigfillset (&new_mask);
7308 res = pthread_sigmask (SIG_SETMASK, &new_mask, &orig_mask);
7312 res = pthread_create (&thread,
7314 gdb_agent_helper_thread,
7317 res = pthread_sigmask (SIG_SETMASK, &orig_mask, NULL);
7329 #include <sys/mman.h> 7346 gdb_trampoline_buffer = (
char *) (uintptr_t) begin;
7347 gdb_trampoline_buffer_end = (
char *) (uintptr_t) end;
7349 strncpy (gdb_trampoline_buffer_error, errmsg, 99);
7351 strcpy (gdb_trampoline_buffer_error,
"no buffer passed");
7355 initialize_tracepoint_ftlib (
void)
7362 #ifndef HAVE_GETAUXVAL 7367 getauxval (
unsigned long type)
7369 unsigned long data[2];
7370 FILE *f = fopen (
"/proc/self/auxv",
"r");
7371 unsigned long value = 0;
7376 while (fread (data,
sizeof (data), 1, f) > 0)
7378 if (data[0] == type)
7401 steady_clock::time_point now = steady_clock::now ();
7402 return duration_cast<microseconds> (now.time_since_epoch ()).count ();
7419 #ifdef IN_PROCESS_AGENT 7422 size_t jump_pad_size;
7424 pagesize = sysconf (_SC_PAGE_SIZE);
7428 #define SCRATCH_BUFFER_NPAGES 20 7430 jump_pad_size = pagesize * SCRATCH_BUFFER_NPAGES;
7432 gdb_tp_heap_buffer = (
char *)
xmalloc (5 * 1024 * 1024);
7434 if (gdb_jump_pad_buffer == NULL)
7436 gdb_jump_pad_buffer_end = gdb_jump_pad_buffer + jump_pad_size;
7439 gdb_trampoline_buffer = gdb_trampoline_buffer_end = 0;
7447 strcpy (gdb_trampoline_buffer_error,
"No errors reported");
static CORE_ADDR get_jump_space_head(void)
const struct target_desc * tdesc
int handle_tracepoint_query(char *packet)
#define IPA_PROTO_FAST_TRACE_FJUMP_INSN
LONGEST agent_get_trace_state_variable_value(int num)
CORE_ADDR get_set_tsv_func_addr(void)
static struct source_string * cur_source_string
static int tracing_stop_tpnum
static int tracepoint_handler(CORE_ADDR address)
struct thread_info * current_thread
struct regcache * regcache
static void cmd_qtminftpilen(char *packet)
struct source_string * source_strings
static void cmd_qtfstm(char *packet)
#define IP_AGENT_EXPORT_FUNC
static struct tracepoint * fast_tracepoint_from_ipa_tpoint_address(CORE_ADDR)
static struct trace_state_variable * create_trace_state_variable(int num, int gdb)
CORE_ADDR addr_gdb_jump_pad_buffer_end
IP_AGENT_EXPORT_VAR unsigned int traceframe_write_count
static void xfree(T *ptr)
CORE_ADDR addr_tracepoints
static unsigned char * traceframe_find_block_type(unsigned char *database, unsigned int datasize, int tfnum, char type_wanted)
int fetch_traceframe_registers(int tfnum, struct regcache *regcache, int regnum)
#define target_get_min_fast_tracepoint_insn_len()
static struct traceframe * find_next_traceframe_by_tracepoint(int num, int *tfnump)
EXTERN_C_PUSH IP_AGENT_EXPORT_VAR struct tracepoint * tracepoints
static void cmd_qtframe(char *own_buf)
struct collecting_t collecting_t
int agent_look_up_symbols(void *arg)
IP_AGENT_EXPORT_VAR unsigned int traceframe_read_count
static void write_e_ust_not_loaded(char *buffer)
#define target_emit_ops()
#define IPA_FIRST_TRACEFRAME()
int ptid_get_pid(const ptid_t &ptid)
static int traceframe_read_tsv(int num, LONGEST *val)
static struct trace_state_variable * get_trace_state_variable(int num)
#define cmpxchg(mem, oldval, newval)
static struct readonly_region * readonly_regions
static const struct aarch64_register sp
#define unpause_all(unfreeze)
static void cmd_qtv(char *own_buf)
CORE_ADDR regcache_read_pc(struct regcache *regcache)
struct trace_state_variable * next
void warning(const char *fmt,...)
CORE_ADDR addr_get_trace_state_variable_value_ptr
CORE_ADDR addr_traceframe_write_count
static CORE_ADDR get_traceframe_address(struct traceframe *tframe)
static void cmd_qtnotes(char *own_buf)
CORE_ADDR addr_trace_buffer_is_full
static int read_inferior_data_pointer(CORE_ADDR symaddr, CORE_ADDR *val)
struct agent_expr * gdb_parse_agent_expr(const char **actparm)
static unsigned int cur_action
static struct tracepoint * fast_tracepoint_from_trampoline_address(CORE_ADDR pc)
struct tracepoint_action base
static void cmd_qtdisconnected(char *own_buf)
char * plongest(LONGEST l)
int bin2hex(const gdb_byte *bin, char *hex, int count)
static unsigned char * traceframe_find_regblock(struct traceframe *tframe, int tfnum)
static void write_e_ipa_not_loaded(char *buffer)
static CORE_ADDR target_tp_heap
CORE_ADDR addr_trace_buffer_hi
#define IP_AGENT_EXPORT_VAR
CORE_ADDR adjusted_insn_addr_end
void initialize_tracepoint(void)
void * memset(T *s, int c, size_t n)=delete
void internal_error(const char *file, int line, const char *fmt,...)
IP_AGENT_EXPORT_FUNC LONGEST get_trace_state_variable_value(int num)
static void cmd_qtsv(char *packet)
int agent_mem_read(struct eval_agent_expr_context *ctx, unsigned char *to, CORE_ADDR from, ULONGEST len)
enum eval_result_type compile_bytecodes(struct agent_expr *aexpr)
CORE_ADDR adjusted_insn_addr
static void record_tracepoint_error(struct tracepoint *tpoint, const char *which, enum eval_result_type rtype)
static void do_action_at_tracepoint(struct tracepoint_hit_ctx *ctx, CORE_ADDR stop_pc, struct tracepoint *tpoint, struct traceframe *tframe, struct tracepoint_action *taction)
static void cmd_qtsp(char *packet)
#define DEFAULT_TRACE_BUFFER_SIZE
char * paddress(CORE_ADDR addr)
struct thread_info * find_any_thread_of_pid(int pid)
CORE_ADDR addr_traceframe_read_count
struct tracepoint_action base
#define NEXT_TRACEFRAME(TF)
static void clear_trace_buffer(void)
#define trace_buffer_end_free
struct wstep_state * while_stepping
static void init_trace_buffer(LONGEST bufsize)
void agent_set_trace_state_variable_value(int num, LONGEST val)
struct readonly_region * next
static void clear_readonly_regions(void)
IP_AGENT_EXPORT_VAR struct tracepoint * stopping_tracepoint
static int tracepoint_send_agent(struct tracepoint *tpoint)
static char * agent_expr_send(char *p, const struct agent_expr *aexpr)
static char * m_tracepoint_action_send(char *buffer, const struct tracepoint_action *action)
void uninsert_all_breakpoints(void)
void regcache_write_pc(struct regcache *regcache, CORE_ADDR pc)
static char * x_tracepoint_action_send(char *buffer, const struct tracepoint_action *action)
void reinsert_all_breakpoints(void)
#define GDBSERVER_UPDATED_FLUSH_COUNT_BIT
static int circular_trace_buffer
#define COPY_FIELD_TO_BUF(BUF, OBJ, FIELD)
#define IPA_PROTO_FAST_TRACE_FJUMP_SIZE
int tracepoint_was_hit(struct thread_info *tinfo, CORE_ADDR stop_pc)
static int write_inferior_data_pointer(CORE_ADDR symaddr, CORE_ADDR val)
int agent_run_command(int pid, const char *cmd, int len)
static int probe_marker_at(CORE_ADDR address, char *errout)
CORE_ADDR addr_ust_loaded
struct tracepoint_action base
fast_tpoint_collect_result fast_tracepoint_collecting(CORE_ADDR thread_area, CORE_ADDR stop_pc, struct fast_tpoint_collect_status *status)
static void download_tracepoint_1(struct tracepoint *tpoint)
int agent_tsv_read(struct eval_agent_expr_context *ctx, int n)
CORE_ADDR addr_stopping_tracepoint
int handle_tracepoint_bkpts(struct thread_info *tinfo, CORE_ADDR stop_pc)
static struct tracepoint * find_next_tracepoint_by_number(struct tracepoint *prev_tp, int num)
CORE_ADDR addr_get_raw_reg_ptr
static CORE_ADDR gdb_jump_pad_head
int agent_mem_read_string(struct eval_agent_expr_context *ctx, unsigned char *to, CORE_ADDR from, ULONGEST len)
CORE_ADDR addr_set_trace_state_variable_value_ptr
static void claim_jump_space(ULONGEST used)
#define trace_buffer_start
static int match_blocktype(char blocktype, unsigned char *dataptr, void *data)
CORE_ADDR addr_gdb_trampoline_buffer_end
static CORE_ADDR trampoline_buffer_tail
void release_while_stepping_state_list(struct thread_info *tinfo)
static LONGEST get_timestamp(void)
struct tracepoint_hit_ctx base
static int write_inferior_integer(CORE_ADDR symaddr, int val)
static void finish_traceframe(struct traceframe *tframe)
void buffer_xml_printf(struct buffer *buffer, const char *format,...)
CORE_ADDR current_insn_ptr
IP_AGENT_EXPORT_FUNC void set_trace_state_variable_value(int num, LONGEST val)
static void * trace_buffer_alloc(size_t amt)
static int maybe_write_ipa_ust_not_loaded(char *buffer)
CORE_ADDR addr_gdb_tp_heap_buffer
int in_readonly_region(CORE_ADDR addr, ULONGEST length)
static int write_inferior_int8(CORE_ADDR symaddr, int8_t val)
fast_tpoint_collect_result
static void collect_data_at_tracepoint(struct tracepoint_hit_ctx *ctx, CORE_ADDR stop_pc, struct tracepoint *tpoint)
IP_AGENT_EXPORT_VAR int traceframes_created
CORE_ADDR addr_trace_buffer_ctrl
static uint32_t helper_thread_id
struct callback_event * last
#define target_get_ipa_tdesc_idx()
int read_inferior_memory(CORE_ADDR memaddr, unsigned char *myaddr, int len)
static void clear_inferior_trace_buffer(void)
CORE_ADDR addr_gdb_jump_pad_buffer
static void set_trace_state_variable_name(int num, const char *name)
void * alloc_jump_pad_buffer(size_t size)
static void cmd_qtfv(char *packet)
static int flush_trace_buffer_handler(CORE_ADDR)
struct tracepoint * tpoint
static void cmd_qtdpsrc(char *own_buf)
int handle_tracepoint_general_set(char *packet)
char * pulongest(ULONGEST u)
static unsigned int cur_step_action
int look_up_one_symbol(const char *name, CORE_ADDR *addrp, int may_ask_gdb)
CORE_ADDR addr_gdb_collect_ptr
static void add_tracepoint_action(struct tracepoint *tpoint, const char *packet)
static CORE_ADDR trampoline_buffer_head
CORE_ADDR addr_expr_eval_result
EXTERN_C_PUSH IP_AGENT_EXPORT_VAR struct tracepoint * error_tracepoint
ULONGEST get_raw_reg(const unsigned char *raw_regs, int regnum)
static EXTERN_C_POP struct tracepoint * last_tracepoint
void tracepoint_look_up_symbols(void)
static void response_action(char *packet, struct tracepoint *tpoint, char *taction, int step)
int traceframe_read_info(int tfnum, struct buffer *buffer)
static int condition_true_at_tracepoint(struct tracepoint_hit_ctx *ctx, struct tracepoint *tpoint)
static int free_space(void)
void regcache_cpy(struct regcache *dst, struct regcache *src)
static void clone_fast_tracepoint(struct tracepoint *to, const struct tracepoint *from)
struct source_string * next
static CORE_ADDR download_agent_expr(struct agent_expr *expr)
static void cmd_qtsstm(char *packet)
static void compile_tracepoint_condition(struct tracepoint *tpoint, CORE_ADDR *jump_entry)
static int startswith(const char *string, const char *pattern)
int register_cache_size(const struct target_desc *tdesc)
struct trace_buffer_control trace_buffer_ctrl[1]
enum eval_result_type gdb_eval_agent_expr(struct eval_agent_expr_context *ctx, struct agent_expr *aexpr, ULONGEST *rslt)
#define GDBSERVER_FLUSH_COUNT_MASK_PREV
long __attribute__((__aligned__(4)))
static void cmd_qtstatus(char *packet)
static void cmd_qtro(char *own_buf)
CORE_ADDR obj_addr_on_target
static struct tracepoint * fast_tracepoint_from_jump_pad_address(CORE_ADDR pc)
CORE_ADDR addr_gdb_trampoline_buffer_error
static void set_trace_state_variable_getter(int num, LONGEST(*getter)(void))
static void release_while_stepping_state(struct wstep_state *wstep)
static int maybe_write_ipa_not_loaded(char *buffer)
static CORE_ADDR tracepoint_action_download(const struct tracepoint_action *action)
CORE_ADDR addr_traceframes_created
static struct tracepoint * find_tracepoint(int id, CORE_ADDR addr)
struct breakpoint * flush_trace_buffer_bkpt
IP_AGENT_EXPORT_VAR int expr_eval_result
static struct tracepoint * cur_tpoint
struct tracepoint_action ** actions
struct traceframe * tframe
static void cmd_qtstop(char *packet)
struct breakpoint * stop_tracing_bkpt
#define GDBSERVER_FLUSH_COUNT_MASK
static void cmd_qtinit(char *packet)
#define TRACEFRAME_EOB_MARKER_SIZE
#define buffer_grow_str(BUFFER, STRING)
struct tracepoint_action base
#define XRESIZEVEC(T, P, N)
static LONGEST trace_buffer_size
static void remove_tracepoint(struct tracepoint *tpoint)
static CORE_ADDR target_malloc(ULONGEST size)
struct fast_tracepoint_jump * set_fast_tracepoint_jump(CORE_ADDR where, unsigned char *insn, ULONGEST length)
static void cmd_qtbuffer(char *own_buf)
int have_fast_tracepoint_trampoline_buffer(char *buf)
int agent_capability_check(enum agent_capa agent_capa)
static void cmd_qtstmat(char *packet)
static void clear_installed_tracepoints(void)
static int seen_step_action_flag
static unsigned char * traceframe_walk_blocks(unsigned char *database, unsigned int datasize, int tfnum, int(*callback)(char blocktype, unsigned char *dataptr, void *data), void *data)
#define stabilize_threads()
int write_inferior_memory(CORE_ADDR memaddr, const unsigned char *myaddr, int len)
LONGEST tracing_start_time
PTR xrealloc(PTR ptr, size_t size)
static struct traceframe * find_traceframe(int num)
static struct traceframe * find_next_traceframe_in_range(CORE_ADDR lo, CORE_ADDR hi, int inside_p, int *tfnump)
IP_AGENT_EXPORT_VAR int trace_buffer_is_full
CORE_ADDR addr_ipa_tdesc_idx
static CORE_ADDR x_tracepoint_action_download(const struct tracepoint_action *action)
struct regcache * init_register_cache(struct regcache *regcache, const struct target_desc *tdesc, unsigned char *regbuf)
static const char * tracing_stop_reason
#define buffer_grow_str0(BUFFER, STRING)
static const char * eval_result_names[]
enum eval_result_type(* condfn)(unsigned char *, ULONGEST *)
static struct @7 symbol_list[]
CORE_ADDR addr_gdb_trampoline_buffer
CORE_ADDR addr_trace_buffer_lo
#define trace_buffer_free
char * phex_nz(ULONGEST l, int sizeof_l)
int claim_trampoline_space(ULONGEST used, CORE_ADDR *trampoline)
#define pause_all(freeze)
static void cmd_qtdv(char *own_buf)
void force_unlock_trace_buffer(void)
static void cmd_qtenable_disable(char *own_buf, int enable)
uint64_t traceframe_usage
struct wstep_state * next
const struct target_desc * current_target_desc(void)
int tracepoint_finished_step(struct thread_info *tinfo, CORE_ADDR stop_pc)
void initialize_low_tracepoint(void)
int xsnprintf(char *str, size_t size, const char *format,...)
CORE_ADDR addr_flush_trace_buffer
static void cmd_bigqtbuffer_size(char *own_buf)
static CORE_ADDR l_tracepoint_action_download(const struct tracepoint_action *action)
CORE_ADDR get_raw_reg_func_addr(void)
int prepare_to_access_memory(void)
const char * target_pid_to_str(ptid_t ptid)
static void cmd_qtp(char *own_buf)
static void response_source(char *packet, struct tracepoint *tpoint, struct source_string *src)
static int read_inferior_uinteger(CORE_ADDR symaddr, unsigned int *val)
static struct regcache * get_context_regcache(struct tracepoint_hit_ctx *ctx)
static void install_tracepoint(struct tracepoint *, char *own_buf)
static void cmd_qtstart(char *packet)
static int read_inferior_integer(CORE_ADDR symaddr, int *val)
static struct tracepoint * add_tracepoint(int num, CORE_ADDR addr)
struct regcache * get_thread_regcache(struct thread_info *thread, int fetch)
static void response_tsv(char *packet, struct trace_state_variable *tsv)
CORE_ADDR adjusted_insn_addr
IP_AGENT_EXPORT_VAR int tracing
static void response_tracepoint(char *packet, struct tracepoint *tpoint)
void perror_with_name(const char *string)
static unsigned char * add_traceframe_block(struct traceframe *tframe, struct tracepoint *tpoint, int amt)
static int build_traceframe_info_xml(char blocktype, unsigned char *dataptr, void *data)
int delete_fast_tracepoint_jump(struct fast_tracepoint_jump *todel)
static void unprobe_marker_at(CORE_ADDR address)
struct tracepoint_action ** step_actions
static void cmd_bigqtbuffer_circular(char *own_buf)
static CORE_ADDR traceframe_get_pc(struct traceframe *tframe)
CORE_ADDR addr_about_to_request_buffer_space
#define trace_debug(FMT, args...)
IP_AGENT_EXPORT_VAR unsigned char * trace_buffer_hi
unsigned long long ULONGEST
static void download_trace_state_variables(void)
struct callback_event * next
char * gdb_unparse_agent_expr(struct agent_expr *aexpr)
EXTERN_C_PUSH IP_AGENT_EXPORT_VAR unsigned char * trace_buffer_lo
char * savestring(const char *ptr, size_t len)
CORE_ADDR adjusted_insn_addr_end
static struct traceframe * add_traceframe(struct tracepoint *tpoint)
struct breakpoint * set_breakpoint_at(CORE_ADDR where, int(*handler)(CORE_ADDR))
IP_AGENT_EXPORT_VAR struct trace_state_variable * trace_state_variables
void inc_ref_fast_tracepoint_jump(struct fast_tracepoint_jump *jp)
static int install_fast_tracepoint(struct tracepoint *, char *errbuf)
int hex2bin(const char *hex, gdb_byte *bin, int count)
#define IPA_PROTO_FAST_TRACE_ADDR_ON_TARGET
#define trace_buffer_wrap
#define GDBSERVER_FLUSH_COUNT_MASK_CURR
CORE_ADDR get_get_tsv_func_addr(void)
const char * unpack_varlen_hex(const char *buff, ULONGEST *result)
static int write_inferior_uinteger(CORE_ADDR symaddr, unsigned int val)
static char * r_tracepoint_action_send(char *buffer, const struct tracepoint_action *action)
#define IPA_PROTO_FAST_TRACE_JUMP_PAD
void gdb_agent_about_to_close(int pid)
static void cmd_qtdp(char *own_buf)
void debug_printf(const char *fmt,...)
static void collect_data_at_step(struct tracepoint_hit_ctx *ctx, CORE_ADDR stop_pc, struct tracepoint *tpoint, int current_step)
CORE_ADDR addr_stop_tracing
enum tracepoint_type type
#define IPA_NEXT_TRACEFRAME(TF, TFOBJ)
CORE_ADDR addr_error_tracepoint
int traceframe_read_sdata(int tfnum, ULONGEST offset, unsigned char *buf, ULONGEST length, ULONGEST *nbytes)
static void download_tracepoint(struct tracepoint *)
const struct target_desc * get_ipa_tdesc(int idx)
static void add_while_stepping_state(struct thread_info *tinfo, int tp_number, CORE_ADDR tp_address)
static void cmd_qtfp(char *packet)
static int run_inferior_command(char *cmd, int len)
static struct trace_state_variable * cur_tsv
static char * tracepoint_action_send(char *buffer, const struct tracepoint_action *action)
static char * l_tracepoint_action_send(char *buffer, const struct tracepoint_action *action)
void supply_fast_tracepoint_registers(struct regcache *regcache, const unsigned char *buf)
static CORE_ADDR m_tracepoint_action_download(const struct tracepoint_action *action)
struct regcache * regcache
static void upload_fast_traceframes(void)
static int stop_tracing_handler(CORE_ADDR)
CORE_ADDR addr_trace_buffer_ctrl_curr
void error(const char *fmt,...)
int delete_breakpoint(struct breakpoint *todel)
#define install_fast_tracepoint_jump_pad(tpoint, tpaddr, collector, lockaddr, orig_size, jump_entry, trampoline, trampoline_size, jjump_pad_insn, jjump_pad_insn_size, adjusted_insn_addr, adjusted_insn_addr_end, err)
int traceframe_read_mem(int tfnum, CORE_ADDR addr, unsigned char *buf, ULONGEST length, ULONGEST *nbytes)
static struct ipa_sym_addresses ipa_sym_addrs
static CORE_ADDR r_tracepoint_action_download(const struct tracepoint_action *action)
void done_accessing_memory(void)
CORE_ADDR addr_collecting
void write_enn(char *buf)
void supply_regblock(struct regcache *regcache, const void *buf)
enum tracepoint_type type
#define FIRST_TRACEFRAME()
static int in_process_agent_supports_ust(void)
LONGEST tracing_stop_time
CORE_ADDR addr_trace_state_variables