1 /* Tracing functionality for remote targets in custom GDB protocol
3 Copyright (C) 1997-2017 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 struct traceframe_info *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;
197 free_traceframe_info (struct traceframe_info *info)
201 VEC_free (mem_range_s, info->memory);
202 VEC_free (int, info->tvars);
208 /* Free and clear the traceframe info cache of the current
212 clear_traceframe_info (void)
214 free_traceframe_info (traceframe_info);
215 traceframe_info = NULL;
218 /* Set traceframe number to NUM. */
220 set_traceframe_num (int num)
222 traceframe_number = num;
223 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
226 /* Set tracepoint number to NUM. */
228 set_tracepoint_num (int num)
230 tracepoint_number = num;
231 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
234 /* Set externally visible debug variables for querying/printing
235 the traceframe context (line, function, file). */
238 set_traceframe_context (struct frame_info *trace_frame)
241 struct symbol *traceframe_fun;
242 symtab_and_line traceframe_sal;
244 /* Save as globals for internal use. */
245 if (trace_frame != NULL
246 && get_frame_pc_if_available (trace_frame, &trace_pc))
248 traceframe_sal = find_pc_line (trace_pc, 0);
249 traceframe_fun = find_pc_function (trace_pc);
251 /* Save linenumber as "$trace_line", a debugger variable visible to
253 set_internalvar_integer (lookup_internalvar ("trace_line"),
254 traceframe_sal.line);
258 traceframe_fun = NULL;
259 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
262 /* Save func name as "$trace_func", a debugger variable visible to
264 if (traceframe_fun == NULL
265 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
266 clear_internalvar (lookup_internalvar ("trace_func"));
268 set_internalvar_string (lookup_internalvar ("trace_func"),
269 SYMBOL_LINKAGE_NAME (traceframe_fun));
271 /* Save file name as "$trace_file", a debugger variable visible to
273 if (traceframe_sal.symtab == NULL)
274 clear_internalvar (lookup_internalvar ("trace_file"));
276 set_internalvar_string (lookup_internalvar ("trace_file"),
277 symtab_to_filename_for_display (traceframe_sal.symtab));
280 /* Create a new trace state variable with the given name. */
282 struct trace_state_variable *
283 create_trace_state_variable (const char *name)
285 struct trace_state_variable tsv;
287 memset (&tsv, 0, sizeof (tsv));
288 tsv.name = xstrdup (name);
289 tsv.number = next_tsv_number++;
290 return VEC_safe_push (tsv_s, tvariables, &tsv);
293 /* Look for a trace state variable of the given name. */
295 struct trace_state_variable *
296 find_trace_state_variable (const char *name)
298 struct trace_state_variable *tsv;
301 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
302 if (strcmp (name, tsv->name) == 0)
308 /* Look for a trace state variable of the given number. Return NULL if
311 struct trace_state_variable *
312 find_trace_state_variable_by_number (int number)
314 struct trace_state_variable *tsv;
317 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
318 if (tsv->number == number)
325 delete_trace_state_variable (const char *name)
327 struct trace_state_variable *tsv;
330 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
331 if (strcmp (name, tsv->name) == 0)
333 observer_notify_tsv_deleted (tsv);
335 xfree ((void *)tsv->name);
336 VEC_unordered_remove (tsv_s, tvariables, ix);
341 warning (_("No trace variable named \"$%s\", not deleting"), name);
344 /* Throws an error if NAME is not valid syntax for a trace state
348 validate_trace_state_variable_name (const char *name)
353 error (_("Must supply a non-empty variable name"));
355 /* All digits in the name is reserved for value history
357 for (p = name; isdigit (*p); p++)
360 error (_("$%s is not a valid trace state variable name"), name);
362 for (p = name; isalnum (*p) || *p == '_'; p++)
365 error (_("$%s is not a valid trace state variable name"), name);
368 /* The 'tvariable' command collects a name and optional expression to
369 evaluate into an initial value. */
372 trace_variable_command (char *args, int from_tty)
374 struct cleanup *old_chain;
376 struct trace_state_variable *tsv;
380 error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
382 /* Only allow two syntaxes; "$name" and "$name=value". */
383 p = skip_spaces (args);
386 error (_("Name of trace variable should start with '$'"));
389 while (isalnum (*p) || *p == '_')
391 name = savestring (name, p - name);
392 old_chain = make_cleanup (xfree, name);
395 if (*p != '=' && *p != '\0')
396 error (_("Syntax must be $NAME [ = EXPR ]"));
398 validate_trace_state_variable_name (name);
401 initval = value_as_long (parse_and_eval (++p));
403 /* If the variable already exists, just change its initial value. */
404 tsv = find_trace_state_variable (name);
407 if (tsv->initial_value != initval)
409 tsv->initial_value = initval;
410 observer_notify_tsv_modified (tsv);
412 printf_filtered (_("Trace state variable $%s "
413 "now has initial value %s.\n"),
414 tsv->name, plongest (tsv->initial_value));
415 do_cleanups (old_chain);
419 /* Create a new variable. */
420 tsv = create_trace_state_variable (name);
421 tsv->initial_value = initval;
423 observer_notify_tsv_created (tsv);
425 printf_filtered (_("Trace state variable $%s "
426 "created, with initial value %s.\n"),
427 tsv->name, plongest (tsv->initial_value));
429 do_cleanups (old_chain);
433 delete_trace_variable_command (const char *args, int from_tty)
437 if (query (_("Delete all trace state variables? ")))
438 VEC_free (tsv_s, tvariables);
440 observer_notify_tsv_deleted (NULL);
444 gdb_argv argv (args);
446 for (char *arg : argv)
449 delete_trace_state_variable (arg + 1);
451 warning (_("Name \"%s\" not prefixed with '$', ignoring"), arg);
458 tvariables_info_1 (void)
460 struct trace_state_variable *tsv;
463 struct ui_out *uiout = current_uiout;
465 if (VEC_length (tsv_s, tvariables) == 0 && !uiout->is_mi_like_p ())
467 printf_filtered (_("No trace state variables.\n"));
471 /* Try to acquire values from the target. */
472 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
473 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
476 ui_out_emit_table table_emitter (uiout, 3, count, "trace-variables");
477 uiout->table_header (15, ui_left, "name", "Name");
478 uiout->table_header (11, ui_left, "initial", "Initial");
479 uiout->table_header (11, ui_left, "current", "Current");
481 uiout->table_body ();
483 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
487 ui_out_emit_tuple tuple_emitter (uiout, "variable");
489 std::string name = std::string ("$") + tsv->name;
490 uiout->field_string ("name", name.c_str ());
491 uiout->field_string ("initial", plongest (tsv->initial_value));
493 if (tsv->value_known)
494 c = plongest (tsv->value);
495 else if (uiout->is_mi_like_p ())
496 /* For MI, we prefer not to use magic string constants, but rather
497 omit the field completely. The difference between unknown and
498 undefined does not seem important enough to represent. */
500 else if (current_trace_status ()->running || traceframe_number >= 0)
501 /* The value is/was defined, but we don't have it. */
504 /* It is not meaningful to ask about the value. */
507 uiout->field_string ("current", c);
512 /* List all the trace state variables. */
515 info_tvariables_command (char *args, int from_tty)
517 tvariables_info_1 ();
520 /* Stash definitions of tsvs into the given file. */
523 save_trace_state_variables (struct ui_file *fp)
525 struct trace_state_variable *tsv;
528 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
530 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
531 if (tsv->initial_value)
532 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
533 fprintf_unfiltered (fp, "\n");
537 /* ACTIONS functions: */
539 /* The three functions:
540 collect_pseudocommand,
541 while_stepping_pseudocommand, and
542 end_actions_pseudocommand
543 are placeholders for "commands" that are actually ONLY to be used
544 within a tracepoint action list. If the actual function is ever called,
545 it means that somebody issued the "command" at the top level,
546 which is always an error. */
549 end_actions_pseudocommand (char *args, int from_tty)
551 error (_("This command cannot be used at the top level."));
555 while_stepping_pseudocommand (char *args, int from_tty)
557 error (_("This command can only be used in a tracepoint actions list."));
561 collect_pseudocommand (char *args, int from_tty)
563 error (_("This command can only be used in a tracepoint actions list."));
567 teval_pseudocommand (char *args, int from_tty)
569 error (_("This command can only be used in a tracepoint actions list."));
572 /* Parse any collection options, such as /s for strings. */
575 decode_agent_options (const char *exp, int *trace_string)
577 struct value_print_options opts;
584 /* Call this to borrow the print elements default for collection
586 get_user_print_options (&opts);
591 if (target_supports_string_tracing ())
593 /* Allow an optional decimal number giving an explicit maximum
594 string length, defaulting it to the "print elements" value;
595 so "collect/s80 mystr" gets at most 80 bytes of string. */
596 *trace_string = opts.print_max;
598 if (*exp >= '0' && *exp <= '9')
599 *trace_string = atoi (exp);
600 while (*exp >= '0' && *exp <= '9')
604 error (_("Target does not support \"/s\" option for string tracing."));
607 error (_("Undefined collection format \"%c\"."), *exp);
609 exp = skip_spaces (exp);
614 /* Enter a list of actions for a tracepoint. */
616 actions_command (char *args, int from_tty)
618 struct tracepoint *t;
620 t = get_tracepoint_by_number (&args, NULL);
624 string_printf ("Enter actions for tracepoint %d, one per line.",
627 command_line_up l = read_command_lines (&tmpbuf[0], from_tty, 1,
628 check_tracepoint_command, t);
629 breakpoint_set_commands (t, std::move (l));
631 /* else just return */
634 /* Report the results of checking the agent expression, as errors or
638 report_agent_reqs_errors (struct agent_expr *aexpr)
640 /* All of the "flaws" are serious bytecode generation issues that
641 should never occur. */
642 if (aexpr->flaw != agent_flaw_none)
643 internal_error (__FILE__, __LINE__, _("expression is malformed"));
645 /* If analysis shows a stack underflow, GDB must have done something
646 badly wrong in its bytecode generation. */
647 if (aexpr->min_height < 0)
648 internal_error (__FILE__, __LINE__,
649 _("expression has min height < 0"));
651 /* Issue this error if the stack is predicted to get too deep. The
652 limit is rather arbitrary; a better scheme might be for the
653 target to report how much stack it will have available. The
654 depth roughly corresponds to parenthesization, so a limit of 20
655 amounts to 20 levels of expression nesting, which is actually
656 a pretty big hairy expression. */
657 if (aexpr->max_height > 20)
658 error (_("Expression is too complicated."));
661 /* worker function */
663 validate_actionline (const char *line, struct breakpoint *b)
665 struct cmd_list_element *c;
666 struct cleanup *old_chain = NULL;
669 struct bp_location *loc;
670 struct tracepoint *t = (struct tracepoint *) b;
672 /* If EOF is typed, *line is NULL. */
676 p = skip_spaces (line);
678 /* Symbol lookup etc. */
679 if (*p == '\0') /* empty line: just prompt for another line. */
682 if (*p == '#') /* comment line */
685 c = lookup_cmd (&p, cmdlist, "", -1, 1);
687 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
689 if (cmd_cfunc_eq (c, collect_pseudocommand))
691 int trace_string = 0;
694 p = decode_agent_options (p, &trace_string);
697 { /* Repeat over a comma-separated list. */
698 QUIT; /* Allow user to bail out with ^C. */
701 if (*p == '$') /* Look for special pseudo-symbols. */
703 if (0 == strncasecmp ("reg", p + 1, 3)
704 || 0 == strncasecmp ("arg", p + 1, 3)
705 || 0 == strncasecmp ("loc", p + 1, 3)
706 || 0 == strncasecmp ("_ret", p + 1, 4)
707 || 0 == strncasecmp ("_sdata", p + 1, 6))
712 /* else fall thru, treat p as an expression and parse it! */
715 for (loc = t->loc; loc; loc = loc->next)
718 expression_up exp = parse_exp_1 (&p, loc->address,
719 block_for_pc (loc->address), 1);
721 if (exp->elts[0].opcode == OP_VAR_VALUE)
723 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
725 error (_("constant `%s' (value %s) "
726 "will not be collected."),
727 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
728 plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
730 else if (SYMBOL_CLASS (exp->elts[2].symbol)
731 == LOC_OPTIMIZED_OUT)
733 error (_("`%s' is optimized away "
734 "and cannot be collected."),
735 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
739 /* We have something to collect, make sure that the expr to
740 bytecode translator can handle it and that it's not too
742 agent_expr_up aexpr = gen_trace_for_expr (loc->address,
746 if (aexpr->len > MAX_AGENT_EXPR_LEN)
747 error (_("Expression is too complicated."));
749 ax_reqs (aexpr.get ());
751 report_agent_reqs_errors (aexpr.get ());
754 while (p && *p++ == ',');
757 else if (cmd_cfunc_eq (c, teval_pseudocommand))
760 { /* Repeat over a comma-separated list. */
761 QUIT; /* Allow user to bail out with ^C. */
765 for (loc = t->loc; loc; loc = loc->next)
769 /* Only expressions are allowed for this action. */
770 expression_up exp = parse_exp_1 (&p, loc->address,
771 block_for_pc (loc->address), 1);
773 /* We have something to evaluate, make sure that the expr to
774 bytecode translator can handle it and that it's not too
776 agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
778 if (aexpr->len > MAX_AGENT_EXPR_LEN)
779 error (_("Expression is too complicated."));
781 ax_reqs (aexpr.get ());
782 report_agent_reqs_errors (aexpr.get ());
785 while (p && *p++ == ',');
788 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
793 t->step_count = strtol (p, &endp, 0);
794 if (endp == p || t->step_count == 0)
795 error (_("while-stepping step count `%s' is malformed."), line);
799 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
803 error (_("`%s' is not a supported tracepoint action."), line);
807 memrange_absolute = -1
810 /* MEMRANGE functions: */
812 /* Compare memranges for std::sort. */
815 memrange_comp (const memrange &a, const memrange &b)
817 if (a.type == b.type)
819 if (a.type == memrange_absolute)
820 return (bfd_vma) a.start < (bfd_vma) b.start;
822 return a.start < b.start;
825 return a.type < b.type;
828 /* Sort the memrange list using std::sort, and merge adjacent memranges. */
831 memrange_sortmerge (std::vector<memrange> &memranges)
833 if (!memranges.empty ())
837 std::sort (memranges.begin (), memranges.end (), memrange_comp);
839 for (a = 0, b = 1; b < memranges.size (); b++)
841 /* If memrange b overlaps or is adjacent to memrange a,
843 if (memranges[a].type == memranges[b].type
844 && memranges[b].start <= memranges[a].end)
846 if (memranges[b].end > memranges[a].end)
847 memranges[a].end = memranges[b].end;
848 continue; /* next b, same a */
852 memranges[a] = memranges[b];
854 memranges.resize (a + 1);
858 /* Add a register to a collection list. */
861 collection_list::add_register (unsigned int regno)
864 printf_filtered ("collect register %d\n", regno);
865 if (regno >= (8 * sizeof (m_regs_mask)))
866 error (_("Internal: register number %d too large for tracepoint"),
868 m_regs_mask[regno / 8] |= 1 << (regno % 8);
871 /* Add a memrange to a collection list. */
874 collection_list::add_memrange (struct gdbarch *gdbarch,
875 int type, bfd_signed_vma base,
879 printf_filtered ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len);
881 /* type: memrange_absolute == memory, other n == basereg */
882 /* base: addr if memory, offset if reg relative. */
883 /* len: we actually save end (base + len) for convenience */
884 m_memranges.emplace_back (type, base, base + len);
886 if (type != memrange_absolute) /* Better collect the base register! */
890 /* Add a symbol to a collection list. */
893 collection_list::collect_symbol (struct symbol *sym,
894 struct gdbarch *gdbarch,
895 long frame_regno, long frame_offset,
901 bfd_signed_vma offset;
902 int treat_as_expr = 0;
904 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
905 switch (SYMBOL_CLASS (sym))
908 printf_filtered ("%s: don't know symbol class %d\n",
909 SYMBOL_PRINT_NAME (sym),
913 printf_filtered ("constant %s (value %s) will not be collected.\n",
914 SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
917 offset = SYMBOL_VALUE_ADDRESS (sym);
920 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
921 SYMBOL_PRINT_NAME (sym), len,
922 paddress (gdbarch, offset));
924 /* A struct may be a C++ class with static fields, go to general
925 expression handling. */
926 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
929 add_memrange (gdbarch, memrange_absolute, offset, len);
932 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
934 printf_filtered ("LOC_REG[parm] %s: ",
935 SYMBOL_PRINT_NAME (sym));
937 /* Check for doubles stored in two registers. */
938 /* FIXME: how about larger types stored in 3 or more regs? */
939 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
940 len > register_size (gdbarch, reg))
941 add_register (reg + 1);
944 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
945 printf_filtered (" (will not collect %s)\n",
946 SYMBOL_PRINT_NAME (sym));
950 offset = frame_offset + SYMBOL_VALUE (sym);
953 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
954 " from frame ptr reg %d\n",
955 SYMBOL_PRINT_NAME (sym), len,
956 paddress (gdbarch, offset), reg);
958 add_memrange (gdbarch, reg, offset, len);
960 case LOC_REGPARM_ADDR:
961 reg = SYMBOL_VALUE (sym);
965 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
967 SYMBOL_PRINT_NAME (sym), len,
968 paddress (gdbarch, offset), reg);
970 add_memrange (gdbarch, reg, offset, len);
974 offset = frame_offset + SYMBOL_VALUE (sym);
977 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
978 " from frame ptr reg %d\n",
979 SYMBOL_PRINT_NAME (sym), len,
980 paddress (gdbarch, offset), reg);
982 add_memrange (gdbarch, reg, offset, len);
989 case LOC_OPTIMIZED_OUT:
990 printf_filtered ("%s has been optimized out of existence.\n",
991 SYMBOL_PRINT_NAME (sym));
999 /* Expressions are the most general case. */
1002 struct cleanup *old_chain1 = NULL;
1004 agent_expr_up aexpr = gen_trace_for_var (scope, gdbarch,
1007 /* It can happen that the symbol is recorded as a computed
1008 location, but it's been optimized away and doesn't actually
1009 have a location expression. */
1012 printf_filtered ("%s has been optimized out of existence.\n",
1013 SYMBOL_PRINT_NAME (sym));
1017 ax_reqs (aexpr.get ());
1019 report_agent_reqs_errors (aexpr.get ());
1021 /* Take care of the registers. */
1022 if (aexpr->reg_mask_len > 0)
1024 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1026 QUIT; /* Allow user to bail out with ^C. */
1027 if (aexpr->reg_mask[ndx1] != 0)
1029 /* Assume chars have 8 bits. */
1030 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1031 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1032 /* It's used -- record it. */
1033 add_register (ndx1 * 8 + ndx2);
1038 add_aexpr (std::move (aexpr));
1042 /* Data to be passed around in the calls to the locals and args
1045 struct add_local_symbols_data
1047 struct collection_list *collect;
1048 struct gdbarch *gdbarch;
1056 /* The callback for the locals and args iterators. */
1059 do_collect_symbol (const char *print_name,
1063 struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
1065 p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
1066 p->frame_offset, p->pc, p->trace_string);
1069 p->collect->add_wholly_collected (print_name);
1073 collection_list::add_wholly_collected (const char *print_name)
1075 m_wholly_collected.push_back (print_name);
1078 /* Add all locals (or args) symbols to collection list. */
1081 collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
1082 long frame_regno, long frame_offset, int type,
1085 const struct block *block;
1086 struct add_local_symbols_data cb_data;
1088 cb_data.collect = this;
1089 cb_data.gdbarch = gdbarch;
1091 cb_data.frame_regno = frame_regno;
1092 cb_data.frame_offset = frame_offset;
1094 cb_data.trace_string = trace_string;
1098 block = block_for_pc (pc);
1101 warning (_("Can't collect locals; "
1102 "no symbol table info available.\n"));
1106 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1107 if (cb_data.count == 0)
1108 warning (_("No locals found in scope."));
1112 pc = get_pc_function_start (pc);
1113 block = block_for_pc (pc);
1116 warning (_("Can't collect args; no symbol table info available."));
1120 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1121 if (cb_data.count == 0)
1122 warning (_("No args found in scope."));
1127 collection_list::add_static_trace_data ()
1130 printf_filtered ("collect static trace data\n");
1131 m_strace_data = true;
1134 collection_list::collection_list ()
1136 m_strace_data (false)
1138 m_memranges.reserve (128);
1139 m_aexprs.reserve (128);
1142 /* Reduce a collection list to string form (for gdb protocol). */
1145 collection_list::stringify ()
1147 char temp_buf[2048];
1150 char *(*str_list)[];
1154 count = 1 + 1 + m_memranges.size () + m_aexprs.size () + 1;
1155 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1160 printf_filtered ("\nCollecting static trace data\n");
1163 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1167 for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
1168 if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1170 if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1173 printf_filtered ("\nCollecting registers (mask): 0x");
1178 QUIT; /* Allow user to bail out with ^C. */
1180 printf_filtered ("%02X", m_regs_mask[i]);
1181 sprintf (end, "%02X", m_regs_mask[i]);
1184 (*str_list)[ndx] = xstrdup (temp_buf);
1188 printf_filtered ("\n");
1189 if (!m_memranges.empty () && info_verbose)
1190 printf_filtered ("Collecting memranges: \n");
1191 for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
1193 QUIT; /* Allow user to bail out with ^C. */
1196 printf_filtered ("(%d, %s, %ld)\n",
1197 m_memranges[i].type,
1198 paddress (target_gdbarch (),
1199 m_memranges[i].start),
1200 (long) (m_memranges[i].end
1201 - m_memranges[i].start));
1203 if (count + 27 > MAX_AGENT_EXPR_LEN)
1205 (*str_list)[ndx] = savestring (temp_buf, count);
1212 bfd_signed_vma length
1213 = m_memranges[i].end - m_memranges[i].start;
1215 /* The "%X" conversion specifier expects an unsigned argument,
1216 so passing -1 (memrange_absolute) to it directly gives you
1217 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1219 if (m_memranges[i].type == memrange_absolute)
1220 sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0),
1223 sprintf (end, "M%X,%s,%lX", m_memranges[i].type,
1224 phex_nz (m_memranges[i].start, 0), (long) length);
1227 count += strlen (end);
1228 end = temp_buf + count;
1231 for (i = 0; i < m_aexprs.size (); i++)
1233 QUIT; /* Allow user to bail out with ^C. */
1234 if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
1236 (*str_list)[ndx] = savestring (temp_buf, count);
1241 sprintf (end, "X%08X,", m_aexprs[i]->len);
1242 end += 10; /* 'X' + 8 hex digits + ',' */
1245 end = mem2hex (m_aexprs[i]->buf, end, m_aexprs[i]->len);
1246 count += 2 * m_aexprs[i]->len;
1251 (*str_list)[ndx] = savestring (temp_buf, count);
1256 (*str_list)[ndx] = NULL;
1267 /* Add the printed expression EXP to *LIST. */
1270 collection_list::append_exp (struct expression *exp)
1272 string_file tmp_stream;
1274 print_expression (exp, &tmp_stream);
1276 m_computed.push_back (std::move (tmp_stream.string ()));
1280 collection_list::finish ()
1282 memrange_sortmerge (m_memranges);
1286 encode_actions_1 (struct command_line *action,
1287 struct bp_location *tloc,
1289 LONGEST frame_offset,
1290 struct collection_list *collect,
1291 struct collection_list *stepping_list)
1293 const char *action_exp;
1295 struct value *tempval;
1296 struct cmd_list_element *cmd;
1298 for (; action; action = action->next)
1300 QUIT; /* Allow user to bail out with ^C. */
1301 action_exp = action->line;
1302 action_exp = skip_spaces (action_exp);
1304 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1306 error (_("Bad action list item: %s"), action_exp);
1308 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1310 int trace_string = 0;
1312 if (*action_exp == '/')
1313 action_exp = decode_agent_options (action_exp, &trace_string);
1316 { /* Repeat over a comma-separated list. */
1317 QUIT; /* Allow user to bail out with ^C. */
1318 action_exp = skip_spaces (action_exp);
1320 if (0 == strncasecmp ("$reg", action_exp, 4))
1322 for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
1323 collect->add_register (i);
1324 action_exp = strchr (action_exp, ','); /* more? */
1326 else if (0 == strncasecmp ("$arg", action_exp, 4))
1328 collect->add_local_symbols (target_gdbarch (),
1334 action_exp = strchr (action_exp, ','); /* more? */
1336 else if (0 == strncasecmp ("$loc", action_exp, 4))
1338 collect->add_local_symbols (target_gdbarch (),
1344 action_exp = strchr (action_exp, ','); /* more? */
1346 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1349 = gen_trace_for_return_address (tloc->address,
1353 ax_reqs (aexpr.get ());
1354 report_agent_reqs_errors (aexpr.get ());
1356 /* take care of the registers */
1357 if (aexpr->reg_mask_len > 0)
1359 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1361 QUIT; /* allow user to bail out with ^C */
1362 if (aexpr->reg_mask[ndx1] != 0)
1364 /* assume chars have 8 bits */
1365 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1366 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1368 /* It's used -- record it. */
1369 collect->add_register (ndx1 * 8 + ndx2);
1375 collect->add_aexpr (std::move (aexpr));
1376 action_exp = strchr (action_exp, ','); /* more? */
1378 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1380 collect->add_static_trace_data ();
1381 action_exp = strchr (action_exp, ','); /* more? */
1386 struct cleanup *old_chain1 = NULL;
1388 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1389 block_for_pc (tloc->address),
1392 switch (exp->elts[0].opcode)
1396 const char *name = &exp->elts[2].string;
1398 i = user_reg_map_name_to_regnum (target_gdbarch (),
1399 name, strlen (name));
1401 internal_error (__FILE__, __LINE__,
1402 _("Register $%s not available"),
1405 printf_filtered ("OP_REGISTER: ");
1406 collect->add_register (i);
1411 /* Safe because we know it's a simple expression. */
1412 tempval = evaluate_expression (exp.get ());
1413 addr = value_address (tempval);
1414 /* Initialize the TYPE_LENGTH if it is a typedef. */
1415 check_typedef (exp->elts[1].type);
1416 collect->add_memrange (target_gdbarch (),
1417 memrange_absolute, addr,
1418 TYPE_LENGTH (exp->elts[1].type));
1419 collect->append_exp (exp.get ());
1424 struct symbol *sym = exp->elts[2].symbol;
1425 char_ptr name = (char_ptr) SYMBOL_NATURAL_NAME (sym);
1427 collect->collect_symbol (exp->elts[2].symbol,
1433 collect->add_wholly_collected (name);
1437 default: /* Full-fledged expression. */
1438 agent_expr_up aexpr = gen_trace_for_expr (tloc->address,
1442 ax_reqs (aexpr.get ());
1444 report_agent_reqs_errors (aexpr.get ());
1446 /* Take care of the registers. */
1447 if (aexpr->reg_mask_len > 0)
1449 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1451 QUIT; /* Allow user to bail out with ^C. */
1452 if (aexpr->reg_mask[ndx1] != 0)
1454 /* Assume chars have 8 bits. */
1455 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1456 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1458 /* It's used -- record it. */
1459 collect->add_register (ndx1 * 8 + ndx2);
1465 collect->add_aexpr (std::move (aexpr));
1466 collect->append_exp (exp.get ());
1471 while (action_exp && *action_exp++ == ',');
1473 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1476 { /* Repeat over a comma-separated list. */
1477 QUIT; /* Allow user to bail out with ^C. */
1478 action_exp = skip_spaces (action_exp);
1481 struct cleanup *old_chain1 = NULL;
1483 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1484 block_for_pc (tloc->address),
1487 agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
1490 ax_reqs (aexpr.get ());
1491 report_agent_reqs_errors (aexpr.get ());
1493 /* Even though we're not officially collecting, add
1494 to the collect list anyway. */
1495 collect->add_aexpr (std::move (aexpr));
1498 while (action_exp && *action_exp++ == ',');
1500 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1502 /* We check against nested while-stepping when setting
1503 breakpoint action, so no way to run into nested
1505 gdb_assert (stepping_list);
1507 encode_actions_1 (action->body_list[0], tloc, frame_reg,
1508 frame_offset, stepping_list, NULL);
1511 error (_("Invalid tracepoint command '%s'"), action->line);
1515 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
1516 and STEPPING_LIST. */
1519 encode_actions (struct bp_location *tloc,
1520 struct collection_list *tracepoint_list,
1521 struct collection_list *stepping_list)
1523 struct command_line *actions;
1525 LONGEST frame_offset;
1527 gdbarch_virtual_frame_pointer (tloc->gdbarch,
1528 tloc->address, &frame_reg, &frame_offset);
1530 actions = all_tracepoint_actions_and_cleanup (tloc->owner);
1532 encode_actions_1 (actions, tloc, frame_reg, frame_offset,
1533 tracepoint_list, stepping_list);
1535 tracepoint_list->finish ();
1536 stepping_list->finish ();
1539 /* Render all actions into gdb protocol. */
1542 encode_actions_rsp (struct bp_location *tloc, char ***tdp_actions,
1543 char ***stepping_actions)
1545 struct collection_list tracepoint_list, stepping_list;
1547 *tdp_actions = NULL;
1548 *stepping_actions = NULL;
1550 encode_actions (tloc, &tracepoint_list, &stepping_list);
1552 *tdp_actions = tracepoint_list.stringify ();
1553 *stepping_actions = stepping_list.stringify ();
1557 collection_list::add_aexpr (agent_expr_up aexpr)
1559 m_aexprs.push_back (std::move (aexpr));
1563 process_tracepoint_on_disconnect (void)
1565 VEC(breakpoint_p) *tp_vec = NULL;
1567 struct breakpoint *b;
1568 int has_pending_p = 0;
1570 /* Check whether we still have pending tracepoint. If we have, warn the
1571 user that pending tracepoint will no longer work. */
1572 tp_vec = all_tracepoints ();
1573 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1582 struct bp_location *loc1;
1584 for (loc1 = b->loc; loc1; loc1 = loc1->next)
1586 if (loc1->shlib_disabled)
1597 VEC_free (breakpoint_p, tp_vec);
1600 warning (_("Pending tracepoints will not be resolved while"
1601 " GDB is disconnected\n"));
1604 /* Reset local state of tracing. */
1607 trace_reset_local_state (void)
1609 set_traceframe_num (-1);
1610 set_tracepoint_num (-1);
1611 set_traceframe_context (NULL);
1612 clear_traceframe_info ();
1616 start_tracing (char *notes)
1618 VEC(breakpoint_p) *tp_vec = NULL;
1620 struct breakpoint *b;
1621 struct trace_state_variable *tsv;
1622 int any_enabled = 0, num_to_download = 0;
1625 tp_vec = all_tracepoints ();
1627 /* No point in tracing without any tracepoints... */
1628 if (VEC_length (breakpoint_p, tp_vec) == 0)
1630 VEC_free (breakpoint_p, tp_vec);
1631 error (_("No tracepoints defined, not starting trace"));
1634 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1636 if (b->enable_state == bp_enabled)
1639 if ((b->type == bp_fast_tracepoint
1640 ? may_insert_fast_tracepoints
1641 : may_insert_tracepoints))
1644 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1645 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1650 if (target_supports_enable_disable_tracepoint ())
1651 warning (_("No tracepoints enabled"));
1654 /* No point in tracing with only disabled tracepoints that
1655 cannot be re-enabled. */
1656 VEC_free (breakpoint_p, tp_vec);
1657 error (_("No tracepoints enabled, not starting trace"));
1661 if (num_to_download <= 0)
1663 VEC_free (breakpoint_p, tp_vec);
1664 error (_("No tracepoints that may be downloaded, not starting trace"));
1667 target_trace_init ();
1669 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1671 struct tracepoint *t = (struct tracepoint *) b;
1672 struct bp_location *loc;
1673 int bp_location_downloaded = 0;
1675 /* Clear `inserted' flag. */
1676 for (loc = b->loc; loc; loc = loc->next)
1679 if ((b->type == bp_fast_tracepoint
1680 ? !may_insert_fast_tracepoints
1681 : !may_insert_tracepoints))
1684 t->number_on_target = 0;
1686 for (loc = b->loc; loc; loc = loc->next)
1688 /* Since tracepoint locations are never duplicated, `inserted'
1689 flag should be zero. */
1690 gdb_assert (!loc->inserted);
1692 target_download_tracepoint (loc);
1695 bp_location_downloaded = 1;
1698 t->number_on_target = b->number;
1700 for (loc = b->loc; loc; loc = loc->next)
1701 if (loc->probe.probe != NULL
1702 && loc->probe.probe->pops->set_semaphore != NULL)
1703 loc->probe.probe->pops->set_semaphore (loc->probe.probe,
1707 if (bp_location_downloaded)
1708 observer_notify_breakpoint_modified (b);
1710 VEC_free (breakpoint_p, tp_vec);
1712 /* Send down all the trace state variables too. */
1713 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1715 target_download_trace_state_variable (tsv);
1718 /* Tell target to treat text-like sections as transparent. */
1719 target_trace_set_readonly_regions ();
1720 /* Set some mode flags. */
1721 target_set_disconnected_tracing (disconnected_tracing);
1722 target_set_circular_trace_buffer (circular_trace_buffer);
1723 target_set_trace_buffer_size (trace_buffer_size);
1726 notes = trace_notes;
1727 ret = target_set_trace_notes (trace_user, notes, NULL);
1729 if (!ret && (trace_user || notes))
1730 warning (_("Target does not support trace user/notes, info ignored"));
1732 /* Now insert traps and begin collecting data. */
1733 target_trace_start ();
1735 /* Reset our local state. */
1736 trace_reset_local_state ();
1737 current_trace_status()->running = 1;
1740 /* The tstart command requests the target to start a new trace run.
1741 The command passes any arguments it has to the target verbatim, as
1742 an optional "trace note". This is useful as for instance a warning
1743 to other users if the trace runs disconnected, and you don't want
1744 anybody else messing with the target. */
1747 tstart_command (char *args, int from_tty)
1749 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1751 if (current_trace_status ()->running)
1754 && !query (_("A trace is running already. Start a new run? ")))
1755 error (_("New trace run not started."));
1758 start_tracing (args);
1761 /* The tstop command stops the tracing run. The command passes any
1762 supplied arguments to the target verbatim as a "stop note"; if the
1763 target supports trace notes, then it will be reported back as part
1764 of the trace run's status. */
1767 tstop_command (char *args, int from_tty)
1769 if (!current_trace_status ()->running)
1770 error (_("Trace is not running."));
1772 stop_tracing (args);
1776 stop_tracing (char *note)
1779 VEC(breakpoint_p) *tp_vec = NULL;
1781 struct breakpoint *t;
1783 target_trace_stop ();
1785 tp_vec = all_tracepoints ();
1786 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1788 struct bp_location *loc;
1790 if ((t->type == bp_fast_tracepoint
1791 ? !may_insert_fast_tracepoints
1792 : !may_insert_tracepoints))
1795 for (loc = t->loc; loc; loc = loc->next)
1797 /* GDB can be totally absent in some disconnected trace scenarios,
1798 but we don't really care if this semaphore goes out of sync.
1799 That's why we are decrementing it here, but not taking care
1801 if (loc->probe.probe != NULL
1802 && loc->probe.probe->pops->clear_semaphore != NULL)
1803 loc->probe.probe->pops->clear_semaphore (loc->probe.probe,
1809 VEC_free (breakpoint_p, tp_vec);
1812 note = trace_stop_notes;
1813 ret = target_set_trace_notes (NULL, NULL, note);
1816 warning (_("Target does not support trace notes, note ignored"));
1818 /* Should change in response to reply? */
1819 current_trace_status ()->running = 0;
1822 /* tstatus command */
1824 tstatus_command (char *args, int from_tty)
1826 struct trace_status *ts = current_trace_status ();
1828 VEC(breakpoint_p) *tp_vec = NULL;
1829 struct breakpoint *t;
1831 status = target_get_trace_status (ts);
1835 if (ts->filename != NULL)
1836 printf_filtered (_("Using a trace file.\n"));
1839 printf_filtered (_("Trace can not be run on this target.\n"));
1844 if (!ts->running_known)
1846 printf_filtered (_("Run/stop status is unknown.\n"));
1848 else if (ts->running)
1850 printf_filtered (_("Trace is running on the target.\n"));
1854 switch (ts->stop_reason)
1856 case trace_never_run:
1857 printf_filtered (_("No trace has been run on the target.\n"));
1859 case trace_stop_command:
1861 printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1864 printf_filtered (_("Trace stopped by a tstop command.\n"));
1866 case trace_buffer_full:
1867 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1869 case trace_disconnected:
1870 printf_filtered (_("Trace stopped because of disconnection.\n"));
1872 case tracepoint_passcount:
1873 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1874 ts->stopping_tracepoint);
1876 case tracepoint_error:
1877 if (ts->stopping_tracepoint)
1878 printf_filtered (_("Trace stopped by an "
1879 "error (%s, tracepoint %d).\n"),
1880 ts->stop_desc, ts->stopping_tracepoint);
1882 printf_filtered (_("Trace stopped by an error (%s).\n"),
1885 case trace_stop_reason_unknown:
1886 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1889 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1895 if (ts->traceframes_created >= 0
1896 && ts->traceframe_count != ts->traceframes_created)
1898 printf_filtered (_("Buffer contains %d trace "
1899 "frames (of %d created total).\n"),
1900 ts->traceframe_count, ts->traceframes_created);
1902 else if (ts->traceframe_count >= 0)
1904 printf_filtered (_("Collected %d trace frames.\n"),
1905 ts->traceframe_count);
1908 if (ts->buffer_free >= 0)
1910 if (ts->buffer_size >= 0)
1912 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1913 ts->buffer_free, ts->buffer_size);
1914 if (ts->buffer_size > 0)
1915 printf_filtered (_(" (%d%% full)"),
1916 ((int) ((((long long) (ts->buffer_size
1917 - ts->buffer_free)) * 100)
1918 / ts->buffer_size)));
1919 printf_filtered (_(".\n"));
1922 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1926 if (ts->disconnected_tracing)
1927 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1929 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1931 if (ts->circular_buffer)
1932 printf_filtered (_("Trace buffer is circular.\n"));
1934 if (ts->user_name && strlen (ts->user_name) > 0)
1935 printf_filtered (_("Trace user is %s.\n"), ts->user_name);
1937 if (ts->notes && strlen (ts->notes) > 0)
1938 printf_filtered (_("Trace notes: %s.\n"), ts->notes);
1940 /* Now report on what we're doing with tfind. */
1941 if (traceframe_number >= 0)
1942 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1943 traceframe_number, tracepoint_number);
1945 printf_filtered (_("Not looking at any trace frame.\n"));
1947 /* Report start/stop times if supplied. */
1952 LONGEST run_time = ts->stop_time - ts->start_time;
1954 /* Reporting a run time is more readable than two long numbers. */
1955 printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
1956 (long int) (ts->start_time / 1000000),
1957 (long int) (ts->start_time % 1000000),
1958 (long int) (run_time / 1000000),
1959 (long int) (run_time % 1000000));
1962 printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
1963 (long int) (ts->start_time / 1000000),
1964 (long int) (ts->start_time % 1000000));
1966 else if (ts->stop_time)
1967 printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
1968 (long int) (ts->stop_time / 1000000),
1969 (long int) (ts->stop_time % 1000000));
1971 /* Now report any per-tracepoint status available. */
1972 tp_vec = all_tracepoints ();
1974 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1975 target_get_tracepoint_status (t, NULL);
1977 VEC_free (breakpoint_p, tp_vec);
1980 /* Report the trace status to uiout, in a way suitable for MI, and not
1981 suitable for CLI. If ON_STOP is true, suppress a few fields that
1982 are not meaningful in the -trace-stop response.
1984 The implementation is essentially parallel to trace_status_command, but
1985 merging them will result in unreadable code. */
1987 trace_status_mi (int on_stop)
1989 struct ui_out *uiout = current_uiout;
1990 struct trace_status *ts = current_trace_status ();
1993 status = target_get_trace_status (ts);
1995 if (status == -1 && ts->filename == NULL)
1997 uiout->field_string ("supported", "0");
2001 if (ts->filename != NULL)
2002 uiout->field_string ("supported", "file");
2004 uiout->field_string ("supported", "1");
2006 if (ts->filename != NULL)
2007 uiout->field_string ("trace-file", ts->filename);
2009 gdb_assert (ts->running_known);
2013 uiout->field_string ("running", "1");
2015 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
2016 Given that the frontend gets the status either on -trace-stop, or from
2017 -trace-status after re-connection, it does not seem like this
2018 information is necessary for anything. It is not necessary for either
2019 figuring the vital state of the target nor for navigation of trace
2020 frames. If the frontend wants to show the current state is some
2021 configure dialog, it can request the value when such dialog is
2022 invoked by the user. */
2026 const char *stop_reason = NULL;
2027 int stopping_tracepoint = -1;
2030 uiout->field_string ("running", "0");
2032 if (ts->stop_reason != trace_stop_reason_unknown)
2034 switch (ts->stop_reason)
2036 case trace_stop_command:
2037 stop_reason = "request";
2039 case trace_buffer_full:
2040 stop_reason = "overflow";
2042 case trace_disconnected:
2043 stop_reason = "disconnection";
2045 case tracepoint_passcount:
2046 stop_reason = "passcount";
2047 stopping_tracepoint = ts->stopping_tracepoint;
2049 case tracepoint_error:
2050 stop_reason = "error";
2051 stopping_tracepoint = ts->stopping_tracepoint;
2057 uiout->field_string ("stop-reason", stop_reason);
2058 if (stopping_tracepoint != -1)
2059 uiout->field_int ("stopping-tracepoint",
2060 stopping_tracepoint);
2061 if (ts->stop_reason == tracepoint_error)
2062 uiout->field_string ("error-description",
2068 if (ts->traceframe_count != -1)
2069 uiout->field_int ("frames", ts->traceframe_count);
2070 if (ts->traceframes_created != -1)
2071 uiout->field_int ("frames-created", ts->traceframes_created);
2072 if (ts->buffer_size != -1)
2073 uiout->field_int ("buffer-size", ts->buffer_size);
2074 if (ts->buffer_free != -1)
2075 uiout->field_int ("buffer-free", ts->buffer_free);
2077 uiout->field_int ("disconnected", ts->disconnected_tracing);
2078 uiout->field_int ("circular", ts->circular_buffer);
2080 uiout->field_string ("user-name", ts->user_name);
2081 uiout->field_string ("notes", ts->notes);
2086 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2087 (long int) (ts->start_time / 1000000),
2088 (long int) (ts->start_time % 1000000));
2089 uiout->field_string ("start-time", buf);
2090 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2091 (long int) (ts->stop_time / 1000000),
2092 (long int) (ts->stop_time % 1000000));
2093 uiout->field_string ("stop-time", buf);
2097 /* Check if a trace run is ongoing. If so, and FROM_TTY, query the
2098 user if she really wants to detach. */
2101 query_if_trace_running (int from_tty)
2106 /* It can happen that the target that was tracing went away on its
2107 own, and we didn't notice. Get a status update, and if the
2108 current target doesn't even do tracing, then assume it's not
2110 if (target_get_trace_status (current_trace_status ()) < 0)
2111 current_trace_status ()->running = 0;
2113 /* If running interactively, give the user the option to cancel and
2114 then decide what to do differently with the run. Scripts are
2115 just going to disconnect and let the target deal with it,
2116 according to how it's been instructed previously via
2117 disconnected-tracing. */
2118 if (current_trace_status ()->running)
2120 process_tracepoint_on_disconnect ();
2122 if (current_trace_status ()->disconnected_tracing)
2124 if (!query (_("Trace is running and will "
2125 "continue after detach; detach anyway? ")))
2126 error (_("Not confirmed."));
2130 if (!query (_("Trace is running but will "
2131 "stop on detach; detach anyway? ")))
2132 error (_("Not confirmed."));
2137 /* This function handles the details of what to do about an ongoing
2138 tracing run if the user has asked to detach or otherwise disconnect
2142 disconnect_tracing (void)
2144 /* Also we want to be out of tfind mode, otherwise things can get
2145 confusing upon reconnection. Just use these calls instead of
2146 full tfind_1 behavior because we're in the middle of detaching,
2147 and there's no point to updating current stack frame etc. */
2148 trace_reset_local_state ();
2151 /* Worker function for the various flavors of the tfind command. */
2153 tfind_1 (enum trace_find_type type, int num,
2154 CORE_ADDR addr1, CORE_ADDR addr2,
2157 int target_frameno = -1, target_tracept = -1;
2158 struct frame_id old_frame_id = null_frame_id;
2159 struct tracepoint *tp;
2160 struct ui_out *uiout = current_uiout;
2162 /* Only try to get the current stack frame if we have a chance of
2163 succeeding. In particular, if we're trying to get a first trace
2164 frame while all threads are running, it's not going to succeed,
2165 so leave it with a default value and let the frame comparison
2166 below (correctly) decide to print out the source location of the
2168 if (!(type == tfind_number && num == -1)
2169 && (has_stack_frames () || traceframe_number >= 0))
2170 old_frame_id = get_frame_id (get_current_frame ());
2172 target_frameno = target_trace_find (type, num, addr1, addr2,
2175 if (type == tfind_number
2177 && target_frameno == -1)
2179 /* We told the target to get out of tfind mode, and it did. */
2181 else if (target_frameno == -1)
2183 /* A request for a non-existent trace frame has failed.
2184 Our response will be different, depending on FROM_TTY:
2186 If FROM_TTY is true, meaning that this command was
2187 typed interactively by the user, then give an error
2188 and DO NOT change the state of traceframe_number etc.
2190 However if FROM_TTY is false, meaning that we're either
2191 in a script, a loop, or a user-defined command, then
2192 DON'T give an error, but DO change the state of
2193 traceframe_number etc. to invalid.
2195 The rationalle is that if you typed the command, you
2196 might just have committed a typo or something, and you'd
2197 like to NOT lose your current debugging state. However
2198 if you're in a user-defined command or especially in a
2199 loop, then you need a way to detect that the command
2200 failed WITHOUT aborting. This allows you to write
2201 scripts that search thru the trace buffer until the end,
2202 and then continue on to do something else. */
2205 error (_("Target failed to find requested trace frame."));
2209 printf_filtered ("End of trace buffer.\n");
2210 #if 0 /* dubious now? */
2211 /* The following will not recurse, since it's
2213 tfind_command ("-1", from_tty);
2218 tp = get_tracepoint_by_number_on_target (target_tracept);
2220 reinit_frame_cache ();
2221 target_dcache_invalidate ();
2223 set_tracepoint_num (tp ? tp->number : target_tracept);
2225 if (target_frameno != get_traceframe_number ())
2226 observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2228 set_current_traceframe (target_frameno);
2230 if (target_frameno == -1)
2231 set_traceframe_context (NULL);
2233 set_traceframe_context (get_current_frame ());
2235 if (traceframe_number >= 0)
2237 /* Use different branches for MI and CLI to make CLI messages
2239 if (uiout->is_mi_like_p ())
2241 uiout->field_string ("found", "1");
2242 uiout->field_int ("tracepoint", tracepoint_number);
2243 uiout->field_int ("traceframe", traceframe_number);
2247 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2248 traceframe_number, tracepoint_number);
2253 if (uiout->is_mi_like_p ())
2254 uiout->field_string ("found", "0");
2255 else if (type == tfind_number && num == -1)
2256 printf_unfiltered (_("No longer looking at any trace frame\n"));
2257 else /* This case may never occur, check. */
2258 printf_unfiltered (_("No trace frame found\n"));
2261 /* If we're in nonstop mode and getting out of looking at trace
2262 frames, there won't be any current frame to go back to and
2265 && (has_stack_frames () || traceframe_number >= 0))
2267 enum print_what print_what;
2269 /* NOTE: in imitation of the step command, try to determine
2270 whether we have made a transition from one function to
2271 another. If so, we'll print the "stack frame" (ie. the new
2272 function and it's arguments) -- otherwise we'll just show the
2275 if (frame_id_eq (old_frame_id,
2276 get_frame_id (get_current_frame ())))
2277 print_what = SRC_LINE;
2279 print_what = SRC_AND_LOC;
2281 print_stack_frame (get_selected_frame (NULL), 1, print_what, 1);
2286 /* Error on looking at traceframes while trace is running. */
2289 check_trace_running (struct trace_status *status)
2291 if (status->running && status->filename == NULL)
2292 error (_("May not look at trace frames while trace is running."));
2295 /* trace_find_command takes a trace frame number n,
2296 sends "QTFrame:<n>" to the target,
2297 and accepts a reply that may contain several optional pieces
2298 of information: a frame number, a tracepoint number, and an
2299 indication of whether this is a trap frame or a stepping frame.
2301 The minimal response is just "OK" (which indicates that the
2302 target does not give us a frame number or a tracepoint number).
2303 Instead of that, the target may send us a string containing
2305 F<hexnum> (gives the selected frame number)
2306 T<hexnum> (gives the selected tracepoint number)
2311 tfind_command_1 (const char *args, int from_tty)
2312 { /* This should only be called with a numeric argument. */
2315 check_trace_running (current_trace_status ());
2317 if (args == 0 || *args == 0)
2318 { /* TFIND with no args means find NEXT trace frame. */
2319 if (traceframe_number == -1)
2320 frameno = 0; /* "next" is first one. */
2322 frameno = traceframe_number + 1;
2324 else if (0 == strcmp (args, "-"))
2326 if (traceframe_number == -1)
2327 error (_("not debugging trace buffer"));
2328 else if (from_tty && traceframe_number == 0)
2329 error (_("already at start of trace buffer"));
2331 frameno = traceframe_number - 1;
2333 /* A hack to work around eval's need for fp to have been collected. */
2334 else if (0 == strcmp (args, "-1"))
2337 frameno = parse_and_eval_long (args);
2340 error (_("invalid input (%d is less than zero)"), frameno);
2342 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2346 tfind_command (char *args, int from_tty)
2348 tfind_command_1 (const_cast<char *> (args), from_tty);
2353 tfind_end_command (const char *args, int from_tty)
2355 tfind_command_1 ("-1", from_tty);
2360 tfind_start_command (const char *args, int from_tty)
2362 tfind_command_1 ("0", from_tty);
2365 /* tfind pc command */
2367 tfind_pc_command (const char *args, int from_tty)
2371 check_trace_running (current_trace_status ());
2373 if (args == 0 || *args == 0)
2374 pc = regcache_read_pc (get_current_regcache ());
2376 pc = parse_and_eval_address (args);
2378 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2381 /* tfind tracepoint command */
2383 tfind_tracepoint_command (const char *args, int from_tty)
2386 struct tracepoint *tp;
2388 check_trace_running (current_trace_status ());
2390 if (args == 0 || *args == 0)
2392 if (tracepoint_number == -1)
2393 error (_("No current tracepoint -- please supply an argument."));
2395 tdp = tracepoint_number; /* Default is current TDP. */
2398 tdp = parse_and_eval_long (args);
2400 /* If we have the tracepoint on hand, use the number that the
2401 target knows about (which may be different if we disconnected
2402 and reconnected). */
2403 tp = get_tracepoint (tdp);
2405 tdp = tp->number_on_target;
2407 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2410 /* TFIND LINE command:
2412 This command will take a sourceline for argument, just like BREAK
2413 or TRACE (ie. anything that "decode_line_1" can handle).
2415 With no argument, this command will find the next trace frame
2416 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2419 tfind_line_command (const char *args, int from_tty)
2421 check_trace_running (current_trace_status ());
2423 symtab_and_line sal;
2424 if (args == 0 || *args == 0)
2426 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2430 std::vector<symtab_and_line> sals
2431 = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2435 if (sal.symtab == 0)
2436 error (_("No line number information available."));
2438 CORE_ADDR start_pc, end_pc;
2439 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2441 if (start_pc == end_pc)
2443 printf_filtered ("Line %d of \"%s\"",
2445 symtab_to_filename_for_display (sal.symtab));
2447 printf_filtered (" is at address ");
2448 print_address (get_current_arch (), start_pc, gdb_stdout);
2450 printf_filtered (" but contains no code.\n");
2451 sal = find_pc_line (start_pc, 0);
2453 && find_line_pc_range (sal, &start_pc, &end_pc)
2454 && start_pc != end_pc)
2455 printf_filtered ("Attempting to find line %d instead.\n",
2458 error (_("Cannot find a good line."));
2462 /* Is there any case in which we get here, and have an address
2463 which the user would want to see? If we have debugging
2464 symbols and no line numbers? */
2465 error (_("Line number %d is out of range for \"%s\"."),
2466 sal.line, symtab_to_filename_for_display (sal.symtab));
2468 /* Find within range of stated line. */
2470 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2472 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2475 /* tfind range command */
2477 tfind_range_command (const char *args, int from_tty)
2479 static CORE_ADDR start, stop;
2482 check_trace_running (current_trace_status ());
2484 if (args == 0 || *args == 0)
2485 { /* XXX FIXME: what should default behavior be? */
2486 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2490 if (0 != (tmp = strchr (args, ',')))
2492 std::string start_addr (args, tmp);
2494 tmp = skip_spaces (tmp);
2495 start = parse_and_eval_address (start_addr.c_str ());
2496 stop = parse_and_eval_address (tmp);
2499 { /* No explicit end address? */
2500 start = parse_and_eval_address (args);
2501 stop = start + 1; /* ??? */
2504 tfind_1 (tfind_range, 0, start, stop, from_tty);
2507 /* tfind outside command */
2509 tfind_outside_command (const char *args, int from_tty)
2511 CORE_ADDR start, stop;
2514 if (current_trace_status ()->running
2515 && current_trace_status ()->filename == NULL)
2516 error (_("May not look at trace frames while trace is running."));
2518 if (args == 0 || *args == 0)
2519 { /* XXX FIXME: what should default behavior be? */
2520 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2524 if (0 != (tmp = strchr (args, ',')))
2526 std::string start_addr (args, tmp);
2528 tmp = skip_spaces (tmp);
2529 start = parse_and_eval_address (start_addr.c_str ());
2530 stop = parse_and_eval_address (tmp);
2533 { /* No explicit end address? */
2534 start = parse_and_eval_address (args);
2535 stop = start + 1; /* ??? */
2538 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2541 /* info scope command: list the locals for a scope. */
2543 info_scope_command (char *args_in, int from_tty)
2546 struct bound_minimal_symbol msym;
2547 const struct block *block;
2548 const char *symname;
2549 const char *save_args = args_in;
2550 struct block_iterator iter;
2552 struct gdbarch *gdbarch;
2554 const char *args = args_in;
2556 if (args == 0 || *args == 0)
2557 error (_("requires an argument (function, "
2558 "line or *addr) to define a scope"));
2560 event_location_up location = string_to_event_location (&args,
2562 std::vector<symtab_and_line> sals
2563 = decode_line_1 (location.get (), DECODE_LINE_FUNFIRSTLINE,
2567 /* Presumably decode_line_1 has already warned. */
2571 /* Resolve line numbers to PC. */
2572 resolve_sal_pc (&sals[0]);
2573 block = block_for_pc (sals[0].pc);
2577 QUIT; /* Allow user to bail out with ^C. */
2578 ALL_BLOCK_SYMBOLS (block, iter, sym)
2580 QUIT; /* Allow user to bail out with ^C. */
2582 printf_filtered ("Scope for %s:\n", save_args);
2585 symname = SYMBOL_PRINT_NAME (sym);
2586 if (symname == NULL || *symname == '\0')
2587 continue; /* Probably botched, certainly useless. */
2589 gdbarch = symbol_arch (sym);
2591 printf_filtered ("Symbol %s is ", symname);
2593 if (SYMBOL_COMPUTED_OPS (sym) != NULL)
2594 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2595 BLOCK_START (block),
2599 switch (SYMBOL_CLASS (sym))
2602 case LOC_UNDEF: /* Messed up symbol? */
2603 printf_filtered ("a bogus symbol, class %d.\n",
2604 SYMBOL_CLASS (sym));
2605 count--; /* Don't count this one. */
2608 printf_filtered ("a constant with value %s (%s)",
2609 plongest (SYMBOL_VALUE (sym)),
2610 hex_string (SYMBOL_VALUE (sym)));
2612 case LOC_CONST_BYTES:
2613 printf_filtered ("constant bytes: ");
2614 if (SYMBOL_TYPE (sym))
2615 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2616 fprintf_filtered (gdb_stdout, " %02x",
2617 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2620 printf_filtered ("in static storage at address ");
2621 printf_filtered ("%s", paddress (gdbarch,
2622 SYMBOL_VALUE_ADDRESS (sym)));
2625 /* GDBARCH is the architecture associated with the objfile
2626 the symbol is defined in; the target architecture may be
2627 different, and may provide additional registers. However,
2628 we do not know the target architecture at this point.
2629 We assume the objfile architecture will contain all the
2630 standard registers that occur in debug info in that
2632 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2635 if (SYMBOL_IS_ARGUMENT (sym))
2636 printf_filtered ("an argument in register $%s",
2637 gdbarch_register_name (gdbarch, regno));
2639 printf_filtered ("a local variable in register $%s",
2640 gdbarch_register_name (gdbarch, regno));
2643 printf_filtered ("an argument at stack/frame offset %s",
2644 plongest (SYMBOL_VALUE (sym)));
2647 printf_filtered ("a local variable at frame offset %s",
2648 plongest (SYMBOL_VALUE (sym)));
2651 printf_filtered ("a reference argument at offset %s",
2652 plongest (SYMBOL_VALUE (sym)));
2654 case LOC_REGPARM_ADDR:
2655 /* Note comment at LOC_REGISTER. */
2656 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2658 printf_filtered ("the address of an argument, in register $%s",
2659 gdbarch_register_name (gdbarch, regno));
2662 printf_filtered ("a typedef.\n");
2665 printf_filtered ("a label at address ");
2666 printf_filtered ("%s", paddress (gdbarch,
2667 SYMBOL_VALUE_ADDRESS (sym)));
2670 printf_filtered ("a function at address ");
2671 printf_filtered ("%s",
2672 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2674 case LOC_UNRESOLVED:
2675 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2677 if (msym.minsym == NULL)
2678 printf_filtered ("Unresolved Static");
2681 printf_filtered ("static storage at address ");
2682 printf_filtered ("%s",
2684 BMSYMBOL_VALUE_ADDRESS (msym)));
2687 case LOC_OPTIMIZED_OUT:
2688 printf_filtered ("optimized out.\n");
2691 gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
2694 if (SYMBOL_TYPE (sym))
2695 printf_filtered (", length %d.\n",
2696 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2698 if (BLOCK_FUNCTION (block))
2701 block = BLOCK_SUPERBLOCK (block);
2704 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2708 /* Helper for trace_dump_command. Dump the action list starting at
2709 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2710 actions of the body of a while-stepping action. STEPPING_FRAME is
2711 set if the current traceframe was determined to be a while-stepping
2715 trace_dump_actions (struct command_line *action,
2716 int stepping_actions, int stepping_frame,
2719 const char *action_exp, *next_comma;
2721 for (; action != NULL; action = action->next)
2723 struct cmd_list_element *cmd;
2725 QUIT; /* Allow user to bail out with ^C. */
2726 action_exp = action->line;
2727 action_exp = skip_spaces (action_exp);
2729 /* The collection actions to be done while stepping are
2730 bracketed by the commands "while-stepping" and "end". */
2732 if (*action_exp == '#') /* comment line */
2735 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2737 error (_("Bad action list item: %s"), action_exp);
2739 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2743 for (i = 0; i < action->body_count; ++i)
2744 trace_dump_actions (action->body_list[i],
2745 1, stepping_frame, from_tty);
2747 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2749 /* Display the collected data.
2750 For the trap frame, display only what was collected at
2751 the trap. Likewise for stepping frames, display only
2752 what was collected while stepping. This means that the
2753 two boolean variables, STEPPING_FRAME and
2754 STEPPING_ACTIONS should be equal. */
2755 if (stepping_frame == stepping_actions)
2758 struct cleanup *old_chain
2759 = make_cleanup (free_current_contents, &cmd);
2760 int trace_string = 0;
2762 if (*action_exp == '/')
2763 action_exp = decode_agent_options (action_exp, &trace_string);
2766 { /* Repeat over a comma-separated list. */
2767 QUIT; /* Allow user to bail out with ^C. */
2768 if (*action_exp == ',')
2770 action_exp = skip_spaces (action_exp);
2772 next_comma = strchr (action_exp, ',');
2774 if (0 == strncasecmp (action_exp, "$reg", 4))
2775 registers_info (NULL, from_tty);
2776 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2778 else if (0 == strncasecmp (action_exp, "$loc", 4))
2779 info_locals_command (NULL, from_tty);
2780 else if (0 == strncasecmp (action_exp, "$arg", 4))
2781 info_args_command (NULL, from_tty);
2784 if (next_comma != NULL)
2786 size_t len = next_comma - action_exp;
2788 cmd = (char *) xrealloc (cmd, len + 1);
2789 memcpy (cmd, action_exp, len);
2794 size_t len = strlen (action_exp);
2796 cmd = (char *) xrealloc (cmd, len + 1);
2797 memcpy (cmd, action_exp, len + 1);
2800 printf_filtered ("%s = ", cmd);
2801 output_command_const (cmd, from_tty);
2802 printf_filtered ("\n");
2804 action_exp = next_comma;
2806 while (action_exp && *action_exp == ',');
2808 do_cleanups (old_chain);
2814 /* Return bp_location of the tracepoint associated with the current
2815 traceframe. Set *STEPPING_FRAME_P to 1 if the current traceframe
2816 is a stepping traceframe. */
2818 struct bp_location *
2819 get_traceframe_location (int *stepping_frame_p)
2821 struct tracepoint *t;
2822 struct bp_location *tloc;
2823 struct regcache *regcache;
2825 if (tracepoint_number == -1)
2826 error (_("No current trace frame."));
2828 t = get_tracepoint (tracepoint_number);
2831 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2834 /* The current frame is a trap frame if the frame PC is equal to the
2835 tracepoint PC. If not, then the current frame was collected
2836 during single-stepping. */
2837 regcache = get_current_regcache ();
2839 /* If the traceframe's address matches any of the tracepoint's
2840 locations, assume it is a direct hit rather than a while-stepping
2841 frame. (FIXME this is not reliable, should record each frame's
2843 for (tloc = t->loc; tloc; tloc = tloc->next)
2844 if (tloc->address == regcache_read_pc (regcache))
2846 *stepping_frame_p = 0;
2850 /* If this is a stepping frame, we don't know which location
2851 triggered. The first is as good (or bad) a guess as any... */
2852 *stepping_frame_p = 1;
2856 /* Return all the actions, including default collect, of a tracepoint
2857 T. It constructs cleanups into the chain, and leaves the caller to
2858 handle them (call do_cleanups). */
2860 static struct command_line *
2861 all_tracepoint_actions_and_cleanup (struct breakpoint *t)
2863 struct command_line *actions;
2865 actions = breakpoint_commands (t);
2867 /* If there are default expressions to collect, make up a collect
2868 action and prepend to the action list to encode. Note that since
2869 validation is per-tracepoint (local var "xyz" might be valid for
2870 one tracepoint and not another, etc), we make up the action on
2871 the fly, and don't cache it. */
2872 if (*default_collect)
2874 struct command_line *default_collect_action;
2875 char *default_collect_line;
2877 default_collect_line = xstrprintf ("collect %s", default_collect);
2878 make_cleanup (xfree, default_collect_line);
2880 validate_actionline (default_collect_line, t);
2881 default_collect_action = XNEW (struct command_line);
2882 make_cleanup (xfree, default_collect_action);
2883 default_collect_action->next = actions;
2884 default_collect_action->line = default_collect_line;
2885 actions = default_collect_action;
2891 /* The tdump command. */
2894 tdump_command (char *args, int from_tty)
2896 int stepping_frame = 0;
2897 struct bp_location *loc;
2898 struct command_line *actions;
2900 /* This throws an error is not inspecting a trace frame. */
2901 loc = get_traceframe_location (&stepping_frame);
2903 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2904 tracepoint_number, traceframe_number);
2906 /* This command only makes sense for the current frame, not the
2908 scoped_restore_current_thread restore_thread;
2910 select_frame (get_current_frame ());
2912 actions = all_tracepoint_actions_and_cleanup (loc->owner);
2914 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2917 /* Encode a piece of a tracepoint's source-level definition in a form
2918 that is suitable for both protocol and saving in files. */
2919 /* This version does not do multiple encodes for long strings; it should
2920 return an offset to the next piece to encode. FIXME */
2923 encode_source_string (int tpnum, ULONGEST addr,
2924 const char *srctype, const char *src,
2925 char *buf, int buf_size)
2927 if (80 + strlen (srctype) > buf_size)
2928 error (_("Buffer too small for source encoding"));
2929 sprintf (buf, "%x:%s:%s:%x:%x:",
2930 tpnum, phex_nz (addr, sizeof (addr)),
2931 srctype, 0, (int) strlen (src));
2932 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2933 error (_("Source string too long for buffer"));
2934 bin2hex ((gdb_byte *) src, buf + strlen (buf), strlen (src));
2938 /* Tell the target what to do with an ongoing tracing run if GDB
2939 disconnects for some reason. */
2942 set_disconnected_tracing (char *args, int from_tty,
2943 struct cmd_list_element *c)
2945 target_set_disconnected_tracing (disconnected_tracing);
2949 set_circular_trace_buffer (char *args, int from_tty,
2950 struct cmd_list_element *c)
2952 target_set_circular_trace_buffer (circular_trace_buffer);
2956 set_trace_buffer_size (char *args, int from_tty,
2957 struct cmd_list_element *c)
2959 target_set_trace_buffer_size (trace_buffer_size);
2963 set_trace_user (char *args, int from_tty,
2964 struct cmd_list_element *c)
2968 ret = target_set_trace_notes (trace_user, NULL, NULL);
2971 warning (_("Target does not support trace notes, user ignored"));
2975 set_trace_notes (char *args, int from_tty,
2976 struct cmd_list_element *c)
2980 ret = target_set_trace_notes (NULL, trace_notes, NULL);
2983 warning (_("Target does not support trace notes, note ignored"));
2987 set_trace_stop_notes (char *args, int from_tty,
2988 struct cmd_list_element *c)
2992 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
2995 warning (_("Target does not support trace notes, stop note ignored"));
2998 /* Convert the memory pointed to by mem into hex, placing result in buf.
2999 * Return a pointer to the last char put in buf (null)
3000 * "stolen" from sparc-stub.c
3003 static const char hexchars[] = "0123456789abcdef";
3006 mem2hex (gdb_byte *mem, char *buf, int count)
3014 *buf++ = hexchars[ch >> 4];
3015 *buf++ = hexchars[ch & 0xf];
3024 get_traceframe_number (void)
3026 return traceframe_number;
3030 get_tracepoint_number (void)
3032 return tracepoint_number;
3035 /* Make the traceframe NUM be the current trace frame. Does nothing
3036 if NUM is already current. */
3039 set_current_traceframe (int num)
3043 if (traceframe_number == num)
3045 /* Nothing to do. */
3049 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3052 warning (_("could not change traceframe"));
3054 set_traceframe_num (newnum);
3056 /* Changing the traceframe changes our view of registers and of the
3058 registers_changed ();
3060 clear_traceframe_info ();
3063 /* A cleanup used when switching away and back from tfind mode. */
3065 struct current_traceframe_cleanup
3067 /* The traceframe we were inspecting. */
3068 int traceframe_number;
3072 do_restore_current_traceframe_cleanup (void *arg)
3074 struct current_traceframe_cleanup *old
3075 = (struct current_traceframe_cleanup *) arg;
3077 set_current_traceframe (old->traceframe_number);
3081 restore_current_traceframe_cleanup_dtor (void *arg)
3083 struct current_traceframe_cleanup *old
3084 = (struct current_traceframe_cleanup *) arg;
3090 make_cleanup_restore_current_traceframe (void)
3092 struct current_traceframe_cleanup *old =
3093 XNEW (struct current_traceframe_cleanup);
3095 old->traceframe_number = traceframe_number;
3097 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3098 restore_current_traceframe_cleanup_dtor);
3101 /* Given a number and address, return an uploaded tracepoint with that
3102 number, creating if necessary. */
3104 struct uploaded_tp *
3105 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3107 struct uploaded_tp *utp;
3109 for (utp = *utpp; utp; utp = utp->next)
3110 if (utp->number == num && utp->addr == addr)
3113 utp = XCNEW (struct uploaded_tp);
3116 utp->actions = NULL;
3117 utp->step_actions = NULL;
3118 utp->cmd_strings = NULL;
3126 free_uploaded_tps (struct uploaded_tp **utpp)
3128 struct uploaded_tp *next_one;
3132 next_one = (*utpp)->next;
3138 /* Given a number and address, return an uploaded tracepoint with that
3139 number, creating if necessary. */
3141 struct uploaded_tsv *
3142 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3144 struct uploaded_tsv *utsv;
3146 for (utsv = *utsvp; utsv; utsv = utsv->next)
3147 if (utsv->number == num)
3150 utsv = XCNEW (struct uploaded_tsv);
3152 utsv->next = *utsvp;
3159 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3161 struct uploaded_tsv *next_one;
3165 next_one = (*utsvp)->next;
3171 /* FIXME this function is heuristic and will miss the cases where the
3172 conditional is semantically identical but differs in whitespace,
3173 such as "x == 0" vs "x==0". */
3176 cond_string_is_same (char *str1, char *str2)
3178 if (str1 == NULL || str2 == NULL)
3179 return (str1 == str2);
3181 return (strcmp (str1, str2) == 0);
3184 /* Look for an existing tracepoint that seems similar enough to the
3185 uploaded one. Enablement isn't compared, because the user can
3186 toggle that freely, and may have done so in anticipation of the
3187 next trace run. Return the location of matched tracepoint. */
3189 static struct bp_location *
3190 find_matching_tracepoint_location (struct uploaded_tp *utp)
3192 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3194 struct breakpoint *b;
3195 struct bp_location *loc;
3197 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3199 struct tracepoint *t = (struct tracepoint *) b;
3201 if (b->type == utp->type
3202 && t->step_count == utp->step
3203 && t->pass_count == utp->pass
3204 && cond_string_is_same (t->cond_string, utp->cond_string)
3205 /* FIXME also test actions. */
3208 /* Scan the locations for an address match. */
3209 for (loc = b->loc; loc; loc = loc->next)
3211 if (loc->address == utp->addr)
3219 /* Given a list of tracepoints uploaded from a target, attempt to
3220 match them up with existing tracepoints, and create new ones if not
3224 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3226 struct uploaded_tp *utp;
3227 /* A set of tracepoints which are modified. */
3228 VEC(breakpoint_p) *modified_tp = NULL;
3230 struct breakpoint *b;
3232 /* Look for GDB tracepoints that match up with our uploaded versions. */
3233 for (utp = *uploaded_tps; utp; utp = utp->next)
3235 struct bp_location *loc;
3236 struct tracepoint *t;
3238 loc = find_matching_tracepoint_location (utp);
3243 /* Mark this location as already inserted. */
3245 t = (struct tracepoint *) loc->owner;
3246 printf_filtered (_("Assuming tracepoint %d is same "
3247 "as target's tracepoint %d at %s.\n"),
3248 loc->owner->number, utp->number,
3249 paddress (loc->gdbarch, utp->addr));
3251 /* The tracepoint LOC->owner was modified (the location LOC
3252 was marked as inserted in the target). Save it in
3253 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3254 observers will be notified later once for each tracepoint
3255 saved in MODIFIED_TP. */
3257 VEC_iterate (breakpoint_p, modified_tp, ix, b);
3259 if (b == loc->owner)
3265 VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3269 t = create_tracepoint_from_upload (utp);
3271 printf_filtered (_("Created tracepoint %d for "
3272 "target's tracepoint %d at %s.\n"),
3273 t->number, utp->number,
3274 paddress (get_current_arch (), utp->addr));
3276 printf_filtered (_("Failed to create tracepoint for target's "
3277 "tracepoint %d at %s, skipping it.\n"),
3279 paddress (get_current_arch (), utp->addr));
3281 /* Whether found or created, record the number used by the
3282 target, to help with mapping target tracepoints back to their
3283 counterparts here. */
3285 t->number_on_target = utp->number;
3288 /* Notify 'breakpoint-modified' observer that at least one of B's
3289 locations was changed. */
3290 for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
3291 observer_notify_breakpoint_modified (b);
3293 VEC_free (breakpoint_p, modified_tp);
3294 free_uploaded_tps (uploaded_tps);
3297 /* Trace state variables don't have much to identify them beyond their
3298 name, so just use that to detect matches. */
3300 static struct trace_state_variable *
3301 find_matching_tsv (struct uploaded_tsv *utsv)
3306 return find_trace_state_variable (utsv->name);
3309 static struct trace_state_variable *
3310 create_tsv_from_upload (struct uploaded_tsv *utsv)
3312 const char *namebase;
3315 struct trace_state_variable *tsv;
3316 struct cleanup *old_chain;
3320 namebase = utsv->name;
3321 buf = xstrprintf ("%s", namebase);
3326 buf = xstrprintf ("%s_%d", namebase, try_num++);
3329 /* Fish for a name that is not in use. */
3330 /* (should check against all internal vars?) */
3331 while (find_trace_state_variable (buf))
3334 buf = xstrprintf ("%s_%d", namebase, try_num++);
3337 old_chain = make_cleanup (xfree, buf);
3339 /* We have an available name, create the variable. */
3340 tsv = create_trace_state_variable (buf);
3341 tsv->initial_value = utsv->initial_value;
3342 tsv->builtin = utsv->builtin;
3344 observer_notify_tsv_created (tsv);
3346 do_cleanups (old_chain);
3351 /* Given a list of uploaded trace state variables, try to match them
3352 up with existing variables, or create additional ones. */
3355 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3358 struct uploaded_tsv *utsv;
3359 struct trace_state_variable *tsv;
3362 /* Most likely some numbers will have to be reassigned as part of
3363 the merge, so clear them all in anticipation. */
3364 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3367 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3369 tsv = find_matching_tsv (utsv);
3373 printf_filtered (_("Assuming trace state variable $%s "
3374 "is same as target's variable %d.\n"),
3375 tsv->name, utsv->number);
3379 tsv = create_tsv_from_upload (utsv);
3381 printf_filtered (_("Created trace state variable "
3382 "$%s for target's variable %d.\n"),
3383 tsv->name, utsv->number);
3385 /* Give precedence to numberings that come from the target. */
3387 tsv->number = utsv->number;
3390 /* Renumber everything that didn't get a target-assigned number. */
3392 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3393 if (tsv->number > highest)
3394 highest = tsv->number;
3397 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3398 if (tsv->number == 0)
3399 tsv->number = highest++;
3401 free_uploaded_tsvs (uploaded_tsvs);
3404 /* Parse the part of trace status syntax that is shared between
3405 the remote protocol and the trace file reader. */
3408 parse_trace_status (const char *line, struct trace_status *ts)
3410 const char *p = line, *p1, *p2, *p3, *p_temp;
3414 ts->running_known = 1;
3415 ts->running = (*p++ == '1');
3416 ts->stop_reason = trace_stop_reason_unknown;
3417 xfree (ts->stop_desc);
3418 ts->stop_desc = NULL;
3419 ts->traceframe_count = -1;
3420 ts->traceframes_created = -1;
3421 ts->buffer_free = -1;
3422 ts->buffer_size = -1;
3423 ts->disconnected_tracing = 0;
3424 ts->circular_buffer = 0;
3425 xfree (ts->user_name);
3426 ts->user_name = NULL;
3429 ts->start_time = ts->stop_time = 0;
3433 p1 = strchr (p, ':');
3435 error (_("Malformed trace status, at %s\n\
3436 Status line: '%s'\n"), p, line);
3437 p3 = strchr (p, ';');
3439 p3 = p + strlen (p);
3440 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3442 p = unpack_varlen_hex (++p1, &val);
3443 ts->stop_reason = trace_buffer_full;
3445 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3447 p = unpack_varlen_hex (++p1, &val);
3448 ts->stop_reason = trace_never_run;
3450 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3453 p = unpack_varlen_hex (++p1, &val);
3454 ts->stop_reason = tracepoint_passcount;
3455 ts->stopping_tracepoint = val;
3457 else if (strncmp (p, stop_reason_names[trace_stop_command], p1 - p) == 0)
3459 p2 = strchr (++p1, ':');
3467 ts->stop_desc = (char *) xmalloc (strlen (line));
3468 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3469 ts->stop_desc[end] = '\0';
3472 ts->stop_desc = xstrdup ("");
3474 p = unpack_varlen_hex (++p2, &val);
3475 ts->stop_reason = trace_stop_command;
3477 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3479 p = unpack_varlen_hex (++p1, &val);
3480 ts->stop_reason = trace_disconnected;
3482 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3484 p2 = strchr (++p1, ':');
3487 ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1);
3488 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3489 ts->stop_desc[end] = '\0';
3492 ts->stop_desc = xstrdup ("");
3494 p = unpack_varlen_hex (++p2, &val);
3495 ts->stopping_tracepoint = val;
3496 ts->stop_reason = tracepoint_error;
3498 else if (strncmp (p, "tframes", p1 - p) == 0)
3500 p = unpack_varlen_hex (++p1, &val);
3501 ts->traceframe_count = val;
3503 else if (strncmp (p, "tcreated", p1 - p) == 0)
3505 p = unpack_varlen_hex (++p1, &val);
3506 ts->traceframes_created = val;
3508 else if (strncmp (p, "tfree", p1 - p) == 0)
3510 p = unpack_varlen_hex (++p1, &val);
3511 ts->buffer_free = val;
3513 else if (strncmp (p, "tsize", p1 - p) == 0)
3515 p = unpack_varlen_hex (++p1, &val);
3516 ts->buffer_size = val;
3518 else if (strncmp (p, "disconn", p1 - p) == 0)
3520 p = unpack_varlen_hex (++p1, &val);
3521 ts->disconnected_tracing = val;
3523 else if (strncmp (p, "circular", p1 - p) == 0)
3525 p = unpack_varlen_hex (++p1, &val);
3526 ts->circular_buffer = val;
3528 else if (strncmp (p, "starttime", p1 - p) == 0)
3530 p = unpack_varlen_hex (++p1, &val);
3531 ts->start_time = val;
3533 else if (strncmp (p, "stoptime", p1 - p) == 0)
3535 p = unpack_varlen_hex (++p1, &val);
3536 ts->stop_time = val;
3538 else if (strncmp (p, "username", p1 - p) == 0)
3541 ts->user_name = (char *) xmalloc (strlen (p) / 2);
3542 end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1) / 2);
3543 ts->user_name[end] = '\0';
3546 else if (strncmp (p, "notes", p1 - p) == 0)
3549 ts->notes = (char *) xmalloc (strlen (p) / 2);
3550 end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
3551 ts->notes[end] = '\0';
3556 /* Silently skip unknown optional info. */
3557 p_temp = strchr (p1 + 1, ';');
3561 /* Must be at the end. */
3568 parse_tracepoint_status (const char *p, struct breakpoint *bp,
3569 struct uploaded_tp *utp)
3572 struct tracepoint *tp = (struct tracepoint *) bp;
3574 p = unpack_varlen_hex (p, &uval);
3576 tp->hit_count += uval;
3578 utp->hit_count += uval;
3579 p = unpack_varlen_hex (p + 1, &uval);
3581 tp->traceframe_usage += uval;
3583 utp->traceframe_usage += uval;
3584 /* Ignore any extra, allowing for future extensions. */
3587 /* Given a line of text defining a part of a tracepoint, parse it into
3588 an "uploaded tracepoint". */
3591 parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
3595 ULONGEST num, addr, step, pass, orig_size, xlen, start;
3598 const char *srctype;
3600 struct uploaded_tp *utp = NULL;
3603 /* Both tracepoint and action definitions start with the same number
3604 and address sequence. */
3606 p = unpack_varlen_hex (p, &num);
3607 p++; /* skip a colon */
3608 p = unpack_varlen_hex (p, &addr);
3609 p++; /* skip a colon */
3612 enabled = (*p++ == 'E');
3613 p++; /* skip a colon */
3614 p = unpack_varlen_hex (p, &step);
3615 p++; /* skip a colon */
3616 p = unpack_varlen_hex (p, &pass);
3617 type = bp_tracepoint;
3619 /* Thumb through optional fields. */
3622 p++; /* skip a colon */
3625 type = bp_fast_tracepoint;
3627 p = unpack_varlen_hex (p, &orig_size);
3631 type = bp_static_tracepoint;
3637 p = unpack_varlen_hex (p, &xlen);
3638 p++; /* skip a comma */
3639 cond = (char *) xmalloc (2 * xlen + 1);
3640 strncpy (cond, p, 2 * xlen);
3641 cond[2 * xlen] = '\0';
3645 warning (_("Unrecognized char '%c' in tracepoint "
3646 "definition, skipping rest"), *p);
3648 utp = get_uploaded_tp (num, addr, utpp);
3650 utp->enabled = enabled;
3655 else if (piece == 'A')
3657 utp = get_uploaded_tp (num, addr, utpp);
3658 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3660 else if (piece == 'S')
3662 utp = get_uploaded_tp (num, addr, utpp);
3663 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3665 else if (piece == 'Z')
3667 /* Parse a chunk of source form definition. */
3668 utp = get_uploaded_tp (num, addr, utpp);
3670 p = strchr (p, ':');
3671 p++; /* skip a colon */
3672 p = unpack_varlen_hex (p, &start);
3673 p++; /* skip a colon */
3674 p = unpack_varlen_hex (p, &xlen);
3675 p++; /* skip a colon */
3677 buf = (char *) alloca (strlen (line));
3679 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3682 if (startswith (srctype, "at:"))
3683 utp->at_string = xstrdup (buf);
3684 else if (startswith (srctype, "cond:"))
3685 utp->cond_string = xstrdup (buf);
3686 else if (startswith (srctype, "cmd:"))
3687 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3689 else if (piece == 'V')
3691 utp = get_uploaded_tp (num, addr, utpp);
3693 parse_tracepoint_status (p, NULL, utp);
3697 /* Don't error out, the target might be sending us optional
3698 info that we don't care about. */
3699 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3703 /* Convert a textual description of a trace state variable into an
3707 parse_tsv_definition (const char *line, struct uploaded_tsv **utsvp)
3711 ULONGEST num, initval, builtin;
3713 struct uploaded_tsv *utsv = NULL;
3715 buf = (char *) alloca (strlen (line));
3718 p = unpack_varlen_hex (p, &num);
3719 p++; /* skip a colon */
3720 p = unpack_varlen_hex (p, &initval);
3721 p++; /* skip a colon */
3722 p = unpack_varlen_hex (p, &builtin);
3723 p++; /* skip a colon */
3724 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3727 utsv = get_uploaded_tsv (num, utsvp);
3728 utsv->initial_value = initval;
3729 utsv->builtin = builtin;
3730 utsv->name = xstrdup (buf);
3734 free_current_marker (void *arg)
3736 struct static_tracepoint_marker **marker_p
3737 = (struct static_tracepoint_marker **) arg;
3739 if (*marker_p != NULL)
3741 release_static_tracepoint_marker (*marker_p);
3748 /* Given a line of text defining a static tracepoint marker, parse it
3749 into a "static tracepoint marker" object. Throws an error is
3750 parsing fails. If PP is non-null, it points to one past the end of
3751 the parsed marker definition. */
3754 parse_static_tracepoint_marker_definition (const char *line, const char **pp,
3755 struct static_tracepoint_marker *marker)
3757 const char *p, *endp;
3762 p = unpack_varlen_hex (p, &addr);
3763 p++; /* skip a colon */
3765 marker->gdbarch = target_gdbarch ();
3766 marker->address = (CORE_ADDR) addr;
3768 endp = strchr (p, ':');
3770 error (_("bad marker definition: %s"), line);
3772 marker->str_id = (char *) xmalloc (endp - p + 1);
3773 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
3774 marker->str_id[end] = '\0';
3777 p++; /* skip a colon */
3779 marker->extra = (char *) xmalloc (strlen (p) + 1);
3780 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
3781 marker->extra[end] = '\0';
3787 /* Release a static tracepoint marker's contents. Note that the
3788 object itself isn't released here. There objects are usually on
3792 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
3794 xfree (marker->str_id);
3795 marker->str_id = NULL;
3798 /* Print MARKER to gdb_stdout. */
3801 print_one_static_tracepoint_marker (int count,
3802 struct static_tracepoint_marker *marker)
3806 char wrap_indent[80];
3807 char extra_field_indent[80];
3808 struct ui_out *uiout = current_uiout;
3809 VEC(breakpoint_p) *tracepoints;
3811 symtab_and_line sal;
3812 sal.pc = marker->address;
3814 tracepoints = static_tracepoints_here (marker->address);
3816 ui_out_emit_tuple tuple_emitter (uiout, "marker");
3818 /* A counter field to help readability. This is not a stable
3820 uiout->field_int ("count", count);
3822 uiout->field_string ("marker-id", marker->str_id);
3824 uiout->field_fmt ("enabled", "%c",
3825 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
3828 strcpy (wrap_indent, " ");
3830 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
3831 strcat (wrap_indent, " ");
3833 strcat (wrap_indent, " ");
3835 strcpy (extra_field_indent, " ");
3837 uiout->field_core_addr ("addr", marker->gdbarch, marker->address);
3839 sal = find_pc_line (marker->address, 0);
3840 sym = find_pc_sect_function (marker->address, NULL);
3843 uiout->text ("in ");
3844 uiout->field_string ("func",
3845 SYMBOL_PRINT_NAME (sym));
3846 uiout->wrap_hint (wrap_indent);
3847 uiout->text (" at ");
3850 uiout->field_skip ("func");
3852 if (sal.symtab != NULL)
3854 uiout->field_string ("file",
3855 symtab_to_filename_for_display (sal.symtab));
3858 if (uiout->is_mi_like_p ())
3860 const char *fullname = symtab_to_fullname (sal.symtab);
3862 uiout->field_string ("fullname", fullname);
3865 uiout->field_skip ("fullname");
3867 uiout->field_int ("line", sal.line);
3871 uiout->field_skip ("fullname");
3872 uiout->field_skip ("line");
3876 uiout->text (extra_field_indent);
3877 uiout->text (_("Data: \""));
3878 uiout->field_string ("extra-data", marker->extra);
3879 uiout->text ("\"\n");
3881 if (!VEC_empty (breakpoint_p, tracepoints))
3884 struct breakpoint *b;
3887 ui_out_emit_tuple tuple_emitter (uiout, "tracepoints-at");
3889 uiout->text (extra_field_indent);
3890 uiout->text (_("Probed by static tracepoints: "));
3891 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
3896 uiout->field_int ("tracepoint-id", b->number);
3900 if (uiout->is_mi_like_p ())
3901 uiout->field_int ("number-of-tracepoints",
3902 VEC_length(breakpoint_p, tracepoints));
3906 VEC_free (breakpoint_p, tracepoints);
3910 info_static_tracepoint_markers_command (char *arg, int from_tty)
3912 VEC(static_tracepoint_marker_p) *markers;
3913 struct cleanup *old_chain;
3914 struct static_tracepoint_marker *marker;
3915 struct ui_out *uiout = current_uiout;
3918 /* We don't have to check target_can_use_agent and agent's capability on
3919 static tracepoint here, in order to be compatible with older GDBserver.
3920 We don't check USE_AGENT is true or not, because static tracepoints
3921 don't work without in-process agent, so we don't bother users to type
3922 `set agent on' when to use static tracepoint. */
3924 ui_out_emit_table table_emitter (uiout, 5, -1,
3925 "StaticTracepointMarkersTable");
3927 uiout->table_header (7, ui_left, "counter", "Cnt");
3929 uiout->table_header (40, ui_left, "marker-id", "ID");
3931 uiout->table_header (3, ui_left, "enabled", "Enb");
3932 if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
3933 uiout->table_header (10, ui_left, "addr", "Address");
3935 uiout->table_header (18, ui_left, "addr", "Address");
3936 uiout->table_header (40, ui_noalign, "what", "What");
3938 uiout->table_body ();
3940 markers = target_static_tracepoint_markers_by_strid (NULL);
3941 old_chain = make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
3944 VEC_iterate (static_tracepoint_marker_p,
3945 markers, i, marker);
3948 print_one_static_tracepoint_marker (i + 1, marker);
3949 release_static_tracepoint_marker (marker);
3952 do_cleanups (old_chain);
3955 /* The $_sdata convenience variable is a bit special. We don't know
3956 for sure type of the value until we actually have a chance to fetch
3957 the data --- the size of the object depends on what has been
3958 collected. We solve this by making $_sdata be an internalvar that
3959 creates a new value on access. */
3961 /* Return a new value with the correct type for the sdata object of
3962 the current trace frame. Return a void value if there's no object
3965 static struct value *
3966 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
3972 /* We need to read the whole object before we know its size. */
3973 size = target_read_alloc (¤t_target,
3974 TARGET_OBJECT_STATIC_TRACE_DATA,
3981 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
3983 v = allocate_value (type);
3984 memcpy (value_contents_raw (v), buf, size);
3989 return allocate_value (builtin_type (gdbarch)->builtin_void);
3992 #if !defined(HAVE_LIBEXPAT)
3994 struct traceframe_info *
3995 parse_traceframe_info (const char *tframe_info)
3997 static int have_warned;
4002 warning (_("Can not parse XML trace frame info; XML support "
4003 "was disabled at compile time"));
4009 #else /* HAVE_LIBEXPAT */
4011 #include "xml-support.h"
4013 /* Handle the start of a <memory> element. */
4016 traceframe_info_start_memory (struct gdb_xml_parser *parser,
4017 const struct gdb_xml_element *element,
4018 void *user_data, VEC(gdb_xml_value_s) *attributes)
4020 struct traceframe_info *info = (struct traceframe_info *) user_data;
4021 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4022 ULONGEST *start_p, *length_p;
4025 = (ULONGEST *) xml_find_attribute (attributes, "start")->value;
4027 = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
4029 r->start = *start_p;
4030 r->length = *length_p;
4033 /* Handle the start of a <tvar> element. */
4036 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
4037 const struct gdb_xml_element *element,
4039 VEC(gdb_xml_value_s) *attributes)
4041 struct traceframe_info *info = (struct traceframe_info *) user_data;
4042 const char *id_attrib
4043 = (const char *) xml_find_attribute (attributes, "id")->value;
4044 int id = gdb_xml_parse_ulongest (parser, id_attrib);
4046 VEC_safe_push (int, info->tvars, id);
4049 /* Discard the constructed trace frame info (if an error occurs). */
4052 free_result (void *p)
4054 struct traceframe_info *result = (struct traceframe_info *) p;
4056 free_traceframe_info (result);
4059 /* The allowed elements and attributes for an XML memory map. */
4061 static const struct gdb_xml_attribute memory_attributes[] = {
4062 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4063 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4064 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4067 static const struct gdb_xml_attribute tvar_attributes[] = {
4068 { "id", GDB_XML_AF_NONE, NULL, NULL },
4069 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4072 static const struct gdb_xml_element traceframe_info_children[] = {
4073 { "memory", memory_attributes, NULL,
4074 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4075 traceframe_info_start_memory, NULL },
4076 { "tvar", tvar_attributes, NULL,
4077 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4078 traceframe_info_start_tvar, NULL },
4079 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4082 static const struct gdb_xml_element traceframe_info_elements[] = {
4083 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4085 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4088 /* Parse a traceframe-info XML document. */
4090 struct traceframe_info *
4091 parse_traceframe_info (const char *tframe_info)
4093 struct traceframe_info *result;
4094 struct cleanup *back_to;
4096 result = XCNEW (struct traceframe_info);
4097 back_to = make_cleanup (free_result, result);
4099 if (gdb_xml_parse_quick (_("trace frame info"),
4100 "traceframe-info.dtd", traceframe_info_elements,
4101 tframe_info, result) == 0)
4103 /* Parsed successfully, keep the result. */
4104 discard_cleanups (back_to);
4109 do_cleanups (back_to);
4113 #endif /* HAVE_LIBEXPAT */
4115 /* Returns the traceframe_info object for the current traceframe.
4116 This is where we avoid re-fetching the object from the target if we
4117 already have it cached. */
4119 struct traceframe_info *
4120 get_traceframe_info (void)
4122 if (traceframe_info == NULL)
4123 traceframe_info = target_traceframe_info ();
4125 return traceframe_info;
4128 /* If the target supports the query, return in RESULT the set of
4129 collected memory in the current traceframe, found within the LEN
4130 bytes range starting at MEMADDR. Returns true if the target
4131 supports the query, otherwise returns false, and RESULT is left
4135 traceframe_available_memory (VEC(mem_range_s) **result,
4136 CORE_ADDR memaddr, ULONGEST len)
4138 struct traceframe_info *info = get_traceframe_info ();
4142 struct mem_range *r;
4147 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4148 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4150 ULONGEST lo1, hi1, lo2, hi2;
4151 struct mem_range *nr;
4154 hi1 = memaddr + len;
4157 hi2 = r->start + r->length;
4159 nr = VEC_safe_push (mem_range_s, *result, NULL);
4161 nr->start = std::max (lo1, lo2);
4162 nr->length = std::min (hi1, hi2) - nr->start;
4165 normalize_mem_ranges (*result);
4172 /* Implementation of `sdata' variable. */
4174 static const struct internalvar_funcs sdata_funcs =
4181 /* module initialization */
4183 _initialize_tracepoint (void)
4185 struct cmd_list_element *c;
4187 /* Explicitly create without lookup, since that tries to create a
4188 value with a void typed value, and when we get here, gdbarch
4189 isn't initialized yet. At this point, we're quite sure there
4190 isn't another convenience variable of the same name. */
4191 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
4193 traceframe_number = -1;
4194 tracepoint_number = -1;
4196 add_info ("scope", info_scope_command,
4197 _("List the variables local to a scope"));
4199 add_cmd ("tracepoints", class_trace,
4200 _("Tracing of program execution without stopping the program."),
4203 add_com ("tdump", class_trace, tdump_command,
4204 _("Print everything collected at the current tracepoint."));
4206 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4207 Define a trace state variable.\n\
4208 Argument is a $-prefixed name, optionally followed\n\
4209 by '=' and an expression that sets the initial value\n\
4210 at the start of tracing."));
4211 set_cmd_completer (c, expression_completer);
4213 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4214 Delete one or more trace state variables.\n\
4215 Arguments are the names of the variables to delete.\n\
4216 If no arguments are supplied, delete all variables."), &deletelist);
4217 /* FIXME add a trace variable completer. */
4219 add_info ("tvariables", info_tvariables_command, _("\
4220 Status of trace state variables and their values.\n\
4223 add_info ("static-tracepoint-markers",
4224 info_static_tracepoint_markers_command, _("\
4225 List target static tracepoints markers.\n\
4228 add_prefix_cmd ("tfind", class_trace, tfind_command, _("\
4229 Select a trace frame;\n\
4230 No argument means forward by one frame; '-' means backward by one frame."),
4231 &tfindlist, "tfind ", 1, &cmdlist);
4233 add_cmd ("outside", class_trace, tfind_outside_command, _("\
4234 Select a trace frame whose PC is outside the given range (exclusive).\n\
4235 Usage: tfind outside addr1, addr2"),
4238 add_cmd ("range", class_trace, tfind_range_command, _("\
4239 Select a trace frame whose PC is in the given range (inclusive).\n\
4240 Usage: tfind range addr1,addr2"),
4243 add_cmd ("line", class_trace, tfind_line_command, _("\
4244 Select a trace frame by source line.\n\
4245 Argument can be a line number (with optional source file),\n\
4246 a function name, or '*' followed by an address.\n\
4247 Default argument is 'the next source line that was traced'."),
4250 add_cmd ("tracepoint", class_trace, tfind_tracepoint_command, _("\
4251 Select a trace frame by tracepoint number.\n\
4252 Default is the tracepoint for the current trace frame."),
4255 add_cmd ("pc", class_trace, tfind_pc_command, _("\
4256 Select a trace frame by PC.\n\
4257 Default is the current PC, or the PC of the current trace frame."),
4260 add_cmd ("end", class_trace, tfind_end_command, _("\
4261 De-select any trace frame and resume 'live' debugging."),
4264 add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
4266 add_cmd ("start", class_trace, tfind_start_command,
4267 _("Select the first trace frame in the trace buffer."),
4270 add_com ("tstatus", class_trace, tstatus_command,
4271 _("Display the status of the current trace data collection."));
4273 add_com ("tstop", class_trace, tstop_command, _("\
4274 Stop trace data collection.\n\
4275 Usage: tstop [ <notes> ... ]\n\
4276 Any arguments supplied are recorded with the trace as a stop reason and\n\
4277 reported by tstatus (if the target supports trace notes)."));
4279 add_com ("tstart", class_trace, tstart_command, _("\
4280 Start trace data collection.\n\
4281 Usage: tstart [ <notes> ... ]\n\
4282 Any arguments supplied are recorded with the trace as a note and\n\
4283 reported by tstatus (if the target supports trace notes)."));
4285 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4286 Ends a list of commands or actions.\n\
4287 Several GDB commands allow you to enter a list of commands or actions.\n\
4288 Entering \"end\" on a line by itself is the normal way to terminate\n\
4290 Note: the \"end\" command cannot be used at the gdb prompt."));
4292 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4293 Specify single-stepping behavior at a tracepoint.\n\
4294 Argument is number of instructions to trace in single-step mode\n\
4295 following the tracepoint. This command is normally followed by\n\
4296 one or more \"collect\" commands, to specify what to collect\n\
4297 while single-stepping.\n\n\
4298 Note: this command can only be used in a tracepoint \"actions\" list."));
4300 add_com_alias ("ws", "while-stepping", class_alias, 0);
4301 add_com_alias ("stepping", "while-stepping", class_alias, 0);
4303 add_com ("collect", class_trace, collect_pseudocommand, _("\
4304 Specify one or more data items to be collected at a tracepoint.\n\
4305 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4306 collect all data (variables, registers) referenced by that expression.\n\
4307 Also accepts the following special arguments:\n\
4308 $regs -- all registers.\n\
4309 $args -- all function arguments.\n\
4310 $locals -- all variables local to the block/function scope.\n\
4311 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4312 Note: this command can only be used in a tracepoint \"actions\" list."));
4314 add_com ("teval", class_trace, teval_pseudocommand, _("\
4315 Specify one or more expressions to be evaluated at a tracepoint.\n\
4316 Accepts a comma-separated list of (one or more) expressions.\n\
4317 The result of each evaluation will be discarded.\n\
4318 Note: this command can only be used in a tracepoint \"actions\" list."));
4320 add_com ("actions", class_trace, actions_command, _("\
4321 Specify the actions to be taken at a tracepoint.\n\
4322 Tracepoint actions may include collecting of specified data,\n\
4323 single-stepping, or enabling/disabling other tracepoints,\n\
4324 depending on target's capabilities."));
4326 default_collect = xstrdup ("");
4327 add_setshow_string_cmd ("default-collect", class_trace,
4328 &default_collect, _("\
4329 Set the list of expressions to collect by default"), _("\
4330 Show the list of expressions to collect by default"), NULL,
4332 &setlist, &showlist);
4334 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4335 &disconnected_tracing, _("\
4336 Set whether tracing continues after GDB disconnects."), _("\
4337 Show whether tracing continues after GDB disconnects."), _("\
4338 Use this to continue a tracing run even if GDB disconnects\n\
4339 or detaches from the target. You can reconnect later and look at\n\
4340 trace data collected in the meantime."),
4341 set_disconnected_tracing,
4346 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4347 &circular_trace_buffer, _("\
4348 Set target's use of circular trace buffer."), _("\
4349 Show target's use of circular trace buffer."), _("\
4350 Use this to make the trace buffer into a circular buffer,\n\
4351 which will discard traceframes (oldest first) instead of filling\n\
4352 up and stopping the trace run."),
4353 set_circular_trace_buffer,
4358 add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
4359 &trace_buffer_size, _("\
4360 Set requested size of trace buffer."), _("\
4361 Show requested size of trace buffer."), _("\
4362 Use this to choose a size for the trace buffer. Some targets\n\
4363 may have fixed or limited buffer sizes. Specifying \"unlimited\" or -1\n\
4364 disables any attempt to set the buffer size and lets the target choose."),
4365 set_trace_buffer_size, NULL,
4366 &setlist, &showlist);
4368 add_setshow_string_cmd ("trace-user", class_trace,
4370 Set the user name to use for current and future trace runs"), _("\
4371 Show the user name to use for current and future trace runs"), NULL,
4372 set_trace_user, NULL,
4373 &setlist, &showlist);
4375 add_setshow_string_cmd ("trace-notes", class_trace,
4377 Set notes string to use for current and future trace runs"), _("\
4378 Show the notes string to use for current and future trace runs"), NULL,
4379 set_trace_notes, NULL,
4380 &setlist, &showlist);
4382 add_setshow_string_cmd ("trace-stop-notes", class_trace,
4383 &trace_stop_notes, _("\
4384 Set notes string to use for future tstop commands"), _("\
4385 Show the notes string to use for future tstop commands"), NULL,
4386 set_trace_stop_notes, NULL,
4387 &setlist, &showlist);