1 /* Tracing functionality for remote targets in custom GDB protocol
3 Copyright (C) 1997-2018 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "arch-utils.h"
25 #include "expression.h"
29 #include "target-dcache.h"
32 #include "breakpoint.h"
33 #include "tracepoint.h"
36 #include "completer.h"
38 #include "dictionary.h"
40 #include "user-regs.h"
44 #include "filenames.h"
45 #include "gdbthread.h"
52 #include "cli/cli-utils.h"
55 #include "filestuff.h"
57 #include "tracefile.h"
61 /* readline include files */
62 #include "readline/readline.h"
63 #include "readline/history.h"
65 /* readline defines this. */
70 /* Maximum length of an agent aexpression.
71 This accounts for the fact that packets are limited to 400 bytes
72 (which includes everything -- including the checksum), and assumes
73 the worst case of maximum length for each of the pieces of a
76 NOTE: expressions get mem2hex'ed otherwise this would be twice as
77 large. (400 - 31)/2 == 184 */
78 #define MAX_AGENT_EXPR_LEN 184
80 /* A hook used to notify the UI of tracepoint operations. */
82 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
83 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
88 This module defines the following debugger commands:
89 trace : set a tracepoint on a function, line, or address.
90 info trace : list all debugger-defined tracepoints.
91 delete trace : delete one or more tracepoints.
92 enable trace : enable one or more tracepoints.
93 disable trace : disable one or more tracepoints.
94 actions : specify actions to be taken at a tracepoint.
95 passcount : specify a pass count for a tracepoint.
96 tstart : start a trace experiment.
97 tstop : stop a trace experiment.
98 tstatus : query the status of a trace experiment.
99 tfind : find a trace frame in the trace buffer.
100 tdump : print everything collected at the current tracepoint.
101 save-tracepoints : write tracepoint setup into a file.
103 This module defines the following user-visible debugger variables:
104 $trace_frame : sequence number of trace frame currently being debugged.
105 $trace_line : source line of trace frame currently being debugged.
106 $trace_file : source file of trace frame currently being debugged.
107 $tracepoint : tracepoint number of trace frame currently being debugged.
111 /* ======= Important global variables: ======= */
113 /* The list of all trace state variables. We don't retain pointers to
114 any of these for any reason - API is by name or number only - so it
115 works to have a vector of objects. */
117 typedef struct trace_state_variable tsv_s;
120 static VEC(tsv_s) *tvariables;
122 /* The next integer to assign to a variable. */
124 static int next_tsv_number = 1;
126 /* Number of last traceframe collected. */
127 static int traceframe_number;
129 /* Tracepoint for last traceframe collected. */
130 static int tracepoint_number;
132 /* The traceframe info of the current traceframe. NULL if we haven't
133 yet attempted to fetch it, or if the target does not support
134 fetching this object, or if we're not inspecting a traceframe
136 static traceframe_info_up current_traceframe_info;
138 /* Tracing command lists. */
139 static struct cmd_list_element *tfindlist;
141 /* List of expressions to collect by default at each tracepoint hit. */
142 char *default_collect;
144 static int disconnected_tracing;
146 /* This variable controls whether we ask the target for a linear or
147 circular trace buffer. */
149 static int circular_trace_buffer;
151 /* This variable is the requested trace buffer size, or -1 to indicate
152 that we don't care and leave it up to the target to set a size. */
154 static int trace_buffer_size = -1;
156 /* Textual notes applying to the current and/or future trace runs. */
158 char *trace_user = NULL;
160 /* Textual notes applying to the current and/or future trace runs. */
162 char *trace_notes = NULL;
164 /* Textual notes applying to the stopping of a trace. */
166 char *trace_stop_notes = NULL;
168 /* support routines */
170 struct collection_list;
171 static char *mem2hex (gdb_byte *, char *, int);
173 static struct command_line *
174 all_tracepoint_actions_and_cleanup (struct breakpoint *t);
176 static struct trace_status trace_status;
178 const char *stop_reason_names[] = {
188 struct trace_status *
189 current_trace_status (void)
191 return &trace_status;
194 /* Free and clear the traceframe info cache of the current
198 clear_traceframe_info (void)
200 current_traceframe_info = NULL;
203 /* Set traceframe number to NUM. */
205 set_traceframe_num (int num)
207 traceframe_number = num;
208 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
211 /* Set tracepoint number to NUM. */
213 set_tracepoint_num (int num)
215 tracepoint_number = num;
216 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
219 /* Set externally visible debug variables for querying/printing
220 the traceframe context (line, function, file). */
223 set_traceframe_context (struct frame_info *trace_frame)
226 struct symbol *traceframe_fun;
227 symtab_and_line traceframe_sal;
229 /* Save as globals for internal use. */
230 if (trace_frame != NULL
231 && get_frame_pc_if_available (trace_frame, &trace_pc))
233 traceframe_sal = find_pc_line (trace_pc, 0);
234 traceframe_fun = find_pc_function (trace_pc);
236 /* Save linenumber as "$trace_line", a debugger variable visible to
238 set_internalvar_integer (lookup_internalvar ("trace_line"),
239 traceframe_sal.line);
243 traceframe_fun = NULL;
244 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
247 /* Save func name as "$trace_func", a debugger variable visible to
249 if (traceframe_fun == NULL
250 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
251 clear_internalvar (lookup_internalvar ("trace_func"));
253 set_internalvar_string (lookup_internalvar ("trace_func"),
254 SYMBOL_LINKAGE_NAME (traceframe_fun));
256 /* Save file name as "$trace_file", a debugger variable visible to
258 if (traceframe_sal.symtab == NULL)
259 clear_internalvar (lookup_internalvar ("trace_file"));
261 set_internalvar_string (lookup_internalvar ("trace_file"),
262 symtab_to_filename_for_display (traceframe_sal.symtab));
265 /* Create a new trace state variable with the given name. */
267 struct trace_state_variable *
268 create_trace_state_variable (const char *name)
270 struct trace_state_variable tsv;
272 memset (&tsv, 0, sizeof (tsv));
273 tsv.name = xstrdup (name);
274 tsv.number = next_tsv_number++;
275 return VEC_safe_push (tsv_s, tvariables, &tsv);
278 /* Look for a trace state variable of the given name. */
280 struct trace_state_variable *
281 find_trace_state_variable (const char *name)
283 struct trace_state_variable *tsv;
286 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
287 if (strcmp (name, tsv->name) == 0)
293 /* Look for a trace state variable of the given number. Return NULL if
296 struct trace_state_variable *
297 find_trace_state_variable_by_number (int number)
299 struct trace_state_variable *tsv;
302 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
303 if (tsv->number == number)
310 delete_trace_state_variable (const char *name)
312 struct trace_state_variable *tsv;
315 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
316 if (strcmp (name, tsv->name) == 0)
318 observer_notify_tsv_deleted (tsv);
320 xfree ((void *)tsv->name);
321 VEC_unordered_remove (tsv_s, tvariables, ix);
326 warning (_("No trace variable named \"$%s\", not deleting"), name);
329 /* Throws an error if NAME is not valid syntax for a trace state
333 validate_trace_state_variable_name (const char *name)
338 error (_("Must supply a non-empty variable name"));
340 /* All digits in the name is reserved for value history
342 for (p = name; isdigit (*p); p++)
345 error (_("$%s is not a valid trace state variable name"), name);
347 for (p = name; isalnum (*p) || *p == '_'; p++)
350 error (_("$%s is not a valid trace state variable name"), name);
353 /* The 'tvariable' command collects a name and optional expression to
354 evaluate into an initial value. */
357 trace_variable_command (const char *args, int from_tty)
360 struct trace_state_variable *tsv;
361 const char *name_start, *p;
364 error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
366 /* Only allow two syntaxes; "$name" and "$name=value". */
367 p = skip_spaces (args);
370 error (_("Name of trace variable should start with '$'"));
373 while (isalnum (*p) || *p == '_')
375 std::string name (name_start, p - name_start);
378 if (*p != '=' && *p != '\0')
379 error (_("Syntax must be $NAME [ = EXPR ]"));
381 validate_trace_state_variable_name (name.c_str ());
384 initval = value_as_long (parse_and_eval (++p));
386 /* If the variable already exists, just change its initial value. */
387 tsv = find_trace_state_variable (name.c_str ());
390 if (tsv->initial_value != initval)
392 tsv->initial_value = initval;
393 observer_notify_tsv_modified (tsv);
395 printf_filtered (_("Trace state variable $%s "
396 "now has initial value %s.\n"),
397 tsv->name, plongest (tsv->initial_value));
401 /* Create a new variable. */
402 tsv = create_trace_state_variable (name.c_str ());
403 tsv->initial_value = initval;
405 observer_notify_tsv_created (tsv);
407 printf_filtered (_("Trace state variable $%s "
408 "created, with initial value %s.\n"),
409 tsv->name, plongest (tsv->initial_value));
413 delete_trace_variable_command (const char *args, int from_tty)
417 if (query (_("Delete all trace state variables? ")))
418 VEC_free (tsv_s, tvariables);
420 observer_notify_tsv_deleted (NULL);
424 gdb_argv argv (args);
426 for (char *arg : argv)
429 delete_trace_state_variable (arg + 1);
431 warning (_("Name \"%s\" not prefixed with '$', ignoring"), arg);
438 tvariables_info_1 (void)
440 struct trace_state_variable *tsv;
443 struct ui_out *uiout = current_uiout;
445 if (VEC_length (tsv_s, tvariables) == 0 && !uiout->is_mi_like_p ())
447 printf_filtered (_("No trace state variables.\n"));
451 /* Try to acquire values from the target. */
452 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
453 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
456 ui_out_emit_table table_emitter (uiout, 3, count, "trace-variables");
457 uiout->table_header (15, ui_left, "name", "Name");
458 uiout->table_header (11, ui_left, "initial", "Initial");
459 uiout->table_header (11, ui_left, "current", "Current");
461 uiout->table_body ();
463 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
467 ui_out_emit_tuple tuple_emitter (uiout, "variable");
469 std::string name = std::string ("$") + tsv->name;
470 uiout->field_string ("name", name.c_str ());
471 uiout->field_string ("initial", plongest (tsv->initial_value));
473 if (tsv->value_known)
474 c = plongest (tsv->value);
475 else if (uiout->is_mi_like_p ())
476 /* For MI, we prefer not to use magic string constants, but rather
477 omit the field completely. The difference between unknown and
478 undefined does not seem important enough to represent. */
480 else if (current_trace_status ()->running || traceframe_number >= 0)
481 /* The value is/was defined, but we don't have it. */
484 /* It is not meaningful to ask about the value. */
487 uiout->field_string ("current", c);
492 /* List all the trace state variables. */
495 info_tvariables_command (const char *args, int from_tty)
497 tvariables_info_1 ();
500 /* Stash definitions of tsvs into the given file. */
503 save_trace_state_variables (struct ui_file *fp)
505 struct trace_state_variable *tsv;
508 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
510 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
511 if (tsv->initial_value)
512 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
513 fprintf_unfiltered (fp, "\n");
517 /* ACTIONS functions: */
519 /* The three functions:
520 collect_pseudocommand,
521 while_stepping_pseudocommand, and
522 end_actions_pseudocommand
523 are placeholders for "commands" that are actually ONLY to be used
524 within a tracepoint action list. If the actual function is ever called,
525 it means that somebody issued the "command" at the top level,
526 which is always an error. */
529 end_actions_pseudocommand (const char *args, int from_tty)
531 error (_("This command cannot be used at the top level."));
535 while_stepping_pseudocommand (const char *args, int from_tty)
537 error (_("This command can only be used in a tracepoint actions list."));
541 collect_pseudocommand (const char *args, int from_tty)
543 error (_("This command can only be used in a tracepoint actions list."));
547 teval_pseudocommand (const char *args, int from_tty)
549 error (_("This command can only be used in a tracepoint actions list."));
552 /* Parse any collection options, such as /s for strings. */
555 decode_agent_options (const char *exp, int *trace_string)
557 struct value_print_options opts;
564 /* Call this to borrow the print elements default for collection
566 get_user_print_options (&opts);
571 if (target_supports_string_tracing ())
573 /* Allow an optional decimal number giving an explicit maximum
574 string length, defaulting it to the "print elements" value;
575 so "collect/s80 mystr" gets at most 80 bytes of string. */
576 *trace_string = opts.print_max;
578 if (*exp >= '0' && *exp <= '9')
579 *trace_string = atoi (exp);
580 while (*exp >= '0' && *exp <= '9')
584 error (_("Target does not support \"/s\" option for string tracing."));
587 error (_("Undefined collection format \"%c\"."), *exp);
589 exp = skip_spaces (exp);
594 /* Enter a list of actions for a tracepoint. */
596 actions_command (const char *args, int from_tty)
598 struct tracepoint *t;
600 t = get_tracepoint_by_number (&args, NULL);
604 string_printf ("Enter actions for tracepoint %d, one per line.",
607 command_line_up l = read_command_lines (&tmpbuf[0], from_tty, 1,
608 check_tracepoint_command, t);
609 breakpoint_set_commands (t, std::move (l));
611 /* else just return */
614 /* Report the results of checking the agent expression, as errors or
618 report_agent_reqs_errors (struct agent_expr *aexpr)
620 /* All of the "flaws" are serious bytecode generation issues that
621 should never occur. */
622 if (aexpr->flaw != agent_flaw_none)
623 internal_error (__FILE__, __LINE__, _("expression is malformed"));
625 /* If analysis shows a stack underflow, GDB must have done something
626 badly wrong in its bytecode generation. */
627 if (aexpr->min_height < 0)
628 internal_error (__FILE__, __LINE__,
629 _("expression has min height < 0"));
631 /* Issue this error if the stack is predicted to get too deep. The
632 limit is rather arbitrary; a better scheme might be for the
633 target to report how much stack it will have available. The
634 depth roughly corresponds to parenthesization, so a limit of 20
635 amounts to 20 levels of expression nesting, which is actually
636 a pretty big hairy expression. */
637 if (aexpr->max_height > 20)
638 error (_("Expression is too complicated."));
641 /* worker function */
643 validate_actionline (const char *line, struct breakpoint *b)
645 struct cmd_list_element *c;
648 struct bp_location *loc;
649 struct tracepoint *t = (struct tracepoint *) b;
651 /* If EOF is typed, *line is NULL. */
655 p = skip_spaces (line);
657 /* Symbol lookup etc. */
658 if (*p == '\0') /* empty line: just prompt for another line. */
661 if (*p == '#') /* comment line */
664 c = lookup_cmd (&p, cmdlist, "", -1, 1);
666 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
668 if (cmd_cfunc_eq (c, collect_pseudocommand))
670 int trace_string = 0;
673 p = decode_agent_options (p, &trace_string);
676 { /* Repeat over a comma-separated list. */
677 QUIT; /* Allow user to bail out with ^C. */
680 if (*p == '$') /* Look for special pseudo-symbols. */
682 if (0 == strncasecmp ("reg", p + 1, 3)
683 || 0 == strncasecmp ("arg", p + 1, 3)
684 || 0 == strncasecmp ("loc", p + 1, 3)
685 || 0 == strncasecmp ("_ret", p + 1, 4)
686 || 0 == strncasecmp ("_sdata", p + 1, 6))
691 /* else fall thru, treat p as an expression and parse it! */
694 for (loc = t->loc; loc; loc = loc->next)
697 expression_up exp = parse_exp_1 (&p, loc->address,
698 block_for_pc (loc->address), 1);
700 if (exp->elts[0].opcode == OP_VAR_VALUE)
702 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
704 error (_("constant `%s' (value %s) "
705 "will not be collected."),
706 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
707 plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
709 else if (SYMBOL_CLASS (exp->elts[2].symbol)
710 == LOC_OPTIMIZED_OUT)
712 error (_("`%s' is optimized away "
713 "and cannot be collected."),
714 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
718 /* We have something to collect, make sure that the expr to
719 bytecode translator can handle it and that it's not too
721 agent_expr_up aexpr = gen_trace_for_expr (loc->address,
725 if (aexpr->len > MAX_AGENT_EXPR_LEN)
726 error (_("Expression is too complicated."));
728 ax_reqs (aexpr.get ());
730 report_agent_reqs_errors (aexpr.get ());
733 while (p && *p++ == ',');
736 else if (cmd_cfunc_eq (c, teval_pseudocommand))
739 { /* Repeat over a comma-separated list. */
740 QUIT; /* Allow user to bail out with ^C. */
744 for (loc = t->loc; loc; loc = loc->next)
748 /* Only expressions are allowed for this action. */
749 expression_up exp = parse_exp_1 (&p, loc->address,
750 block_for_pc (loc->address), 1);
752 /* We have something to evaluate, make sure that the expr to
753 bytecode translator can handle it and that it's not too
755 agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
757 if (aexpr->len > MAX_AGENT_EXPR_LEN)
758 error (_("Expression is too complicated."));
760 ax_reqs (aexpr.get ());
761 report_agent_reqs_errors (aexpr.get ());
764 while (p && *p++ == ',');
767 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
772 t->step_count = strtol (p, &endp, 0);
773 if (endp == p || t->step_count == 0)
774 error (_("while-stepping step count `%s' is malformed."), line);
778 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
782 error (_("`%s' is not a supported tracepoint action."), line);
786 memrange_absolute = -1
789 /* MEMRANGE functions: */
791 /* Compare memranges for std::sort. */
794 memrange_comp (const memrange &a, const memrange &b)
796 if (a.type == b.type)
798 if (a.type == memrange_absolute)
799 return (bfd_vma) a.start < (bfd_vma) b.start;
801 return a.start < b.start;
804 return a.type < b.type;
807 /* Sort the memrange list using std::sort, and merge adjacent memranges. */
810 memrange_sortmerge (std::vector<memrange> &memranges)
812 if (!memranges.empty ())
816 std::sort (memranges.begin (), memranges.end (), memrange_comp);
818 for (a = 0, b = 1; b < memranges.size (); b++)
820 /* If memrange b overlaps or is adjacent to memrange a,
822 if (memranges[a].type == memranges[b].type
823 && memranges[b].start <= memranges[a].end)
825 if (memranges[b].end > memranges[a].end)
826 memranges[a].end = memranges[b].end;
827 continue; /* next b, same a */
831 memranges[a] = memranges[b];
833 memranges.resize (a + 1);
837 /* Add a register to a collection list. */
840 collection_list::add_register (unsigned int regno)
843 printf_filtered ("collect register %d\n", regno);
844 if (regno >= (8 * sizeof (m_regs_mask)))
845 error (_("Internal: register number %d too large for tracepoint"),
847 m_regs_mask[regno / 8] |= 1 << (regno % 8);
850 /* Add a memrange to a collection list. */
853 collection_list::add_memrange (struct gdbarch *gdbarch,
854 int type, bfd_signed_vma base,
858 printf_filtered ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len);
860 /* type: memrange_absolute == memory, other n == basereg */
861 /* base: addr if memory, offset if reg relative. */
862 /* len: we actually save end (base + len) for convenience */
863 m_memranges.emplace_back (type, base, base + len);
865 if (type != memrange_absolute) /* Better collect the base register! */
869 /* Add a symbol to a collection list. */
872 collection_list::collect_symbol (struct symbol *sym,
873 struct gdbarch *gdbarch,
874 long frame_regno, long frame_offset,
880 bfd_signed_vma offset;
881 int treat_as_expr = 0;
883 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
884 switch (SYMBOL_CLASS (sym))
887 printf_filtered ("%s: don't know symbol class %d\n",
888 SYMBOL_PRINT_NAME (sym),
892 printf_filtered ("constant %s (value %s) will not be collected.\n",
893 SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
896 offset = SYMBOL_VALUE_ADDRESS (sym);
899 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
900 SYMBOL_PRINT_NAME (sym), len,
901 paddress (gdbarch, offset));
903 /* A struct may be a C++ class with static fields, go to general
904 expression handling. */
905 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
908 add_memrange (gdbarch, memrange_absolute, offset, len);
911 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
913 printf_filtered ("LOC_REG[parm] %s: ",
914 SYMBOL_PRINT_NAME (sym));
916 /* Check for doubles stored in two registers. */
917 /* FIXME: how about larger types stored in 3 or more regs? */
918 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
919 len > register_size (gdbarch, reg))
920 add_register (reg + 1);
923 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
924 printf_filtered (" (will not collect %s)\n",
925 SYMBOL_PRINT_NAME (sym));
929 offset = frame_offset + SYMBOL_VALUE (sym);
932 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
933 " from frame ptr reg %d\n",
934 SYMBOL_PRINT_NAME (sym), len,
935 paddress (gdbarch, offset), reg);
937 add_memrange (gdbarch, reg, offset, len);
939 case LOC_REGPARM_ADDR:
940 reg = SYMBOL_VALUE (sym);
944 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
946 SYMBOL_PRINT_NAME (sym), len,
947 paddress (gdbarch, offset), reg);
949 add_memrange (gdbarch, reg, offset, len);
953 offset = frame_offset + SYMBOL_VALUE (sym);
956 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
957 " from frame ptr reg %d\n",
958 SYMBOL_PRINT_NAME (sym), len,
959 paddress (gdbarch, offset), reg);
961 add_memrange (gdbarch, reg, offset, len);
968 case LOC_OPTIMIZED_OUT:
969 printf_filtered ("%s has been optimized out of existence.\n",
970 SYMBOL_PRINT_NAME (sym));
978 /* Expressions are the most general case. */
981 agent_expr_up aexpr = gen_trace_for_var (scope, gdbarch,
984 /* It can happen that the symbol is recorded as a computed
985 location, but it's been optimized away and doesn't actually
986 have a location expression. */
989 printf_filtered ("%s has been optimized out of existence.\n",
990 SYMBOL_PRINT_NAME (sym));
994 ax_reqs (aexpr.get ());
996 report_agent_reqs_errors (aexpr.get ());
998 /* Take care of the registers. */
999 if (aexpr->reg_mask_len > 0)
1001 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1003 QUIT; /* Allow user to bail out with ^C. */
1004 if (aexpr->reg_mask[ndx1] != 0)
1006 /* Assume chars have 8 bits. */
1007 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1008 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1009 /* It's used -- record it. */
1010 add_register (ndx1 * 8 + ndx2);
1015 add_aexpr (std::move (aexpr));
1019 /* Data to be passed around in the calls to the locals and args
1022 struct add_local_symbols_data
1024 struct collection_list *collect;
1025 struct gdbarch *gdbarch;
1033 /* The callback for the locals and args iterators. */
1036 do_collect_symbol (const char *print_name,
1040 struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
1042 p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
1043 p->frame_offset, p->pc, p->trace_string);
1046 p->collect->add_wholly_collected (print_name);
1050 collection_list::add_wholly_collected (const char *print_name)
1052 m_wholly_collected.push_back (print_name);
1055 /* Add all locals (or args) symbols to collection list. */
1058 collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
1059 long frame_regno, long frame_offset, int type,
1062 const struct block *block;
1063 struct add_local_symbols_data cb_data;
1065 cb_data.collect = this;
1066 cb_data.gdbarch = gdbarch;
1068 cb_data.frame_regno = frame_regno;
1069 cb_data.frame_offset = frame_offset;
1071 cb_data.trace_string = trace_string;
1075 block = block_for_pc (pc);
1078 warning (_("Can't collect locals; "
1079 "no symbol table info available.\n"));
1083 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1084 if (cb_data.count == 0)
1085 warning (_("No locals found in scope."));
1089 pc = get_pc_function_start (pc);
1090 block = block_for_pc (pc);
1093 warning (_("Can't collect args; no symbol table info available."));
1097 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1098 if (cb_data.count == 0)
1099 warning (_("No args found in scope."));
1104 collection_list::add_static_trace_data ()
1107 printf_filtered ("collect static trace data\n");
1108 m_strace_data = true;
1111 collection_list::collection_list ()
1113 m_strace_data (false)
1115 m_memranges.reserve (128);
1116 m_aexprs.reserve (128);
1119 /* Reduce a collection list to string form (for gdb protocol). */
1121 std::vector<std::string>
1122 collection_list::stringify ()
1124 char temp_buf[2048];
1128 std::vector<std::string> str_list;
1133 printf_filtered ("\nCollecting static trace data\n");
1136 str_list.emplace_back (temp_buf, end - temp_buf);
1139 for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
1140 if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1142 if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1145 printf_filtered ("\nCollecting registers (mask): 0x");
1150 QUIT; /* Allow user to bail out with ^C. */
1152 printf_filtered ("%02X", m_regs_mask[i]);
1153 sprintf (end, "%02X", m_regs_mask[i]);
1156 str_list.emplace_back (temp_buf);
1159 printf_filtered ("\n");
1160 if (!m_memranges.empty () && info_verbose)
1161 printf_filtered ("Collecting memranges: \n");
1162 for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
1164 QUIT; /* Allow user to bail out with ^C. */
1167 printf_filtered ("(%d, %s, %ld)\n",
1168 m_memranges[i].type,
1169 paddress (target_gdbarch (),
1170 m_memranges[i].start),
1171 (long) (m_memranges[i].end
1172 - m_memranges[i].start));
1174 if (count + 27 > MAX_AGENT_EXPR_LEN)
1176 str_list.emplace_back (temp_buf, count);
1182 bfd_signed_vma length
1183 = m_memranges[i].end - m_memranges[i].start;
1185 /* The "%X" conversion specifier expects an unsigned argument,
1186 so passing -1 (memrange_absolute) to it directly gives you
1187 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1189 if (m_memranges[i].type == memrange_absolute)
1190 sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0),
1193 sprintf (end, "M%X,%s,%lX", m_memranges[i].type,
1194 phex_nz (m_memranges[i].start, 0), (long) length);
1197 count += strlen (end);
1198 end = temp_buf + count;
1201 for (i = 0; i < m_aexprs.size (); i++)
1203 QUIT; /* Allow user to bail out with ^C. */
1204 if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
1206 str_list.emplace_back (temp_buf, count);
1210 sprintf (end, "X%08X,", m_aexprs[i]->len);
1211 end += 10; /* 'X' + 8 hex digits + ',' */
1214 end = mem2hex (m_aexprs[i]->buf, end, m_aexprs[i]->len);
1215 count += 2 * m_aexprs[i]->len;
1220 str_list.emplace_back (temp_buf, count);
1228 /* Add the printed expression EXP to *LIST. */
1231 collection_list::append_exp (struct expression *exp)
1233 string_file tmp_stream;
1235 print_expression (exp, &tmp_stream);
1237 m_computed.push_back (std::move (tmp_stream.string ()));
1241 collection_list::finish ()
1243 memrange_sortmerge (m_memranges);
1247 encode_actions_1 (struct command_line *action,
1248 struct bp_location *tloc,
1250 LONGEST frame_offset,
1251 struct collection_list *collect,
1252 struct collection_list *stepping_list)
1254 const char *action_exp;
1256 struct value *tempval;
1257 struct cmd_list_element *cmd;
1259 for (; action; action = action->next)
1261 QUIT; /* Allow user to bail out with ^C. */
1262 action_exp = action->line;
1263 action_exp = skip_spaces (action_exp);
1265 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1267 error (_("Bad action list item: %s"), action_exp);
1269 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1271 int trace_string = 0;
1273 if (*action_exp == '/')
1274 action_exp = decode_agent_options (action_exp, &trace_string);
1277 { /* Repeat over a comma-separated list. */
1278 QUIT; /* Allow user to bail out with ^C. */
1279 action_exp = skip_spaces (action_exp);
1281 if (0 == strncasecmp ("$reg", action_exp, 4))
1283 for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
1284 collect->add_register (i);
1285 action_exp = strchr (action_exp, ','); /* more? */
1287 else if (0 == strncasecmp ("$arg", action_exp, 4))
1289 collect->add_local_symbols (target_gdbarch (),
1295 action_exp = strchr (action_exp, ','); /* more? */
1297 else if (0 == strncasecmp ("$loc", action_exp, 4))
1299 collect->add_local_symbols (target_gdbarch (),
1305 action_exp = strchr (action_exp, ','); /* more? */
1307 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1310 = gen_trace_for_return_address (tloc->address,
1314 ax_reqs (aexpr.get ());
1315 report_agent_reqs_errors (aexpr.get ());
1317 /* take care of the registers */
1318 if (aexpr->reg_mask_len > 0)
1320 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1322 QUIT; /* allow user to bail out with ^C */
1323 if (aexpr->reg_mask[ndx1] != 0)
1325 /* assume chars have 8 bits */
1326 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1327 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1329 /* It's used -- record it. */
1330 collect->add_register (ndx1 * 8 + ndx2);
1336 collect->add_aexpr (std::move (aexpr));
1337 action_exp = strchr (action_exp, ','); /* more? */
1339 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1341 collect->add_static_trace_data ();
1342 action_exp = strchr (action_exp, ','); /* more? */
1348 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1349 block_for_pc (tloc->address),
1352 switch (exp->elts[0].opcode)
1356 const char *name = &exp->elts[2].string;
1358 i = user_reg_map_name_to_regnum (target_gdbarch (),
1359 name, strlen (name));
1361 internal_error (__FILE__, __LINE__,
1362 _("Register $%s not available"),
1365 printf_filtered ("OP_REGISTER: ");
1366 collect->add_register (i);
1371 /* Safe because we know it's a simple expression. */
1372 tempval = evaluate_expression (exp.get ());
1373 addr = value_address (tempval);
1374 /* Initialize the TYPE_LENGTH if it is a typedef. */
1375 check_typedef (exp->elts[1].type);
1376 collect->add_memrange (target_gdbarch (),
1377 memrange_absolute, addr,
1378 TYPE_LENGTH (exp->elts[1].type));
1379 collect->append_exp (exp.get ());
1384 struct symbol *sym = exp->elts[2].symbol;
1385 char_ptr name = (char_ptr) SYMBOL_NATURAL_NAME (sym);
1387 collect->collect_symbol (exp->elts[2].symbol,
1393 collect->add_wholly_collected (name);
1397 default: /* Full-fledged expression. */
1398 agent_expr_up aexpr = gen_trace_for_expr (tloc->address,
1402 ax_reqs (aexpr.get ());
1404 report_agent_reqs_errors (aexpr.get ());
1406 /* Take care of the registers. */
1407 if (aexpr->reg_mask_len > 0)
1409 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1411 QUIT; /* Allow user to bail out with ^C. */
1412 if (aexpr->reg_mask[ndx1] != 0)
1414 /* Assume chars have 8 bits. */
1415 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1416 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1418 /* It's used -- record it. */
1419 collect->add_register (ndx1 * 8 + ndx2);
1425 collect->add_aexpr (std::move (aexpr));
1426 collect->append_exp (exp.get ());
1431 while (action_exp && *action_exp++ == ',');
1433 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1436 { /* Repeat over a comma-separated list. */
1437 QUIT; /* Allow user to bail out with ^C. */
1438 action_exp = skip_spaces (action_exp);
1441 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1442 block_for_pc (tloc->address),
1445 agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
1448 ax_reqs (aexpr.get ());
1449 report_agent_reqs_errors (aexpr.get ());
1451 /* Even though we're not officially collecting, add
1452 to the collect list anyway. */
1453 collect->add_aexpr (std::move (aexpr));
1456 while (action_exp && *action_exp++ == ',');
1458 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1460 /* We check against nested while-stepping when setting
1461 breakpoint action, so no way to run into nested
1463 gdb_assert (stepping_list);
1465 encode_actions_1 (action->body_list[0], tloc, frame_reg,
1466 frame_offset, stepping_list, NULL);
1469 error (_("Invalid tracepoint command '%s'"), action->line);
1473 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
1474 and STEPPING_LIST. */
1477 encode_actions (struct bp_location *tloc,
1478 struct collection_list *tracepoint_list,
1479 struct collection_list *stepping_list)
1481 struct command_line *actions;
1483 LONGEST frame_offset;
1485 gdbarch_virtual_frame_pointer (tloc->gdbarch,
1486 tloc->address, &frame_reg, &frame_offset);
1488 actions = all_tracepoint_actions_and_cleanup (tloc->owner);
1490 encode_actions_1 (actions, tloc, frame_reg, frame_offset,
1491 tracepoint_list, stepping_list);
1493 tracepoint_list->finish ();
1494 stepping_list->finish ();
1497 /* Render all actions into gdb protocol. */
1500 encode_actions_rsp (struct bp_location *tloc,
1501 std::vector<std::string> *tdp_actions,
1502 std::vector<std::string> *stepping_actions)
1504 struct collection_list tracepoint_list, stepping_list;
1506 encode_actions (tloc, &tracepoint_list, &stepping_list);
1508 *tdp_actions = tracepoint_list.stringify ();
1509 *stepping_actions = stepping_list.stringify ();
1513 collection_list::add_aexpr (agent_expr_up aexpr)
1515 m_aexprs.push_back (std::move (aexpr));
1519 process_tracepoint_on_disconnect (void)
1521 VEC(breakpoint_p) *tp_vec = NULL;
1523 struct breakpoint *b;
1524 int has_pending_p = 0;
1526 /* Check whether we still have pending tracepoint. If we have, warn the
1527 user that pending tracepoint will no longer work. */
1528 tp_vec = all_tracepoints ();
1529 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1538 struct bp_location *loc1;
1540 for (loc1 = b->loc; loc1; loc1 = loc1->next)
1542 if (loc1->shlib_disabled)
1553 VEC_free (breakpoint_p, tp_vec);
1556 warning (_("Pending tracepoints will not be resolved while"
1557 " GDB is disconnected\n"));
1560 /* Reset local state of tracing. */
1563 trace_reset_local_state (void)
1565 set_traceframe_num (-1);
1566 set_tracepoint_num (-1);
1567 set_traceframe_context (NULL);
1568 clear_traceframe_info ();
1572 start_tracing (const char *notes)
1574 VEC(breakpoint_p) *tp_vec = NULL;
1576 struct breakpoint *b;
1577 struct trace_state_variable *tsv;
1578 int any_enabled = 0, num_to_download = 0;
1581 tp_vec = all_tracepoints ();
1583 /* No point in tracing without any tracepoints... */
1584 if (VEC_length (breakpoint_p, tp_vec) == 0)
1586 VEC_free (breakpoint_p, tp_vec);
1587 error (_("No tracepoints defined, not starting trace"));
1590 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1592 if (b->enable_state == bp_enabled)
1595 if ((b->type == bp_fast_tracepoint
1596 ? may_insert_fast_tracepoints
1597 : may_insert_tracepoints))
1600 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1601 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1606 if (target_supports_enable_disable_tracepoint ())
1607 warning (_("No tracepoints enabled"));
1610 /* No point in tracing with only disabled tracepoints that
1611 cannot be re-enabled. */
1612 VEC_free (breakpoint_p, tp_vec);
1613 error (_("No tracepoints enabled, not starting trace"));
1617 if (num_to_download <= 0)
1619 VEC_free (breakpoint_p, tp_vec);
1620 error (_("No tracepoints that may be downloaded, not starting trace"));
1623 target_trace_init ();
1625 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1627 struct tracepoint *t = (struct tracepoint *) b;
1628 struct bp_location *loc;
1629 int bp_location_downloaded = 0;
1631 /* Clear `inserted' flag. */
1632 for (loc = b->loc; loc; loc = loc->next)
1635 if ((b->type == bp_fast_tracepoint
1636 ? !may_insert_fast_tracepoints
1637 : !may_insert_tracepoints))
1640 t->number_on_target = 0;
1642 for (loc = b->loc; loc; loc = loc->next)
1644 /* Since tracepoint locations are never duplicated, `inserted'
1645 flag should be zero. */
1646 gdb_assert (!loc->inserted);
1648 target_download_tracepoint (loc);
1651 bp_location_downloaded = 1;
1654 t->number_on_target = b->number;
1656 for (loc = b->loc; loc; loc = loc->next)
1657 if (loc->probe.prob != NULL)
1658 loc->probe.prob->set_semaphore (loc->probe.objfile,
1661 if (bp_location_downloaded)
1662 observer_notify_breakpoint_modified (b);
1664 VEC_free (breakpoint_p, tp_vec);
1666 /* Send down all the trace state variables too. */
1667 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1669 target_download_trace_state_variable (tsv);
1672 /* Tell target to treat text-like sections as transparent. */
1673 target_trace_set_readonly_regions ();
1674 /* Set some mode flags. */
1675 target_set_disconnected_tracing (disconnected_tracing);
1676 target_set_circular_trace_buffer (circular_trace_buffer);
1677 target_set_trace_buffer_size (trace_buffer_size);
1680 notes = trace_notes;
1681 ret = target_set_trace_notes (trace_user, notes, NULL);
1683 if (!ret && (trace_user || notes))
1684 warning (_("Target does not support trace user/notes, info ignored"));
1686 /* Now insert traps and begin collecting data. */
1687 target_trace_start ();
1689 /* Reset our local state. */
1690 trace_reset_local_state ();
1691 current_trace_status()->running = 1;
1694 /* The tstart command requests the target to start a new trace run.
1695 The command passes any arguments it has to the target verbatim, as
1696 an optional "trace note". This is useful as for instance a warning
1697 to other users if the trace runs disconnected, and you don't want
1698 anybody else messing with the target. */
1701 tstart_command (const char *args, int from_tty)
1703 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1705 if (current_trace_status ()->running)
1708 && !query (_("A trace is running already. Start a new run? ")))
1709 error (_("New trace run not started."));
1712 start_tracing (args);
1715 /* The tstop command stops the tracing run. The command passes any
1716 supplied arguments to the target verbatim as a "stop note"; if the
1717 target supports trace notes, then it will be reported back as part
1718 of the trace run's status. */
1721 tstop_command (const char *args, int from_tty)
1723 if (!current_trace_status ()->running)
1724 error (_("Trace is not running."));
1726 stop_tracing (args);
1730 stop_tracing (const char *note)
1733 VEC(breakpoint_p) *tp_vec = NULL;
1735 struct breakpoint *t;
1737 target_trace_stop ();
1739 tp_vec = all_tracepoints ();
1740 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1742 struct bp_location *loc;
1744 if ((t->type == bp_fast_tracepoint
1745 ? !may_insert_fast_tracepoints
1746 : !may_insert_tracepoints))
1749 for (loc = t->loc; loc; loc = loc->next)
1751 /* GDB can be totally absent in some disconnected trace scenarios,
1752 but we don't really care if this semaphore goes out of sync.
1753 That's why we are decrementing it here, but not taking care
1755 if (loc->probe.prob != NULL)
1756 loc->probe.prob->clear_semaphore (loc->probe.objfile,
1761 VEC_free (breakpoint_p, tp_vec);
1764 note = trace_stop_notes;
1765 ret = target_set_trace_notes (NULL, NULL, note);
1768 warning (_("Target does not support trace notes, note ignored"));
1770 /* Should change in response to reply? */
1771 current_trace_status ()->running = 0;
1774 /* tstatus command */
1776 tstatus_command (const char *args, int from_tty)
1778 struct trace_status *ts = current_trace_status ();
1780 VEC(breakpoint_p) *tp_vec = NULL;
1781 struct breakpoint *t;
1783 status = target_get_trace_status (ts);
1787 if (ts->filename != NULL)
1788 printf_filtered (_("Using a trace file.\n"));
1791 printf_filtered (_("Trace can not be run on this target.\n"));
1796 if (!ts->running_known)
1798 printf_filtered (_("Run/stop status is unknown.\n"));
1800 else if (ts->running)
1802 printf_filtered (_("Trace is running on the target.\n"));
1806 switch (ts->stop_reason)
1808 case trace_never_run:
1809 printf_filtered (_("No trace has been run on the target.\n"));
1811 case trace_stop_command:
1813 printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1816 printf_filtered (_("Trace stopped by a tstop command.\n"));
1818 case trace_buffer_full:
1819 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1821 case trace_disconnected:
1822 printf_filtered (_("Trace stopped because of disconnection.\n"));
1824 case tracepoint_passcount:
1825 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1826 ts->stopping_tracepoint);
1828 case tracepoint_error:
1829 if (ts->stopping_tracepoint)
1830 printf_filtered (_("Trace stopped by an "
1831 "error (%s, tracepoint %d).\n"),
1832 ts->stop_desc, ts->stopping_tracepoint);
1834 printf_filtered (_("Trace stopped by an error (%s).\n"),
1837 case trace_stop_reason_unknown:
1838 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1841 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1847 if (ts->traceframes_created >= 0
1848 && ts->traceframe_count != ts->traceframes_created)
1850 printf_filtered (_("Buffer contains %d trace "
1851 "frames (of %d created total).\n"),
1852 ts->traceframe_count, ts->traceframes_created);
1854 else if (ts->traceframe_count >= 0)
1856 printf_filtered (_("Collected %d trace frames.\n"),
1857 ts->traceframe_count);
1860 if (ts->buffer_free >= 0)
1862 if (ts->buffer_size >= 0)
1864 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1865 ts->buffer_free, ts->buffer_size);
1866 if (ts->buffer_size > 0)
1867 printf_filtered (_(" (%d%% full)"),
1868 ((int) ((((long long) (ts->buffer_size
1869 - ts->buffer_free)) * 100)
1870 / ts->buffer_size)));
1871 printf_filtered (_(".\n"));
1874 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1878 if (ts->disconnected_tracing)
1879 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1881 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1883 if (ts->circular_buffer)
1884 printf_filtered (_("Trace buffer is circular.\n"));
1886 if (ts->user_name && strlen (ts->user_name) > 0)
1887 printf_filtered (_("Trace user is %s.\n"), ts->user_name);
1889 if (ts->notes && strlen (ts->notes) > 0)
1890 printf_filtered (_("Trace notes: %s.\n"), ts->notes);
1892 /* Now report on what we're doing with tfind. */
1893 if (traceframe_number >= 0)
1894 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1895 traceframe_number, tracepoint_number);
1897 printf_filtered (_("Not looking at any trace frame.\n"));
1899 /* Report start/stop times if supplied. */
1904 LONGEST run_time = ts->stop_time - ts->start_time;
1906 /* Reporting a run time is more readable than two long numbers. */
1907 printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
1908 (long int) (ts->start_time / 1000000),
1909 (long int) (ts->start_time % 1000000),
1910 (long int) (run_time / 1000000),
1911 (long int) (run_time % 1000000));
1914 printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
1915 (long int) (ts->start_time / 1000000),
1916 (long int) (ts->start_time % 1000000));
1918 else if (ts->stop_time)
1919 printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
1920 (long int) (ts->stop_time / 1000000),
1921 (long int) (ts->stop_time % 1000000));
1923 /* Now report any per-tracepoint status available. */
1924 tp_vec = all_tracepoints ();
1926 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1927 target_get_tracepoint_status (t, NULL);
1929 VEC_free (breakpoint_p, tp_vec);
1932 /* Report the trace status to uiout, in a way suitable for MI, and not
1933 suitable for CLI. If ON_STOP is true, suppress a few fields that
1934 are not meaningful in the -trace-stop response.
1936 The implementation is essentially parallel to trace_status_command, but
1937 merging them will result in unreadable code. */
1939 trace_status_mi (int on_stop)
1941 struct ui_out *uiout = current_uiout;
1942 struct trace_status *ts = current_trace_status ();
1945 status = target_get_trace_status (ts);
1947 if (status == -1 && ts->filename == NULL)
1949 uiout->field_string ("supported", "0");
1953 if (ts->filename != NULL)
1954 uiout->field_string ("supported", "file");
1956 uiout->field_string ("supported", "1");
1958 if (ts->filename != NULL)
1959 uiout->field_string ("trace-file", ts->filename);
1961 gdb_assert (ts->running_known);
1965 uiout->field_string ("running", "1");
1967 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1968 Given that the frontend gets the status either on -trace-stop, or from
1969 -trace-status after re-connection, it does not seem like this
1970 information is necessary for anything. It is not necessary for either
1971 figuring the vital state of the target nor for navigation of trace
1972 frames. If the frontend wants to show the current state is some
1973 configure dialog, it can request the value when such dialog is
1974 invoked by the user. */
1978 const char *stop_reason = NULL;
1979 int stopping_tracepoint = -1;
1982 uiout->field_string ("running", "0");
1984 if (ts->stop_reason != trace_stop_reason_unknown)
1986 switch (ts->stop_reason)
1988 case trace_stop_command:
1989 stop_reason = "request";
1991 case trace_buffer_full:
1992 stop_reason = "overflow";
1994 case trace_disconnected:
1995 stop_reason = "disconnection";
1997 case tracepoint_passcount:
1998 stop_reason = "passcount";
1999 stopping_tracepoint = ts->stopping_tracepoint;
2001 case tracepoint_error:
2002 stop_reason = "error";
2003 stopping_tracepoint = ts->stopping_tracepoint;
2009 uiout->field_string ("stop-reason", stop_reason);
2010 if (stopping_tracepoint != -1)
2011 uiout->field_int ("stopping-tracepoint",
2012 stopping_tracepoint);
2013 if (ts->stop_reason == tracepoint_error)
2014 uiout->field_string ("error-description",
2020 if (ts->traceframe_count != -1)
2021 uiout->field_int ("frames", ts->traceframe_count);
2022 if (ts->traceframes_created != -1)
2023 uiout->field_int ("frames-created", ts->traceframes_created);
2024 if (ts->buffer_size != -1)
2025 uiout->field_int ("buffer-size", ts->buffer_size);
2026 if (ts->buffer_free != -1)
2027 uiout->field_int ("buffer-free", ts->buffer_free);
2029 uiout->field_int ("disconnected", ts->disconnected_tracing);
2030 uiout->field_int ("circular", ts->circular_buffer);
2032 uiout->field_string ("user-name", ts->user_name);
2033 uiout->field_string ("notes", ts->notes);
2038 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2039 (long int) (ts->start_time / 1000000),
2040 (long int) (ts->start_time % 1000000));
2041 uiout->field_string ("start-time", buf);
2042 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2043 (long int) (ts->stop_time / 1000000),
2044 (long int) (ts->stop_time % 1000000));
2045 uiout->field_string ("stop-time", buf);
2049 /* Check if a trace run is ongoing. If so, and FROM_TTY, query the
2050 user if she really wants to detach. */
2053 query_if_trace_running (int from_tty)
2058 /* It can happen that the target that was tracing went away on its
2059 own, and we didn't notice. Get a status update, and if the
2060 current target doesn't even do tracing, then assume it's not
2062 if (target_get_trace_status (current_trace_status ()) < 0)
2063 current_trace_status ()->running = 0;
2065 /* If running interactively, give the user the option to cancel and
2066 then decide what to do differently with the run. Scripts are
2067 just going to disconnect and let the target deal with it,
2068 according to how it's been instructed previously via
2069 disconnected-tracing. */
2070 if (current_trace_status ()->running)
2072 process_tracepoint_on_disconnect ();
2074 if (current_trace_status ()->disconnected_tracing)
2076 if (!query (_("Trace is running and will "
2077 "continue after detach; detach anyway? ")))
2078 error (_("Not confirmed."));
2082 if (!query (_("Trace is running but will "
2083 "stop on detach; detach anyway? ")))
2084 error (_("Not confirmed."));
2089 /* This function handles the details of what to do about an ongoing
2090 tracing run if the user has asked to detach or otherwise disconnect
2094 disconnect_tracing (void)
2096 /* Also we want to be out of tfind mode, otherwise things can get
2097 confusing upon reconnection. Just use these calls instead of
2098 full tfind_1 behavior because we're in the middle of detaching,
2099 and there's no point to updating current stack frame etc. */
2100 trace_reset_local_state ();
2103 /* Worker function for the various flavors of the tfind command. */
2105 tfind_1 (enum trace_find_type type, int num,
2106 CORE_ADDR addr1, CORE_ADDR addr2,
2109 int target_frameno = -1, target_tracept = -1;
2110 struct frame_id old_frame_id = null_frame_id;
2111 struct tracepoint *tp;
2112 struct ui_out *uiout = current_uiout;
2114 /* Only try to get the current stack frame if we have a chance of
2115 succeeding. In particular, if we're trying to get a first trace
2116 frame while all threads are running, it's not going to succeed,
2117 so leave it with a default value and let the frame comparison
2118 below (correctly) decide to print out the source location of the
2120 if (!(type == tfind_number && num == -1)
2121 && (has_stack_frames () || traceframe_number >= 0))
2122 old_frame_id = get_frame_id (get_current_frame ());
2124 target_frameno = target_trace_find (type, num, addr1, addr2,
2127 if (type == tfind_number
2129 && target_frameno == -1)
2131 /* We told the target to get out of tfind mode, and it did. */
2133 else if (target_frameno == -1)
2135 /* A request for a non-existent trace frame has failed.
2136 Our response will be different, depending on FROM_TTY:
2138 If FROM_TTY is true, meaning that this command was
2139 typed interactively by the user, then give an error
2140 and DO NOT change the state of traceframe_number etc.
2142 However if FROM_TTY is false, meaning that we're either
2143 in a script, a loop, or a user-defined command, then
2144 DON'T give an error, but DO change the state of
2145 traceframe_number etc. to invalid.
2147 The rationalle is that if you typed the command, you
2148 might just have committed a typo or something, and you'd
2149 like to NOT lose your current debugging state. However
2150 if you're in a user-defined command or especially in a
2151 loop, then you need a way to detect that the command
2152 failed WITHOUT aborting. This allows you to write
2153 scripts that search thru the trace buffer until the end,
2154 and then continue on to do something else. */
2157 error (_("Target failed to find requested trace frame."));
2161 printf_filtered ("End of trace buffer.\n");
2162 #if 0 /* dubious now? */
2163 /* The following will not recurse, since it's
2165 tfind_command ("-1", from_tty);
2170 tp = get_tracepoint_by_number_on_target (target_tracept);
2172 reinit_frame_cache ();
2173 target_dcache_invalidate ();
2175 set_tracepoint_num (tp ? tp->number : target_tracept);
2177 if (target_frameno != get_traceframe_number ())
2178 observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2180 set_current_traceframe (target_frameno);
2182 if (target_frameno == -1)
2183 set_traceframe_context (NULL);
2185 set_traceframe_context (get_current_frame ());
2187 if (traceframe_number >= 0)
2189 /* Use different branches for MI and CLI to make CLI messages
2191 if (uiout->is_mi_like_p ())
2193 uiout->field_string ("found", "1");
2194 uiout->field_int ("tracepoint", tracepoint_number);
2195 uiout->field_int ("traceframe", traceframe_number);
2199 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2200 traceframe_number, tracepoint_number);
2205 if (uiout->is_mi_like_p ())
2206 uiout->field_string ("found", "0");
2207 else if (type == tfind_number && num == -1)
2208 printf_unfiltered (_("No longer looking at any trace frame\n"));
2209 else /* This case may never occur, check. */
2210 printf_unfiltered (_("No trace frame found\n"));
2213 /* If we're in nonstop mode and getting out of looking at trace
2214 frames, there won't be any current frame to go back to and
2217 && (has_stack_frames () || traceframe_number >= 0))
2219 enum print_what print_what;
2221 /* NOTE: in imitation of the step command, try to determine
2222 whether we have made a transition from one function to
2223 another. If so, we'll print the "stack frame" (ie. the new
2224 function and it's arguments) -- otherwise we'll just show the
2227 if (frame_id_eq (old_frame_id,
2228 get_frame_id (get_current_frame ())))
2229 print_what = SRC_LINE;
2231 print_what = SRC_AND_LOC;
2233 print_stack_frame (get_selected_frame (NULL), 1, print_what, 1);
2238 /* Error on looking at traceframes while trace is running. */
2241 check_trace_running (struct trace_status *status)
2243 if (status->running && status->filename == NULL)
2244 error (_("May not look at trace frames while trace is running."));
2247 /* trace_find_command takes a trace frame number n,
2248 sends "QTFrame:<n>" to the target,
2249 and accepts a reply that may contain several optional pieces
2250 of information: a frame number, a tracepoint number, and an
2251 indication of whether this is a trap frame or a stepping frame.
2253 The minimal response is just "OK" (which indicates that the
2254 target does not give us a frame number or a tracepoint number).
2255 Instead of that, the target may send us a string containing
2257 F<hexnum> (gives the selected frame number)
2258 T<hexnum> (gives the selected tracepoint number)
2263 tfind_command_1 (const char *args, int from_tty)
2264 { /* This should only be called with a numeric argument. */
2267 check_trace_running (current_trace_status ());
2269 if (args == 0 || *args == 0)
2270 { /* TFIND with no args means find NEXT trace frame. */
2271 if (traceframe_number == -1)
2272 frameno = 0; /* "next" is first one. */
2274 frameno = traceframe_number + 1;
2276 else if (0 == strcmp (args, "-"))
2278 if (traceframe_number == -1)
2279 error (_("not debugging trace buffer"));
2280 else if (from_tty && traceframe_number == 0)
2281 error (_("already at start of trace buffer"));
2283 frameno = traceframe_number - 1;
2285 /* A hack to work around eval's need for fp to have been collected. */
2286 else if (0 == strcmp (args, "-1"))
2289 frameno = parse_and_eval_long (args);
2292 error (_("invalid input (%d is less than zero)"), frameno);
2294 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2298 tfind_command (const char *args, int from_tty)
2300 tfind_command_1 (args, from_tty);
2305 tfind_end_command (const char *args, int from_tty)
2307 tfind_command_1 ("-1", from_tty);
2312 tfind_start_command (const char *args, int from_tty)
2314 tfind_command_1 ("0", from_tty);
2317 /* tfind pc command */
2319 tfind_pc_command (const char *args, int from_tty)
2323 check_trace_running (current_trace_status ());
2325 if (args == 0 || *args == 0)
2326 pc = regcache_read_pc (get_current_regcache ());
2328 pc = parse_and_eval_address (args);
2330 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2333 /* tfind tracepoint command */
2335 tfind_tracepoint_command (const char *args, int from_tty)
2338 struct tracepoint *tp;
2340 check_trace_running (current_trace_status ());
2342 if (args == 0 || *args == 0)
2344 if (tracepoint_number == -1)
2345 error (_("No current tracepoint -- please supply an argument."));
2347 tdp = tracepoint_number; /* Default is current TDP. */
2350 tdp = parse_and_eval_long (args);
2352 /* If we have the tracepoint on hand, use the number that the
2353 target knows about (which may be different if we disconnected
2354 and reconnected). */
2355 tp = get_tracepoint (tdp);
2357 tdp = tp->number_on_target;
2359 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2362 /* TFIND LINE command:
2364 This command will take a sourceline for argument, just like BREAK
2365 or TRACE (ie. anything that "decode_line_1" can handle).
2367 With no argument, this command will find the next trace frame
2368 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2371 tfind_line_command (const char *args, int from_tty)
2373 check_trace_running (current_trace_status ());
2375 symtab_and_line sal;
2376 if (args == 0 || *args == 0)
2378 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2382 std::vector<symtab_and_line> sals
2383 = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2387 if (sal.symtab == 0)
2388 error (_("No line number information available."));
2390 CORE_ADDR start_pc, end_pc;
2391 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2393 if (start_pc == end_pc)
2395 printf_filtered ("Line %d of \"%s\"",
2397 symtab_to_filename_for_display (sal.symtab));
2399 printf_filtered (" is at address ");
2400 print_address (get_current_arch (), start_pc, gdb_stdout);
2402 printf_filtered (" but contains no code.\n");
2403 sal = find_pc_line (start_pc, 0);
2405 && find_line_pc_range (sal, &start_pc, &end_pc)
2406 && start_pc != end_pc)
2407 printf_filtered ("Attempting to find line %d instead.\n",
2410 error (_("Cannot find a good line."));
2414 /* Is there any case in which we get here, and have an address
2415 which the user would want to see? If we have debugging
2416 symbols and no line numbers? */
2417 error (_("Line number %d is out of range for \"%s\"."),
2418 sal.line, symtab_to_filename_for_display (sal.symtab));
2420 /* Find within range of stated line. */
2422 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2424 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2427 /* tfind range command */
2429 tfind_range_command (const char *args, int from_tty)
2431 static CORE_ADDR start, stop;
2434 check_trace_running (current_trace_status ());
2436 if (args == 0 || *args == 0)
2437 { /* XXX FIXME: what should default behavior be? */
2438 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2442 if (0 != (tmp = strchr (args, ',')))
2444 std::string start_addr (args, tmp);
2446 tmp = skip_spaces (tmp);
2447 start = parse_and_eval_address (start_addr.c_str ());
2448 stop = parse_and_eval_address (tmp);
2451 { /* No explicit end address? */
2452 start = parse_and_eval_address (args);
2453 stop = start + 1; /* ??? */
2456 tfind_1 (tfind_range, 0, start, stop, from_tty);
2459 /* tfind outside command */
2461 tfind_outside_command (const char *args, int from_tty)
2463 CORE_ADDR start, stop;
2466 if (current_trace_status ()->running
2467 && current_trace_status ()->filename == NULL)
2468 error (_("May not look at trace frames while trace is running."));
2470 if (args == 0 || *args == 0)
2471 { /* XXX FIXME: what should default behavior be? */
2472 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2476 if (0 != (tmp = strchr (args, ',')))
2478 std::string start_addr (args, tmp);
2480 tmp = skip_spaces (tmp);
2481 start = parse_and_eval_address (start_addr.c_str ());
2482 stop = parse_and_eval_address (tmp);
2485 { /* No explicit end address? */
2486 start = parse_and_eval_address (args);
2487 stop = start + 1; /* ??? */
2490 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2493 /* info scope command: list the locals for a scope. */
2495 info_scope_command (const char *args_in, int from_tty)
2498 struct bound_minimal_symbol msym;
2499 const struct block *block;
2500 const char *symname;
2501 const char *save_args = args_in;
2502 struct block_iterator iter;
2504 struct gdbarch *gdbarch;
2506 const char *args = args_in;
2508 if (args == 0 || *args == 0)
2509 error (_("requires an argument (function, "
2510 "line or *addr) to define a scope"));
2512 event_location_up location = string_to_event_location (&args,
2514 std::vector<symtab_and_line> sals
2515 = decode_line_1 (location.get (), DECODE_LINE_FUNFIRSTLINE,
2519 /* Presumably decode_line_1 has already warned. */
2523 /* Resolve line numbers to PC. */
2524 resolve_sal_pc (&sals[0]);
2525 block = block_for_pc (sals[0].pc);
2529 QUIT; /* Allow user to bail out with ^C. */
2530 ALL_BLOCK_SYMBOLS (block, iter, sym)
2532 QUIT; /* Allow user to bail out with ^C. */
2534 printf_filtered ("Scope for %s:\n", save_args);
2537 symname = SYMBOL_PRINT_NAME (sym);
2538 if (symname == NULL || *symname == '\0')
2539 continue; /* Probably botched, certainly useless. */
2541 gdbarch = symbol_arch (sym);
2543 printf_filtered ("Symbol %s is ", symname);
2545 if (SYMBOL_COMPUTED_OPS (sym) != NULL)
2546 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2547 BLOCK_START (block),
2551 switch (SYMBOL_CLASS (sym))
2554 case LOC_UNDEF: /* Messed up symbol? */
2555 printf_filtered ("a bogus symbol, class %d.\n",
2556 SYMBOL_CLASS (sym));
2557 count--; /* Don't count this one. */
2560 printf_filtered ("a constant with value %s (%s)",
2561 plongest (SYMBOL_VALUE (sym)),
2562 hex_string (SYMBOL_VALUE (sym)));
2564 case LOC_CONST_BYTES:
2565 printf_filtered ("constant bytes: ");
2566 if (SYMBOL_TYPE (sym))
2567 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2568 fprintf_filtered (gdb_stdout, " %02x",
2569 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2572 printf_filtered ("in static storage at address ");
2573 printf_filtered ("%s", paddress (gdbarch,
2574 SYMBOL_VALUE_ADDRESS (sym)));
2577 /* GDBARCH is the architecture associated with the objfile
2578 the symbol is defined in; the target architecture may be
2579 different, and may provide additional registers. However,
2580 we do not know the target architecture at this point.
2581 We assume the objfile architecture will contain all the
2582 standard registers that occur in debug info in that
2584 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2587 if (SYMBOL_IS_ARGUMENT (sym))
2588 printf_filtered ("an argument in register $%s",
2589 gdbarch_register_name (gdbarch, regno));
2591 printf_filtered ("a local variable in register $%s",
2592 gdbarch_register_name (gdbarch, regno));
2595 printf_filtered ("an argument at stack/frame offset %s",
2596 plongest (SYMBOL_VALUE (sym)));
2599 printf_filtered ("a local variable at frame offset %s",
2600 plongest (SYMBOL_VALUE (sym)));
2603 printf_filtered ("a reference argument at offset %s",
2604 plongest (SYMBOL_VALUE (sym)));
2606 case LOC_REGPARM_ADDR:
2607 /* Note comment at LOC_REGISTER. */
2608 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2610 printf_filtered ("the address of an argument, in register $%s",
2611 gdbarch_register_name (gdbarch, regno));
2614 printf_filtered ("a typedef.\n");
2617 printf_filtered ("a label at address ");
2618 printf_filtered ("%s", paddress (gdbarch,
2619 SYMBOL_VALUE_ADDRESS (sym)));
2622 printf_filtered ("a function at address ");
2623 printf_filtered ("%s",
2624 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2626 case LOC_UNRESOLVED:
2627 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2629 if (msym.minsym == NULL)
2630 printf_filtered ("Unresolved Static");
2633 printf_filtered ("static storage at address ");
2634 printf_filtered ("%s",
2636 BMSYMBOL_VALUE_ADDRESS (msym)));
2639 case LOC_OPTIMIZED_OUT:
2640 printf_filtered ("optimized out.\n");
2643 gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
2646 if (SYMBOL_TYPE (sym))
2647 printf_filtered (", length %d.\n",
2648 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2650 if (BLOCK_FUNCTION (block))
2653 block = BLOCK_SUPERBLOCK (block);
2656 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2660 /* Helper for trace_dump_command. Dump the action list starting at
2661 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2662 actions of the body of a while-stepping action. STEPPING_FRAME is
2663 set if the current traceframe was determined to be a while-stepping
2667 trace_dump_actions (struct command_line *action,
2668 int stepping_actions, int stepping_frame,
2671 const char *action_exp, *next_comma;
2673 for (; action != NULL; action = action->next)
2675 struct cmd_list_element *cmd;
2677 QUIT; /* Allow user to bail out with ^C. */
2678 action_exp = action->line;
2679 action_exp = skip_spaces (action_exp);
2681 /* The collection actions to be done while stepping are
2682 bracketed by the commands "while-stepping" and "end". */
2684 if (*action_exp == '#') /* comment line */
2687 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2689 error (_("Bad action list item: %s"), action_exp);
2691 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2695 for (i = 0; i < action->body_count; ++i)
2696 trace_dump_actions (action->body_list[i],
2697 1, stepping_frame, from_tty);
2699 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2701 /* Display the collected data.
2702 For the trap frame, display only what was collected at
2703 the trap. Likewise for stepping frames, display only
2704 what was collected while stepping. This means that the
2705 two boolean variables, STEPPING_FRAME and
2706 STEPPING_ACTIONS should be equal. */
2707 if (stepping_frame == stepping_actions)
2710 struct cleanup *old_chain
2711 = make_cleanup (free_current_contents, &cmd);
2712 int trace_string = 0;
2714 if (*action_exp == '/')
2715 action_exp = decode_agent_options (action_exp, &trace_string);
2718 { /* Repeat over a comma-separated list. */
2719 QUIT; /* Allow user to bail out with ^C. */
2720 if (*action_exp == ',')
2722 action_exp = skip_spaces (action_exp);
2724 next_comma = strchr (action_exp, ',');
2726 if (0 == strncasecmp (action_exp, "$reg", 4))
2727 registers_info (NULL, from_tty);
2728 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2730 else if (0 == strncasecmp (action_exp, "$loc", 4))
2731 info_locals_command (NULL, from_tty);
2732 else if (0 == strncasecmp (action_exp, "$arg", 4))
2733 info_args_command (NULL, from_tty);
2736 if (next_comma != NULL)
2738 size_t len = next_comma - action_exp;
2740 cmd = (char *) xrealloc (cmd, len + 1);
2741 memcpy (cmd, action_exp, len);
2746 size_t len = strlen (action_exp);
2748 cmd = (char *) xrealloc (cmd, len + 1);
2749 memcpy (cmd, action_exp, len + 1);
2752 printf_filtered ("%s = ", cmd);
2753 output_command_const (cmd, from_tty);
2754 printf_filtered ("\n");
2756 action_exp = next_comma;
2758 while (action_exp && *action_exp == ',');
2760 do_cleanups (old_chain);
2766 /* Return bp_location of the tracepoint associated with the current
2767 traceframe. Set *STEPPING_FRAME_P to 1 if the current traceframe
2768 is a stepping traceframe. */
2770 struct bp_location *
2771 get_traceframe_location (int *stepping_frame_p)
2773 struct tracepoint *t;
2774 struct bp_location *tloc;
2775 struct regcache *regcache;
2777 if (tracepoint_number == -1)
2778 error (_("No current trace frame."));
2780 t = get_tracepoint (tracepoint_number);
2783 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2786 /* The current frame is a trap frame if the frame PC is equal to the
2787 tracepoint PC. If not, then the current frame was collected
2788 during single-stepping. */
2789 regcache = get_current_regcache ();
2791 /* If the traceframe's address matches any of the tracepoint's
2792 locations, assume it is a direct hit rather than a while-stepping
2793 frame. (FIXME this is not reliable, should record each frame's
2795 for (tloc = t->loc; tloc; tloc = tloc->next)
2796 if (tloc->address == regcache_read_pc (regcache))
2798 *stepping_frame_p = 0;
2802 /* If this is a stepping frame, we don't know which location
2803 triggered. The first is as good (or bad) a guess as any... */
2804 *stepping_frame_p = 1;
2808 /* Return all the actions, including default collect, of a tracepoint
2809 T. It constructs cleanups into the chain, and leaves the caller to
2810 handle them (call do_cleanups). */
2812 static struct command_line *
2813 all_tracepoint_actions_and_cleanup (struct breakpoint *t)
2815 struct command_line *actions;
2817 actions = breakpoint_commands (t);
2819 /* If there are default expressions to collect, make up a collect
2820 action and prepend to the action list to encode. Note that since
2821 validation is per-tracepoint (local var "xyz" might be valid for
2822 one tracepoint and not another, etc), we make up the action on
2823 the fly, and don't cache it. */
2824 if (*default_collect)
2826 struct command_line *default_collect_action;
2827 char *default_collect_line;
2829 default_collect_line = xstrprintf ("collect %s", default_collect);
2830 make_cleanup (xfree, default_collect_line);
2832 validate_actionline (default_collect_line, t);
2833 default_collect_action = XNEW (struct command_line);
2834 make_cleanup (xfree, default_collect_action);
2835 default_collect_action->next = actions;
2836 default_collect_action->line = default_collect_line;
2837 actions = default_collect_action;
2843 /* The tdump command. */
2846 tdump_command (const char *args, int from_tty)
2848 int stepping_frame = 0;
2849 struct bp_location *loc;
2850 struct command_line *actions;
2852 /* This throws an error is not inspecting a trace frame. */
2853 loc = get_traceframe_location (&stepping_frame);
2855 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2856 tracepoint_number, traceframe_number);
2858 /* This command only makes sense for the current frame, not the
2860 scoped_restore_current_thread restore_thread;
2862 select_frame (get_current_frame ());
2864 actions = all_tracepoint_actions_and_cleanup (loc->owner);
2866 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2869 /* Encode a piece of a tracepoint's source-level definition in a form
2870 that is suitable for both protocol and saving in files. */
2871 /* This version does not do multiple encodes for long strings; it should
2872 return an offset to the next piece to encode. FIXME */
2875 encode_source_string (int tpnum, ULONGEST addr,
2876 const char *srctype, const char *src,
2877 char *buf, int buf_size)
2879 if (80 + strlen (srctype) > buf_size)
2880 error (_("Buffer too small for source encoding"));
2881 sprintf (buf, "%x:%s:%s:%x:%x:",
2882 tpnum, phex_nz (addr, sizeof (addr)),
2883 srctype, 0, (int) strlen (src));
2884 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2885 error (_("Source string too long for buffer"));
2886 bin2hex ((gdb_byte *) src, buf + strlen (buf), strlen (src));
2890 /* Tell the target what to do with an ongoing tracing run if GDB
2891 disconnects for some reason. */
2894 set_disconnected_tracing (const char *args, int from_tty,
2895 struct cmd_list_element *c)
2897 target_set_disconnected_tracing (disconnected_tracing);
2901 set_circular_trace_buffer (const char *args, int from_tty,
2902 struct cmd_list_element *c)
2904 target_set_circular_trace_buffer (circular_trace_buffer);
2908 set_trace_buffer_size (const char *args, int from_tty,
2909 struct cmd_list_element *c)
2911 target_set_trace_buffer_size (trace_buffer_size);
2915 set_trace_user (const char *args, int from_tty,
2916 struct cmd_list_element *c)
2920 ret = target_set_trace_notes (trace_user, NULL, NULL);
2923 warning (_("Target does not support trace notes, user ignored"));
2927 set_trace_notes (const char *args, int from_tty,
2928 struct cmd_list_element *c)
2932 ret = target_set_trace_notes (NULL, trace_notes, NULL);
2935 warning (_("Target does not support trace notes, note ignored"));
2939 set_trace_stop_notes (const char *args, int from_tty,
2940 struct cmd_list_element *c)
2944 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
2947 warning (_("Target does not support trace notes, stop note ignored"));
2950 /* Convert the memory pointed to by mem into hex, placing result in buf.
2951 * Return a pointer to the last char put in buf (null)
2952 * "stolen" from sparc-stub.c
2955 static const char hexchars[] = "0123456789abcdef";
2958 mem2hex (gdb_byte *mem, char *buf, int count)
2966 *buf++ = hexchars[ch >> 4];
2967 *buf++ = hexchars[ch & 0xf];
2976 get_traceframe_number (void)
2978 return traceframe_number;
2982 get_tracepoint_number (void)
2984 return tracepoint_number;
2987 /* Make the traceframe NUM be the current trace frame. Does nothing
2988 if NUM is already current. */
2991 set_current_traceframe (int num)
2995 if (traceframe_number == num)
2997 /* Nothing to do. */
3001 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3004 warning (_("could not change traceframe"));
3006 set_traceframe_num (newnum);
3008 /* Changing the traceframe changes our view of registers and of the
3010 registers_changed ();
3012 clear_traceframe_info ();
3015 /* A cleanup used when switching away and back from tfind mode. */
3017 struct current_traceframe_cleanup
3019 /* The traceframe we were inspecting. */
3020 int traceframe_number;
3024 do_restore_current_traceframe_cleanup (void *arg)
3026 struct current_traceframe_cleanup *old
3027 = (struct current_traceframe_cleanup *) arg;
3029 set_current_traceframe (old->traceframe_number);
3033 restore_current_traceframe_cleanup_dtor (void *arg)
3035 struct current_traceframe_cleanup *old
3036 = (struct current_traceframe_cleanup *) arg;
3042 make_cleanup_restore_current_traceframe (void)
3044 struct current_traceframe_cleanup *old =
3045 XNEW (struct current_traceframe_cleanup);
3047 old->traceframe_number = traceframe_number;
3049 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3050 restore_current_traceframe_cleanup_dtor);
3053 /* Given a number and address, return an uploaded tracepoint with that
3054 number, creating if necessary. */
3056 struct uploaded_tp *
3057 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3059 struct uploaded_tp *utp;
3061 for (utp = *utpp; utp; utp = utp->next)
3062 if (utp->number == num && utp->addr == addr)
3065 utp = XCNEW (struct uploaded_tp);
3068 utp->actions = NULL;
3069 utp->step_actions = NULL;
3070 utp->cmd_strings = NULL;
3078 free_uploaded_tps (struct uploaded_tp **utpp)
3080 struct uploaded_tp *next_one;
3084 next_one = (*utpp)->next;
3090 /* Given a number and address, return an uploaded tracepoint with that
3091 number, creating if necessary. */
3093 struct uploaded_tsv *
3094 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3096 struct uploaded_tsv *utsv;
3098 for (utsv = *utsvp; utsv; utsv = utsv->next)
3099 if (utsv->number == num)
3102 utsv = XCNEW (struct uploaded_tsv);
3104 utsv->next = *utsvp;
3111 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3113 struct uploaded_tsv *next_one;
3117 next_one = (*utsvp)->next;
3123 /* FIXME this function is heuristic and will miss the cases where the
3124 conditional is semantically identical but differs in whitespace,
3125 such as "x == 0" vs "x==0". */
3128 cond_string_is_same (char *str1, char *str2)
3130 if (str1 == NULL || str2 == NULL)
3131 return (str1 == str2);
3133 return (strcmp (str1, str2) == 0);
3136 /* Look for an existing tracepoint that seems similar enough to the
3137 uploaded one. Enablement isn't compared, because the user can
3138 toggle that freely, and may have done so in anticipation of the
3139 next trace run. Return the location of matched tracepoint. */
3141 static struct bp_location *
3142 find_matching_tracepoint_location (struct uploaded_tp *utp)
3144 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3146 struct breakpoint *b;
3147 struct bp_location *loc;
3149 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3151 struct tracepoint *t = (struct tracepoint *) b;
3153 if (b->type == utp->type
3154 && t->step_count == utp->step
3155 && t->pass_count == utp->pass
3156 && cond_string_is_same (t->cond_string, utp->cond_string)
3157 /* FIXME also test actions. */
3160 /* Scan the locations for an address match. */
3161 for (loc = b->loc; loc; loc = loc->next)
3163 if (loc->address == utp->addr)
3171 /* Given a list of tracepoints uploaded from a target, attempt to
3172 match them up with existing tracepoints, and create new ones if not
3176 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3178 struct uploaded_tp *utp;
3179 /* A set of tracepoints which are modified. */
3180 VEC(breakpoint_p) *modified_tp = NULL;
3182 struct breakpoint *b;
3184 /* Look for GDB tracepoints that match up with our uploaded versions. */
3185 for (utp = *uploaded_tps; utp; utp = utp->next)
3187 struct bp_location *loc;
3188 struct tracepoint *t;
3190 loc = find_matching_tracepoint_location (utp);
3195 /* Mark this location as already inserted. */
3197 t = (struct tracepoint *) loc->owner;
3198 printf_filtered (_("Assuming tracepoint %d is same "
3199 "as target's tracepoint %d at %s.\n"),
3200 loc->owner->number, utp->number,
3201 paddress (loc->gdbarch, utp->addr));
3203 /* The tracepoint LOC->owner was modified (the location LOC
3204 was marked as inserted in the target). Save it in
3205 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3206 observers will be notified later once for each tracepoint
3207 saved in MODIFIED_TP. */
3209 VEC_iterate (breakpoint_p, modified_tp, ix, b);
3211 if (b == loc->owner)
3217 VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3221 t = create_tracepoint_from_upload (utp);
3223 printf_filtered (_("Created tracepoint %d for "
3224 "target's tracepoint %d at %s.\n"),
3225 t->number, utp->number,
3226 paddress (get_current_arch (), utp->addr));
3228 printf_filtered (_("Failed to create tracepoint for target's "
3229 "tracepoint %d at %s, skipping it.\n"),
3231 paddress (get_current_arch (), utp->addr));
3233 /* Whether found or created, record the number used by the
3234 target, to help with mapping target tracepoints back to their
3235 counterparts here. */
3237 t->number_on_target = utp->number;
3240 /* Notify 'breakpoint-modified' observer that at least one of B's
3241 locations was changed. */
3242 for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
3243 observer_notify_breakpoint_modified (b);
3245 VEC_free (breakpoint_p, modified_tp);
3246 free_uploaded_tps (uploaded_tps);
3249 /* Trace state variables don't have much to identify them beyond their
3250 name, so just use that to detect matches. */
3252 static struct trace_state_variable *
3253 find_matching_tsv (struct uploaded_tsv *utsv)
3258 return find_trace_state_variable (utsv->name);
3261 static struct trace_state_variable *
3262 create_tsv_from_upload (struct uploaded_tsv *utsv)
3264 const char *namebase;
3267 struct trace_state_variable *tsv;
3271 namebase = utsv->name;
3277 buf = string_printf ("%s_%d", namebase, try_num++);
3280 /* Fish for a name that is not in use. */
3281 /* (should check against all internal vars?) */
3282 while (find_trace_state_variable (buf.c_str ()))
3283 buf = string_printf ("%s_%d", namebase, try_num++);
3285 /* We have an available name, create the variable. */
3286 tsv = create_trace_state_variable (buf.c_str ());
3287 tsv->initial_value = utsv->initial_value;
3288 tsv->builtin = utsv->builtin;
3290 observer_notify_tsv_created (tsv);
3295 /* Given a list of uploaded trace state variables, try to match them
3296 up with existing variables, or create additional ones. */
3299 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3302 struct uploaded_tsv *utsv;
3303 struct trace_state_variable *tsv;
3306 /* Most likely some numbers will have to be reassigned as part of
3307 the merge, so clear them all in anticipation. */
3308 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3311 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3313 tsv = find_matching_tsv (utsv);
3317 printf_filtered (_("Assuming trace state variable $%s "
3318 "is same as target's variable %d.\n"),
3319 tsv->name, utsv->number);
3323 tsv = create_tsv_from_upload (utsv);
3325 printf_filtered (_("Created trace state variable "
3326 "$%s for target's variable %d.\n"),
3327 tsv->name, utsv->number);
3329 /* Give precedence to numberings that come from the target. */
3331 tsv->number = utsv->number;
3334 /* Renumber everything that didn't get a target-assigned number. */
3336 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3337 if (tsv->number > highest)
3338 highest = tsv->number;
3341 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3342 if (tsv->number == 0)
3343 tsv->number = highest++;
3345 free_uploaded_tsvs (uploaded_tsvs);
3348 /* Parse the part of trace status syntax that is shared between
3349 the remote protocol and the trace file reader. */
3352 parse_trace_status (const char *line, struct trace_status *ts)
3354 const char *p = line, *p1, *p2, *p3, *p_temp;
3358 ts->running_known = 1;
3359 ts->running = (*p++ == '1');
3360 ts->stop_reason = trace_stop_reason_unknown;
3361 xfree (ts->stop_desc);
3362 ts->stop_desc = NULL;
3363 ts->traceframe_count = -1;
3364 ts->traceframes_created = -1;
3365 ts->buffer_free = -1;
3366 ts->buffer_size = -1;
3367 ts->disconnected_tracing = 0;
3368 ts->circular_buffer = 0;
3369 xfree (ts->user_name);
3370 ts->user_name = NULL;
3373 ts->start_time = ts->stop_time = 0;
3377 p1 = strchr (p, ':');
3379 error (_("Malformed trace status, at %s\n\
3380 Status line: '%s'\n"), p, line);
3381 p3 = strchr (p, ';');
3383 p3 = p + strlen (p);
3384 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3386 p = unpack_varlen_hex (++p1, &val);
3387 ts->stop_reason = trace_buffer_full;
3389 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3391 p = unpack_varlen_hex (++p1, &val);
3392 ts->stop_reason = trace_never_run;
3394 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3397 p = unpack_varlen_hex (++p1, &val);
3398 ts->stop_reason = tracepoint_passcount;
3399 ts->stopping_tracepoint = val;
3401 else if (strncmp (p, stop_reason_names[trace_stop_command], p1 - p) == 0)
3403 p2 = strchr (++p1, ':');
3411 ts->stop_desc = (char *) xmalloc (strlen (line));
3412 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3413 ts->stop_desc[end] = '\0';
3416 ts->stop_desc = xstrdup ("");
3418 p = unpack_varlen_hex (++p2, &val);
3419 ts->stop_reason = trace_stop_command;
3421 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3423 p = unpack_varlen_hex (++p1, &val);
3424 ts->stop_reason = trace_disconnected;
3426 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3428 p2 = strchr (++p1, ':');
3431 ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1);
3432 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3433 ts->stop_desc[end] = '\0';
3436 ts->stop_desc = xstrdup ("");
3438 p = unpack_varlen_hex (++p2, &val);
3439 ts->stopping_tracepoint = val;
3440 ts->stop_reason = tracepoint_error;
3442 else if (strncmp (p, "tframes", p1 - p) == 0)
3444 p = unpack_varlen_hex (++p1, &val);
3445 ts->traceframe_count = val;
3447 else if (strncmp (p, "tcreated", p1 - p) == 0)
3449 p = unpack_varlen_hex (++p1, &val);
3450 ts->traceframes_created = val;
3452 else if (strncmp (p, "tfree", p1 - p) == 0)
3454 p = unpack_varlen_hex (++p1, &val);
3455 ts->buffer_free = val;
3457 else if (strncmp (p, "tsize", p1 - p) == 0)
3459 p = unpack_varlen_hex (++p1, &val);
3460 ts->buffer_size = val;
3462 else if (strncmp (p, "disconn", p1 - p) == 0)
3464 p = unpack_varlen_hex (++p1, &val);
3465 ts->disconnected_tracing = val;
3467 else if (strncmp (p, "circular", p1 - p) == 0)
3469 p = unpack_varlen_hex (++p1, &val);
3470 ts->circular_buffer = val;
3472 else if (strncmp (p, "starttime", p1 - p) == 0)
3474 p = unpack_varlen_hex (++p1, &val);
3475 ts->start_time = val;
3477 else if (strncmp (p, "stoptime", p1 - p) == 0)
3479 p = unpack_varlen_hex (++p1, &val);
3480 ts->stop_time = val;
3482 else if (strncmp (p, "username", p1 - p) == 0)
3485 ts->user_name = (char *) xmalloc (strlen (p) / 2);
3486 end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1) / 2);
3487 ts->user_name[end] = '\0';
3490 else if (strncmp (p, "notes", p1 - p) == 0)
3493 ts->notes = (char *) xmalloc (strlen (p) / 2);
3494 end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
3495 ts->notes[end] = '\0';
3500 /* Silently skip unknown optional info. */
3501 p_temp = strchr (p1 + 1, ';');
3505 /* Must be at the end. */
3512 parse_tracepoint_status (const char *p, struct breakpoint *bp,
3513 struct uploaded_tp *utp)
3516 struct tracepoint *tp = (struct tracepoint *) bp;
3518 p = unpack_varlen_hex (p, &uval);
3520 tp->hit_count += uval;
3522 utp->hit_count += uval;
3523 p = unpack_varlen_hex (p + 1, &uval);
3525 tp->traceframe_usage += uval;
3527 utp->traceframe_usage += uval;
3528 /* Ignore any extra, allowing for future extensions. */
3531 /* Given a line of text defining a part of a tracepoint, parse it into
3532 an "uploaded tracepoint". */
3535 parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
3539 ULONGEST num, addr, step, pass, orig_size, xlen, start;
3542 const char *srctype;
3544 struct uploaded_tp *utp = NULL;
3547 /* Both tracepoint and action definitions start with the same number
3548 and address sequence. */
3550 p = unpack_varlen_hex (p, &num);
3551 p++; /* skip a colon */
3552 p = unpack_varlen_hex (p, &addr);
3553 p++; /* skip a colon */
3556 enabled = (*p++ == 'E');
3557 p++; /* skip a colon */
3558 p = unpack_varlen_hex (p, &step);
3559 p++; /* skip a colon */
3560 p = unpack_varlen_hex (p, &pass);
3561 type = bp_tracepoint;
3563 /* Thumb through optional fields. */
3566 p++; /* skip a colon */
3569 type = bp_fast_tracepoint;
3571 p = unpack_varlen_hex (p, &orig_size);
3575 type = bp_static_tracepoint;
3581 p = unpack_varlen_hex (p, &xlen);
3582 p++; /* skip a comma */
3583 cond = (char *) xmalloc (2 * xlen + 1);
3584 strncpy (cond, p, 2 * xlen);
3585 cond[2 * xlen] = '\0';
3589 warning (_("Unrecognized char '%c' in tracepoint "
3590 "definition, skipping rest"), *p);
3592 utp = get_uploaded_tp (num, addr, utpp);
3594 utp->enabled = enabled;
3599 else if (piece == 'A')
3601 utp = get_uploaded_tp (num, addr, utpp);
3602 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3604 else if (piece == 'S')
3606 utp = get_uploaded_tp (num, addr, utpp);
3607 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3609 else if (piece == 'Z')
3611 /* Parse a chunk of source form definition. */
3612 utp = get_uploaded_tp (num, addr, utpp);
3614 p = strchr (p, ':');
3615 p++; /* skip a colon */
3616 p = unpack_varlen_hex (p, &start);
3617 p++; /* skip a colon */
3618 p = unpack_varlen_hex (p, &xlen);
3619 p++; /* skip a colon */
3621 buf = (char *) alloca (strlen (line));
3623 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3626 if (startswith (srctype, "at:"))
3627 utp->at_string = xstrdup (buf);
3628 else if (startswith (srctype, "cond:"))
3629 utp->cond_string = xstrdup (buf);
3630 else if (startswith (srctype, "cmd:"))
3631 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3633 else if (piece == 'V')
3635 utp = get_uploaded_tp (num, addr, utpp);
3637 parse_tracepoint_status (p, NULL, utp);
3641 /* Don't error out, the target might be sending us optional
3642 info that we don't care about. */
3643 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3647 /* Convert a textual description of a trace state variable into an
3651 parse_tsv_definition (const char *line, struct uploaded_tsv **utsvp)
3655 ULONGEST num, initval, builtin;
3657 struct uploaded_tsv *utsv = NULL;
3659 buf = (char *) alloca (strlen (line));
3662 p = unpack_varlen_hex (p, &num);
3663 p++; /* skip a colon */
3664 p = unpack_varlen_hex (p, &initval);
3665 p++; /* skip a colon */
3666 p = unpack_varlen_hex (p, &builtin);
3667 p++; /* skip a colon */
3668 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3671 utsv = get_uploaded_tsv (num, utsvp);
3672 utsv->initial_value = initval;
3673 utsv->builtin = builtin;
3674 utsv->name = xstrdup (buf);
3678 free_current_marker (void *arg)
3680 struct static_tracepoint_marker **marker_p
3681 = (struct static_tracepoint_marker **) arg;
3683 if (*marker_p != NULL)
3685 release_static_tracepoint_marker (*marker_p);
3692 /* Given a line of text defining a static tracepoint marker, parse it
3693 into a "static tracepoint marker" object. Throws an error is
3694 parsing fails. If PP is non-null, it points to one past the end of
3695 the parsed marker definition. */
3698 parse_static_tracepoint_marker_definition (const char *line, const char **pp,
3699 struct static_tracepoint_marker *marker)
3701 const char *p, *endp;
3706 p = unpack_varlen_hex (p, &addr);
3707 p++; /* skip a colon */
3709 marker->gdbarch = target_gdbarch ();
3710 marker->address = (CORE_ADDR) addr;
3712 endp = strchr (p, ':');
3714 error (_("bad marker definition: %s"), line);
3716 marker->str_id = (char *) xmalloc (endp - p + 1);
3717 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
3718 marker->str_id[end] = '\0';
3721 p++; /* skip a colon */
3723 marker->extra = (char *) xmalloc (strlen (p) + 1);
3724 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
3725 marker->extra[end] = '\0';
3731 /* Release a static tracepoint marker's contents. Note that the
3732 object itself isn't released here. There objects are usually on
3736 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
3738 xfree (marker->str_id);
3739 marker->str_id = NULL;
3742 /* Print MARKER to gdb_stdout. */
3745 print_one_static_tracepoint_marker (int count,
3746 struct static_tracepoint_marker *marker)
3750 char wrap_indent[80];
3751 char extra_field_indent[80];
3752 struct ui_out *uiout = current_uiout;
3753 VEC(breakpoint_p) *tracepoints;
3755 symtab_and_line sal;
3756 sal.pc = marker->address;
3758 tracepoints = static_tracepoints_here (marker->address);
3760 ui_out_emit_tuple tuple_emitter (uiout, "marker");
3762 /* A counter field to help readability. This is not a stable
3764 uiout->field_int ("count", count);
3766 uiout->field_string ("marker-id", marker->str_id);
3768 uiout->field_fmt ("enabled", "%c",
3769 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
3772 strcpy (wrap_indent, " ");
3774 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
3775 strcat (wrap_indent, " ");
3777 strcat (wrap_indent, " ");
3779 strcpy (extra_field_indent, " ");
3781 uiout->field_core_addr ("addr", marker->gdbarch, marker->address);
3783 sal = find_pc_line (marker->address, 0);
3784 sym = find_pc_sect_function (marker->address, NULL);
3787 uiout->text ("in ");
3788 uiout->field_string ("func",
3789 SYMBOL_PRINT_NAME (sym));
3790 uiout->wrap_hint (wrap_indent);
3791 uiout->text (" at ");
3794 uiout->field_skip ("func");
3796 if (sal.symtab != NULL)
3798 uiout->field_string ("file",
3799 symtab_to_filename_for_display (sal.symtab));
3802 if (uiout->is_mi_like_p ())
3804 const char *fullname = symtab_to_fullname (sal.symtab);
3806 uiout->field_string ("fullname", fullname);
3809 uiout->field_skip ("fullname");
3811 uiout->field_int ("line", sal.line);
3815 uiout->field_skip ("fullname");
3816 uiout->field_skip ("line");
3820 uiout->text (extra_field_indent);
3821 uiout->text (_("Data: \""));
3822 uiout->field_string ("extra-data", marker->extra);
3823 uiout->text ("\"\n");
3825 if (!VEC_empty (breakpoint_p, tracepoints))
3828 struct breakpoint *b;
3831 ui_out_emit_tuple tuple_emitter (uiout, "tracepoints-at");
3833 uiout->text (extra_field_indent);
3834 uiout->text (_("Probed by static tracepoints: "));
3835 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
3840 uiout->field_int ("tracepoint-id", b->number);
3844 if (uiout->is_mi_like_p ())
3845 uiout->field_int ("number-of-tracepoints",
3846 VEC_length(breakpoint_p, tracepoints));
3850 VEC_free (breakpoint_p, tracepoints);
3854 info_static_tracepoint_markers_command (const char *arg, int from_tty)
3856 VEC(static_tracepoint_marker_p) *markers;
3857 struct cleanup *old_chain;
3858 struct static_tracepoint_marker *marker;
3859 struct ui_out *uiout = current_uiout;
3862 /* We don't have to check target_can_use_agent and agent's capability on
3863 static tracepoint here, in order to be compatible with older GDBserver.
3864 We don't check USE_AGENT is true or not, because static tracepoints
3865 don't work without in-process agent, so we don't bother users to type
3866 `set agent on' when to use static tracepoint. */
3868 ui_out_emit_table table_emitter (uiout, 5, -1,
3869 "StaticTracepointMarkersTable");
3871 uiout->table_header (7, ui_left, "counter", "Cnt");
3873 uiout->table_header (40, ui_left, "marker-id", "ID");
3875 uiout->table_header (3, ui_left, "enabled", "Enb");
3876 if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
3877 uiout->table_header (10, ui_left, "addr", "Address");
3879 uiout->table_header (18, ui_left, "addr", "Address");
3880 uiout->table_header (40, ui_noalign, "what", "What");
3882 uiout->table_body ();
3884 markers = target_static_tracepoint_markers_by_strid (NULL);
3885 old_chain = make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
3888 VEC_iterate (static_tracepoint_marker_p,
3889 markers, i, marker);
3892 print_one_static_tracepoint_marker (i + 1, marker);
3893 release_static_tracepoint_marker (marker);
3896 do_cleanups (old_chain);
3899 /* The $_sdata convenience variable is a bit special. We don't know
3900 for sure type of the value until we actually have a chance to fetch
3901 the data --- the size of the object depends on what has been
3902 collected. We solve this by making $_sdata be an internalvar that
3903 creates a new value on access. */
3905 /* Return a new value with the correct type for the sdata object of
3906 the current trace frame. Return a void value if there's no object
3909 static struct value *
3910 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
3916 /* We need to read the whole object before we know its size. */
3917 size = target_read_alloc (¤t_target,
3918 TARGET_OBJECT_STATIC_TRACE_DATA,
3925 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
3927 v = allocate_value (type);
3928 memcpy (value_contents_raw (v), buf, size);
3933 return allocate_value (builtin_type (gdbarch)->builtin_void);
3936 #if !defined(HAVE_LIBEXPAT)
3938 struct std::unique_ptr<traceframe_info>
3939 parse_traceframe_info (const char *tframe_info)
3941 static int have_warned;
3946 warning (_("Can not parse XML trace frame info; XML support "
3947 "was disabled at compile time"));
3953 #else /* HAVE_LIBEXPAT */
3955 #include "xml-support.h"
3957 /* Handle the start of a <memory> element. */
3960 traceframe_info_start_memory (struct gdb_xml_parser *parser,
3961 const struct gdb_xml_element *element,
3963 std::vector<gdb_xml_value> &attributes)
3965 struct traceframe_info *info = (struct traceframe_info *) user_data;
3966 ULONGEST *start_p, *length_p;
3969 = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get ();
3971 = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get ();
3973 info->memory.emplace_back (*start_p, *length_p);
3976 /* Handle the start of a <tvar> element. */
3979 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
3980 const struct gdb_xml_element *element,
3982 std::vector<gdb_xml_value> &attributes)
3984 struct traceframe_info *info = (struct traceframe_info *) user_data;
3985 const char *id_attrib
3986 = (const char *) xml_find_attribute (attributes, "id")->value.get ();
3987 int id = gdb_xml_parse_ulongest (parser, id_attrib);
3989 info->tvars.push_back (id);
3992 /* The allowed elements and attributes for an XML memory map. */
3994 static const struct gdb_xml_attribute memory_attributes[] = {
3995 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
3996 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
3997 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4000 static const struct gdb_xml_attribute tvar_attributes[] = {
4001 { "id", GDB_XML_AF_NONE, NULL, NULL },
4002 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4005 static const struct gdb_xml_element traceframe_info_children[] = {
4006 { "memory", memory_attributes, NULL,
4007 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4008 traceframe_info_start_memory, NULL },
4009 { "tvar", tvar_attributes, NULL,
4010 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4011 traceframe_info_start_tvar, NULL },
4012 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4015 static const struct gdb_xml_element traceframe_info_elements[] = {
4016 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4018 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4021 /* Parse a traceframe-info XML document. */
4024 parse_traceframe_info (const char *tframe_info)
4026 traceframe_info_up result (new traceframe_info);
4028 if (gdb_xml_parse_quick (_("trace frame info"),
4029 "traceframe-info.dtd", traceframe_info_elements,
4030 tframe_info, result.get ()) == 0)
4036 #endif /* HAVE_LIBEXPAT */
4038 /* Returns the traceframe_info object for the current traceframe.
4039 This is where we avoid re-fetching the object from the target if we
4040 already have it cached. */
4042 struct traceframe_info *
4043 get_traceframe_info (void)
4045 if (current_traceframe_info == NULL)
4046 current_traceframe_info = target_traceframe_info ();
4048 return current_traceframe_info.get ();
4051 /* If the target supports the query, return in RESULT the set of
4052 collected memory in the current traceframe, found within the LEN
4053 bytes range starting at MEMADDR. Returns true if the target
4054 supports the query, otherwise returns false, and RESULT is left
4058 traceframe_available_memory (std::vector<mem_range> *result,
4059 CORE_ADDR memaddr, ULONGEST len)
4061 struct traceframe_info *info = get_traceframe_info ();
4067 for (mem_range &r : info->memory)
4068 if (mem_ranges_overlap (r.start, r.length, memaddr, len))
4070 ULONGEST lo1, hi1, lo2, hi2;
4073 hi1 = memaddr + len;
4076 hi2 = r.start + r.length;
4078 CORE_ADDR start = std::max (lo1, lo2);
4079 int length = std::min (hi1, hi2) - start;
4081 result->emplace_back (start, length);
4084 normalize_mem_ranges (result);
4091 /* Implementation of `sdata' variable. */
4093 static const struct internalvar_funcs sdata_funcs =
4100 /* module initialization */
4102 _initialize_tracepoint (void)
4104 struct cmd_list_element *c;
4106 /* Explicitly create without lookup, since that tries to create a
4107 value with a void typed value, and when we get here, gdbarch
4108 isn't initialized yet. At this point, we're quite sure there
4109 isn't another convenience variable of the same name. */
4110 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
4112 traceframe_number = -1;
4113 tracepoint_number = -1;
4115 add_info ("scope", info_scope_command,
4116 _("List the variables local to a scope"));
4118 add_cmd ("tracepoints", class_trace,
4119 _("Tracing of program execution without stopping the program."),
4122 add_com ("tdump", class_trace, tdump_command,
4123 _("Print everything collected at the current tracepoint."));
4125 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4126 Define a trace state variable.\n\
4127 Argument is a $-prefixed name, optionally followed\n\
4128 by '=' and an expression that sets the initial value\n\
4129 at the start of tracing."));
4130 set_cmd_completer (c, expression_completer);
4132 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4133 Delete one or more trace state variables.\n\
4134 Arguments are the names of the variables to delete.\n\
4135 If no arguments are supplied, delete all variables."), &deletelist);
4136 /* FIXME add a trace variable completer. */
4138 add_info ("tvariables", info_tvariables_command, _("\
4139 Status of trace state variables and their values.\n\
4142 add_info ("static-tracepoint-markers",
4143 info_static_tracepoint_markers_command, _("\
4144 List target static tracepoints markers.\n\
4147 add_prefix_cmd ("tfind", class_trace, tfind_command, _("\
4148 Select a trace frame;\n\
4149 No argument means forward by one frame; '-' means backward by one frame."),
4150 &tfindlist, "tfind ", 1, &cmdlist);
4152 add_cmd ("outside", class_trace, tfind_outside_command, _("\
4153 Select a trace frame whose PC is outside the given range (exclusive).\n\
4154 Usage: tfind outside addr1, addr2"),
4157 add_cmd ("range", class_trace, tfind_range_command, _("\
4158 Select a trace frame whose PC is in the given range (inclusive).\n\
4159 Usage: tfind range addr1,addr2"),
4162 add_cmd ("line", class_trace, tfind_line_command, _("\
4163 Select a trace frame by source line.\n\
4164 Argument can be a line number (with optional source file),\n\
4165 a function name, or '*' followed by an address.\n\
4166 Default argument is 'the next source line that was traced'."),
4169 add_cmd ("tracepoint", class_trace, tfind_tracepoint_command, _("\
4170 Select a trace frame by tracepoint number.\n\
4171 Default is the tracepoint for the current trace frame."),
4174 add_cmd ("pc", class_trace, tfind_pc_command, _("\
4175 Select a trace frame by PC.\n\
4176 Default is the current PC, or the PC of the current trace frame."),
4179 add_cmd ("end", class_trace, tfind_end_command, _("\
4180 De-select any trace frame and resume 'live' debugging."),
4183 add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
4185 add_cmd ("start", class_trace, tfind_start_command,
4186 _("Select the first trace frame in the trace buffer."),
4189 add_com ("tstatus", class_trace, tstatus_command,
4190 _("Display the status of the current trace data collection."));
4192 add_com ("tstop", class_trace, tstop_command, _("\
4193 Stop trace data collection.\n\
4194 Usage: tstop [ <notes> ... ]\n\
4195 Any arguments supplied are recorded with the trace as a stop reason and\n\
4196 reported by tstatus (if the target supports trace notes)."));
4198 add_com ("tstart", class_trace, tstart_command, _("\
4199 Start trace data collection.\n\
4200 Usage: tstart [ <notes> ... ]\n\
4201 Any arguments supplied are recorded with the trace as a note and\n\
4202 reported by tstatus (if the target supports trace notes)."));
4204 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4205 Ends a list of commands or actions.\n\
4206 Several GDB commands allow you to enter a list of commands or actions.\n\
4207 Entering \"end\" on a line by itself is the normal way to terminate\n\
4209 Note: the \"end\" command cannot be used at the gdb prompt."));
4211 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4212 Specify single-stepping behavior at a tracepoint.\n\
4213 Argument is number of instructions to trace in single-step mode\n\
4214 following the tracepoint. This command is normally followed by\n\
4215 one or more \"collect\" commands, to specify what to collect\n\
4216 while single-stepping.\n\n\
4217 Note: this command can only be used in a tracepoint \"actions\" list."));
4219 add_com_alias ("ws", "while-stepping", class_alias, 0);
4220 add_com_alias ("stepping", "while-stepping", class_alias, 0);
4222 add_com ("collect", class_trace, collect_pseudocommand, _("\
4223 Specify one or more data items to be collected at a tracepoint.\n\
4224 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4225 collect all data (variables, registers) referenced by that expression.\n\
4226 Also accepts the following special arguments:\n\
4227 $regs -- all registers.\n\
4228 $args -- all function arguments.\n\
4229 $locals -- all variables local to the block/function scope.\n\
4230 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4231 Note: this command can only be used in a tracepoint \"actions\" list."));
4233 add_com ("teval", class_trace, teval_pseudocommand, _("\
4234 Specify one or more expressions to be evaluated at a tracepoint.\n\
4235 Accepts a comma-separated list of (one or more) expressions.\n\
4236 The result of each evaluation will be discarded.\n\
4237 Note: this command can only be used in a tracepoint \"actions\" list."));
4239 add_com ("actions", class_trace, actions_command, _("\
4240 Specify the actions to be taken at a tracepoint.\n\
4241 Tracepoint actions may include collecting of specified data,\n\
4242 single-stepping, or enabling/disabling other tracepoints,\n\
4243 depending on target's capabilities."));
4245 default_collect = xstrdup ("");
4246 add_setshow_string_cmd ("default-collect", class_trace,
4247 &default_collect, _("\
4248 Set the list of expressions to collect by default"), _("\
4249 Show the list of expressions to collect by default"), NULL,
4251 &setlist, &showlist);
4253 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4254 &disconnected_tracing, _("\
4255 Set whether tracing continues after GDB disconnects."), _("\
4256 Show whether tracing continues after GDB disconnects."), _("\
4257 Use this to continue a tracing run even if GDB disconnects\n\
4258 or detaches from the target. You can reconnect later and look at\n\
4259 trace data collected in the meantime."),
4260 set_disconnected_tracing,
4265 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4266 &circular_trace_buffer, _("\
4267 Set target's use of circular trace buffer."), _("\
4268 Show target's use of circular trace buffer."), _("\
4269 Use this to make the trace buffer into a circular buffer,\n\
4270 which will discard traceframes (oldest first) instead of filling\n\
4271 up and stopping the trace run."),
4272 set_circular_trace_buffer,
4277 add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
4278 &trace_buffer_size, _("\
4279 Set requested size of trace buffer."), _("\
4280 Show requested size of trace buffer."), _("\
4281 Use this to choose a size for the trace buffer. Some targets\n\
4282 may have fixed or limited buffer sizes. Specifying \"unlimited\" or -1\n\
4283 disables any attempt to set the buffer size and lets the target choose."),
4284 set_trace_buffer_size, NULL,
4285 &setlist, &showlist);
4287 add_setshow_string_cmd ("trace-user", class_trace,
4289 Set the user name to use for current and future trace runs"), _("\
4290 Show the user name to use for current and future trace runs"), NULL,
4291 set_trace_user, NULL,
4292 &setlist, &showlist);
4294 add_setshow_string_cmd ("trace-notes", class_trace,
4296 Set notes string to use for current and future trace runs"), _("\
4297 Show the notes string to use for current and future trace runs"), NULL,
4298 set_trace_notes, NULL,
4299 &setlist, &showlist);
4301 add_setshow_string_cmd ("trace-stop-notes", class_trace,
4302 &trace_stop_notes, _("\
4303 Set notes string to use for future tstop commands"), _("\
4304 Show the notes string to use for future tstop commands"), NULL,
4305 set_trace_stop_notes, NULL,
4306 &setlist, &showlist);