1 /* Tracing functionality for remote targets in custom GDB protocol
3 Copyright (C) 1997-2013 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"
30 #include "gdb_string.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"
53 #include "exceptions.h"
54 #include "cli/cli-utils.h"
57 /* readline include files */
58 #include "readline/readline.h"
59 #include "readline/history.h"
61 /* readline defines this. */
72 extern int hex2bin (const char *hex, gdb_byte *bin, int count);
73 extern int bin2hex (const gdb_byte *bin, char *hex, int count);
75 /* Maximum length of an agent aexpression.
76 This accounts for the fact that packets are limited to 400 bytes
77 (which includes everything -- including the checksum), and assumes
78 the worst case of maximum length for each of the pieces of a
81 NOTE: expressions get mem2hex'ed otherwise this would be twice as
82 large. (400 - 31)/2 == 184 */
83 #define MAX_AGENT_EXPR_LEN 184
87 /* A hook used to notify the UI of tracepoint operations. */
89 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
90 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
92 extern void (*deprecated_readline_begin_hook) (char *, ...);
93 extern char *(*deprecated_readline_hook) (char *);
94 extern void (*deprecated_readline_end_hook) (void);
99 This module defines the following debugger commands:
100 trace : set a tracepoint on a function, line, or address.
101 info trace : list all debugger-defined tracepoints.
102 delete trace : delete one or more tracepoints.
103 enable trace : enable one or more tracepoints.
104 disable trace : disable one or more tracepoints.
105 actions : specify actions to be taken at a tracepoint.
106 passcount : specify a pass count for a tracepoint.
107 tstart : start a trace experiment.
108 tstop : stop a trace experiment.
109 tstatus : query the status of a trace experiment.
110 tfind : find a trace frame in the trace buffer.
111 tdump : print everything collected at the current tracepoint.
112 save-tracepoints : write tracepoint setup into a file.
114 This module defines the following user-visible debugger variables:
115 $trace_frame : sequence number of trace frame currently being debugged.
116 $trace_line : source line of trace frame currently being debugged.
117 $trace_file : source file of trace frame currently being debugged.
118 $tracepoint : tracepoint number of trace frame currently being debugged.
122 /* ======= Important global variables: ======= */
124 /* The list of all trace state variables. We don't retain pointers to
125 any of these for any reason - API is by name or number only - so it
126 works to have a vector of objects. */
128 typedef struct trace_state_variable tsv_s;
131 /* An object describing the contents of a traceframe. */
133 struct traceframe_info
135 /* Collected memory. */
136 VEC(mem_range_s) *memory;
139 static VEC(tsv_s) *tvariables;
141 /* The next integer to assign to a variable. */
143 static int next_tsv_number = 1;
145 /* Number of last traceframe collected. */
146 static int traceframe_number;
148 /* Tracepoint for last traceframe collected. */
149 static int tracepoint_number;
151 /* Symbol for function for last traceframe collected. */
152 static struct symbol *traceframe_fun;
154 /* Symtab and line for last traceframe collected. */
155 static struct symtab_and_line traceframe_sal;
157 /* The traceframe info of the current traceframe. NULL if we haven't
158 yet attempted to fetch it, or if the target does not support
159 fetching this object, or if we're not inspecting a traceframe
161 static struct traceframe_info *traceframe_info;
163 /* Tracing command lists. */
164 static struct cmd_list_element *tfindlist;
166 /* List of expressions to collect by default at each tracepoint hit. */
167 char *default_collect = "";
169 static int disconnected_tracing;
171 /* This variable controls whether we ask the target for a linear or
172 circular trace buffer. */
174 static int circular_trace_buffer;
176 /* Textual notes applying to the current and/or future trace runs. */
178 char *trace_user = NULL;
180 /* Textual notes applying to the current and/or future trace runs. */
182 char *trace_notes = NULL;
184 /* Textual notes applying to the stopping of a trace. */
186 char *trace_stop_notes = NULL;
188 /* ======= Important command functions: ======= */
189 static void trace_actions_command (char *, int);
190 static void trace_start_command (char *, int);
191 static void trace_stop_command (char *, int);
192 static void trace_status_command (char *, int);
193 static void trace_find_command (char *, int);
194 static void trace_find_pc_command (char *, int);
195 static void trace_find_tracepoint_command (char *, int);
196 static void trace_find_line_command (char *, int);
197 static void trace_find_range_command (char *, int);
198 static void trace_find_outside_command (char *, int);
199 static void trace_dump_command (char *, int);
201 /* support routines */
203 struct collection_list;
204 static void add_aexpr (struct collection_list *, struct agent_expr *);
205 static char *mem2hex (gdb_byte *, char *, int);
206 static void add_register (struct collection_list *collection,
209 static void free_uploaded_tps (struct uploaded_tp **utpp);
210 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
213 extern void _initialize_tracepoint (void);
215 static struct trace_status trace_status;
217 char *stop_reason_names[] = {
227 struct trace_status *
228 current_trace_status (void)
230 return &trace_status;
236 free_traceframe_info (struct traceframe_info *info)
240 VEC_free (mem_range_s, info->memory);
246 /* Free and clear the traceframe info cache of the current
250 clear_traceframe_info (void)
252 free_traceframe_info (traceframe_info);
253 traceframe_info = NULL;
256 /* Set traceframe number to NUM. */
258 set_traceframe_num (int num)
260 traceframe_number = num;
261 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
264 /* Set tracepoint number to NUM. */
266 set_tracepoint_num (int num)
268 tracepoint_number = num;
269 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
272 /* Set externally visible debug variables for querying/printing
273 the traceframe context (line, function, file). */
276 set_traceframe_context (struct frame_info *trace_frame)
280 /* Save as globals for internal use. */
281 if (trace_frame != NULL
282 && get_frame_pc_if_available (trace_frame, &trace_pc))
284 traceframe_sal = find_pc_line (trace_pc, 0);
285 traceframe_fun = find_pc_function (trace_pc);
287 /* Save linenumber as "$trace_line", a debugger variable visible to
289 set_internalvar_integer (lookup_internalvar ("trace_line"),
290 traceframe_sal.line);
294 init_sal (&traceframe_sal);
295 traceframe_fun = NULL;
296 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
299 /* Save func name as "$trace_func", a debugger variable visible to
301 if (traceframe_fun == NULL
302 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
303 clear_internalvar (lookup_internalvar ("trace_func"));
305 set_internalvar_string (lookup_internalvar ("trace_func"),
306 SYMBOL_LINKAGE_NAME (traceframe_fun));
308 /* Save file name as "$trace_file", a debugger variable visible to
310 if (traceframe_sal.symtab == NULL)
311 clear_internalvar (lookup_internalvar ("trace_file"));
313 set_internalvar_string (lookup_internalvar ("trace_file"),
314 symtab_to_filename_for_display (traceframe_sal.symtab));
317 /* Create a new trace state variable with the given name. */
319 struct trace_state_variable *
320 create_trace_state_variable (const char *name)
322 struct trace_state_variable tsv;
324 memset (&tsv, 0, sizeof (tsv));
325 tsv.name = xstrdup (name);
326 tsv.number = next_tsv_number++;
327 return VEC_safe_push (tsv_s, tvariables, &tsv);
330 /* Look for a trace state variable of the given name. */
332 struct trace_state_variable *
333 find_trace_state_variable (const char *name)
335 struct trace_state_variable *tsv;
338 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
339 if (strcmp (name, tsv->name) == 0)
346 delete_trace_state_variable (const char *name)
348 struct trace_state_variable *tsv;
351 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
352 if (strcmp (name, tsv->name) == 0)
354 observer_notify_tsv_deleted (tsv);
356 xfree ((void *)tsv->name);
357 VEC_unordered_remove (tsv_s, tvariables, ix);
362 warning (_("No trace variable named \"$%s\", not deleting"), name);
365 /* Throws an error if NAME is not valid syntax for a trace state
369 validate_trace_state_variable_name (const char *name)
374 error (_("Must supply a non-empty variable name"));
376 /* All digits in the name is reserved for value history
378 for (p = name; isdigit (*p); p++)
381 error (_("$%s is not a valid trace state variable name"), name);
383 for (p = name; isalnum (*p) || *p == '_'; p++)
386 error (_("$%s is not a valid trace state variable name"), name);
389 /* The 'tvariable' command collects a name and optional expression to
390 evaluate into an initial value. */
393 trace_variable_command (char *args, int from_tty)
395 struct cleanup *old_chain;
397 struct trace_state_variable *tsv;
401 error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
403 /* Only allow two syntaxes; "$name" and "$name=value". */
404 p = skip_spaces (args);
407 error (_("Name of trace variable should start with '$'"));
410 while (isalnum (*p) || *p == '_')
412 name = savestring (name, p - name);
413 old_chain = make_cleanup (xfree, name);
416 if (*p != '=' && *p != '\0')
417 error (_("Syntax must be $NAME [ = EXPR ]"));
419 validate_trace_state_variable_name (name);
422 initval = value_as_long (parse_and_eval (++p));
424 /* If the variable already exists, just change its initial value. */
425 tsv = find_trace_state_variable (name);
428 if (tsv->initial_value != initval)
430 tsv->initial_value = initval;
431 observer_notify_tsv_modified (tsv);
433 printf_filtered (_("Trace state variable $%s "
434 "now has initial value %s.\n"),
435 tsv->name, plongest (tsv->initial_value));
436 do_cleanups (old_chain);
440 /* Create a new variable. */
441 tsv = create_trace_state_variable (name);
442 tsv->initial_value = initval;
444 observer_notify_tsv_created (tsv);
446 printf_filtered (_("Trace state variable $%s "
447 "created, with initial value %s.\n"),
448 tsv->name, plongest (tsv->initial_value));
450 do_cleanups (old_chain);
454 delete_trace_variable_command (char *args, int from_tty)
458 struct cleanup *back_to;
462 if (query (_("Delete all trace state variables? ")))
463 VEC_free (tsv_s, tvariables);
465 observer_notify_tsv_deleted (NULL);
469 argv = gdb_buildargv (args);
470 back_to = make_cleanup_freeargv (argv);
472 for (ix = 0; argv[ix] != NULL; ix++)
474 if (*argv[ix] == '$')
475 delete_trace_state_variable (argv[ix] + 1);
477 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
480 do_cleanups (back_to);
486 tvariables_info_1 (void)
488 struct trace_state_variable *tsv;
491 struct cleanup *back_to;
492 struct ui_out *uiout = current_uiout;
494 if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
496 printf_filtered (_("No trace state variables.\n"));
500 /* Try to acquire values from the target. */
501 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
502 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
505 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
506 count, "trace-variables");
507 ui_out_table_header (uiout, 15, ui_left, "name", "Name");
508 ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
509 ui_out_table_header (uiout, 11, ui_left, "current", "Current");
511 ui_out_table_body (uiout);
513 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
515 struct cleanup *back_to2;
519 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
521 name = concat ("$", tsv->name, (char *) NULL);
522 make_cleanup (xfree, name);
523 ui_out_field_string (uiout, "name", name);
524 ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
526 if (tsv->value_known)
527 c = plongest (tsv->value);
528 else if (ui_out_is_mi_like_p (uiout))
529 /* For MI, we prefer not to use magic string constants, but rather
530 omit the field completely. The difference between unknown and
531 undefined does not seem important enough to represent. */
533 else if (current_trace_status ()->running || traceframe_number >= 0)
534 /* The value is/was defined, but we don't have it. */
537 /* It is not meaningful to ask about the value. */
540 ui_out_field_string (uiout, "current", c);
541 ui_out_text (uiout, "\n");
543 do_cleanups (back_to2);
546 do_cleanups (back_to);
549 /* List all the trace state variables. */
552 tvariables_info (char *args, int from_tty)
554 tvariables_info_1 ();
557 /* Stash definitions of tsvs into the given file. */
560 save_trace_state_variables (struct ui_file *fp)
562 struct trace_state_variable *tsv;
565 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
567 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
568 if (tsv->initial_value)
569 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
570 fprintf_unfiltered (fp, "\n");
574 /* ACTIONS functions: */
576 /* The three functions:
577 collect_pseudocommand,
578 while_stepping_pseudocommand, and
579 end_actions_pseudocommand
580 are placeholders for "commands" that are actually ONLY to be used
581 within a tracepoint action list. If the actual function is ever called,
582 it means that somebody issued the "command" at the top level,
583 which is always an error. */
586 end_actions_pseudocommand (char *args, int from_tty)
588 error (_("This command cannot be used at the top level."));
592 while_stepping_pseudocommand (char *args, int from_tty)
594 error (_("This command can only be used in a tracepoint actions list."));
598 collect_pseudocommand (char *args, int from_tty)
600 error (_("This command can only be used in a tracepoint actions list."));
604 teval_pseudocommand (char *args, int from_tty)
606 error (_("This command can only be used in a tracepoint actions list."));
609 /* Parse any collection options, such as /s for strings. */
612 decode_agent_options (char *exp)
614 struct value_print_options opts;
619 /* Call this to borrow the print elements default for collection
621 get_user_print_options (&opts);
626 if (target_supports_string_tracing ())
628 /* Allow an optional decimal number giving an explicit maximum
629 string length, defaulting it to the "print elements" value;
630 so "collect/s80 mystr" gets at most 80 bytes of string. */
631 trace_string_kludge = opts.print_max;
633 if (*exp >= '0' && *exp <= '9')
634 trace_string_kludge = atoi (exp);
635 while (*exp >= '0' && *exp <= '9')
639 error (_("Target does not support \"/s\" option for string tracing."));
642 error (_("Undefined collection format \"%c\"."), *exp);
644 exp = skip_spaces (exp);
649 /* Enter a list of actions for a tracepoint. */
651 trace_actions_command (char *args, int from_tty)
653 struct tracepoint *t;
654 struct command_line *l;
656 t = get_tracepoint_by_number (&args, NULL, 1);
660 xstrprintf ("Enter actions for tracepoint %d, one per line.",
662 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
664 l = read_command_lines (tmpbuf, from_tty, 1,
665 check_tracepoint_command, t);
666 do_cleanups (cleanups);
667 breakpoint_set_commands (&t->base, l);
669 /* else just return */
672 /* Report the results of checking the agent expression, as errors or
676 report_agent_reqs_errors (struct agent_expr *aexpr)
678 /* All of the "flaws" are serious bytecode generation issues that
679 should never occur. */
680 if (aexpr->flaw != agent_flaw_none)
681 internal_error (__FILE__, __LINE__, _("expression is malformed"));
683 /* If analysis shows a stack underflow, GDB must have done something
684 badly wrong in its bytecode generation. */
685 if (aexpr->min_height < 0)
686 internal_error (__FILE__, __LINE__,
687 _("expression has min height < 0"));
689 /* Issue this error if the stack is predicted to get too deep. The
690 limit is rather arbitrary; a better scheme might be for the
691 target to report how much stack it will have available. The
692 depth roughly corresponds to parenthesization, so a limit of 20
693 amounts to 20 levels of expression nesting, which is actually
694 a pretty big hairy expression. */
695 if (aexpr->max_height > 20)
696 error (_("Expression is too complicated."));
699 /* worker function */
701 validate_actionline (char **line, struct breakpoint *b)
703 struct cmd_list_element *c;
704 struct expression *exp = NULL;
705 struct cleanup *old_chain = NULL;
707 struct bp_location *loc;
708 struct agent_expr *aexpr;
709 struct tracepoint *t = (struct tracepoint *) b;
711 /* If EOF is typed, *line is NULL. */
715 for (p = *line; isspace ((int) *p);)
718 /* Symbol lookup etc. */
719 if (*p == '\0') /* empty line: just prompt for another line. */
722 if (*p == '#') /* comment line */
725 c = lookup_cmd (&p, cmdlist, "", -1, 1);
727 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
729 if (cmd_cfunc_eq (c, collect_pseudocommand))
731 trace_string_kludge = 0;
733 p = decode_agent_options (p);
736 { /* Repeat over a comma-separated list. */
737 QUIT; /* Allow user to bail out with ^C. */
738 while (isspace ((int) *p))
741 if (*p == '$') /* Look for special pseudo-symbols. */
743 if (0 == strncasecmp ("reg", p + 1, 3)
744 || 0 == strncasecmp ("arg", p + 1, 3)
745 || 0 == strncasecmp ("loc", p + 1, 3)
746 || 0 == strncasecmp ("_ret", p + 1, 4)
747 || 0 == strncasecmp ("_sdata", p + 1, 6))
752 /* else fall thru, treat p as an expression and parse it! */
755 for (loc = t->base.loc; loc; loc = loc->next)
758 exp = parse_exp_1 (&p, loc->address,
759 block_for_pc (loc->address), 1);
760 old_chain = make_cleanup (free_current_contents, &exp);
762 if (exp->elts[0].opcode == OP_VAR_VALUE)
764 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
766 error (_("constant `%s' (value %s) "
767 "will not be collected."),
768 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
769 plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
771 else if (SYMBOL_CLASS (exp->elts[2].symbol)
772 == LOC_OPTIMIZED_OUT)
774 error (_("`%s' is optimized away "
775 "and cannot be collected."),
776 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
780 /* We have something to collect, make sure that the expr to
781 bytecode translator can handle it and that it's not too
783 aexpr = gen_trace_for_expr (loc->address, exp);
784 make_cleanup_free_agent_expr (aexpr);
786 if (aexpr->len > MAX_AGENT_EXPR_LEN)
787 error (_("Expression is too complicated."));
791 report_agent_reqs_errors (aexpr);
793 do_cleanups (old_chain);
796 while (p && *p++ == ',');
799 else if (cmd_cfunc_eq (c, teval_pseudocommand))
802 { /* Repeat over a comma-separated list. */
803 QUIT; /* Allow user to bail out with ^C. */
804 while (isspace ((int) *p))
808 for (loc = t->base.loc; loc; loc = loc->next)
811 /* Only expressions are allowed for this action. */
812 exp = parse_exp_1 (&p, loc->address,
813 block_for_pc (loc->address), 1);
814 old_chain = make_cleanup (free_current_contents, &exp);
816 /* We have something to evaluate, make sure that the expr to
817 bytecode translator can handle it and that it's not too
819 aexpr = gen_eval_for_expr (loc->address, exp);
820 make_cleanup_free_agent_expr (aexpr);
822 if (aexpr->len > MAX_AGENT_EXPR_LEN)
823 error (_("Expression is too complicated."));
826 report_agent_reqs_errors (aexpr);
828 do_cleanups (old_chain);
831 while (p && *p++ == ',');
834 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
836 char *steparg; /* In case warning is necessary. */
838 while (isspace ((int) *p))
842 if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
843 error (_("while-stepping step count `%s' is malformed."), *line);
846 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
850 error (_("`%s' is not a supported tracepoint action."), *line);
854 memrange_absolute = -1
859 int type; /* memrange_absolute for absolute memory range,
860 else basereg number. */
861 bfd_signed_vma start;
865 struct collection_list
867 unsigned char regs_mask[32]; /* room for up to 256 regs */
870 struct memrange *list;
871 long aexpr_listsize; /* size of array pointed to by expr_list elt */
873 struct agent_expr **aexpr_list;
875 /* True is the user requested a collection of "$_sdata", "static
879 tracepoint_list, stepping_list;
881 /* MEMRANGE functions: */
883 static int memrange_cmp (const void *, const void *);
885 /* Compare memranges for qsort. */
887 memrange_cmp (const void *va, const void *vb)
889 const struct memrange *a = va, *b = vb;
891 if (a->type < b->type)
893 if (a->type > b->type)
895 if (a->type == memrange_absolute)
897 if ((bfd_vma) a->start < (bfd_vma) b->start)
899 if ((bfd_vma) a->start > (bfd_vma) b->start)
904 if (a->start < b->start)
906 if (a->start > b->start)
912 /* Sort the memrange list using qsort, and merge adjacent memranges. */
914 memrange_sortmerge (struct collection_list *memranges)
918 qsort (memranges->list, memranges->next_memrange,
919 sizeof (struct memrange), memrange_cmp);
920 if (memranges->next_memrange > 0)
922 for (a = 0, b = 1; b < memranges->next_memrange; b++)
924 /* If memrange b overlaps or is adjacent to memrange a,
926 if (memranges->list[a].type == memranges->list[b].type
927 && memranges->list[b].start <= memranges->list[a].end)
929 if (memranges->list[b].end > memranges->list[a].end)
930 memranges->list[a].end = memranges->list[b].end;
931 continue; /* next b, same a */
935 memcpy (&memranges->list[a], &memranges->list[b],
936 sizeof (struct memrange));
938 memranges->next_memrange = a + 1;
942 /* Add a register to a collection list. */
944 add_register (struct collection_list *collection, unsigned int regno)
947 printf_filtered ("collect register %d\n", regno);
948 if (regno >= (8 * sizeof (collection->regs_mask)))
949 error (_("Internal: register number %d too large for tracepoint"),
951 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
954 /* Add a memrange to a collection list. */
956 add_memrange (struct collection_list *memranges,
957 int type, bfd_signed_vma base,
962 printf_filtered ("(%d,", type);
964 printf_filtered (",%ld)\n", len);
967 /* type: memrange_absolute == memory, other n == basereg */
968 memranges->list[memranges->next_memrange].type = type;
969 /* base: addr if memory, offset if reg relative. */
970 memranges->list[memranges->next_memrange].start = base;
971 /* len: we actually save end (base + len) for convenience */
972 memranges->list[memranges->next_memrange].end = base + len;
973 memranges->next_memrange++;
974 if (memranges->next_memrange >= memranges->listsize)
976 memranges->listsize *= 2;
977 memranges->list = xrealloc (memranges->list,
978 memranges->listsize);
981 if (type != memrange_absolute) /* Better collect the base register! */
982 add_register (memranges, type);
985 /* Add a symbol to a collection list. */
987 collect_symbol (struct collection_list *collect,
989 struct gdbarch *gdbarch,
990 long frame_regno, long frame_offset,
995 bfd_signed_vma offset;
996 int treat_as_expr = 0;
998 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
999 switch (SYMBOL_CLASS (sym))
1002 printf_filtered ("%s: don't know symbol class %d\n",
1003 SYMBOL_PRINT_NAME (sym),
1004 SYMBOL_CLASS (sym));
1007 printf_filtered ("constant %s (value %s) will not be collected.\n",
1008 SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
1011 offset = SYMBOL_VALUE_ADDRESS (sym);
1016 sprintf_vma (tmp, offset);
1017 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
1018 SYMBOL_PRINT_NAME (sym), len,
1021 /* A struct may be a C++ class with static fields, go to general
1022 expression handling. */
1023 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
1026 add_memrange (collect, memrange_absolute, offset, len);
1029 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
1031 printf_filtered ("LOC_REG[parm] %s: ",
1032 SYMBOL_PRINT_NAME (sym));
1033 add_register (collect, reg);
1034 /* Check for doubles stored in two registers. */
1035 /* FIXME: how about larger types stored in 3 or more regs? */
1036 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
1037 len > register_size (gdbarch, reg))
1038 add_register (collect, reg + 1);
1041 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
1042 printf_filtered (" (will not collect %s)\n",
1043 SYMBOL_PRINT_NAME (sym));
1047 offset = frame_offset + SYMBOL_VALUE (sym);
1050 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1051 SYMBOL_PRINT_NAME (sym), len);
1052 printf_vma (offset);
1053 printf_filtered (" from frame ptr reg %d\n", reg);
1055 add_memrange (collect, reg, offset, len);
1057 case LOC_REGPARM_ADDR:
1058 reg = SYMBOL_VALUE (sym);
1062 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
1063 SYMBOL_PRINT_NAME (sym), len);
1064 printf_vma (offset);
1065 printf_filtered (" from reg %d\n", reg);
1067 add_memrange (collect, reg, offset, len);
1071 offset = frame_offset + SYMBOL_VALUE (sym);
1074 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1075 SYMBOL_PRINT_NAME (sym), len);
1076 printf_vma (offset);
1077 printf_filtered (" from frame ptr reg %d\n", reg);
1079 add_memrange (collect, reg, offset, len);
1082 case LOC_UNRESOLVED:
1086 case LOC_OPTIMIZED_OUT:
1087 printf_filtered ("%s has been optimized out of existence.\n",
1088 SYMBOL_PRINT_NAME (sym));
1096 /* Expressions are the most general case. */
1099 struct agent_expr *aexpr;
1100 struct cleanup *old_chain1 = NULL;
1102 aexpr = gen_trace_for_var (scope, gdbarch, sym);
1104 /* It can happen that the symbol is recorded as a computed
1105 location, but it's been optimized away and doesn't actually
1106 have a location expression. */
1109 printf_filtered ("%s has been optimized out of existence.\n",
1110 SYMBOL_PRINT_NAME (sym));
1114 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1118 report_agent_reqs_errors (aexpr);
1120 discard_cleanups (old_chain1);
1121 add_aexpr (collect, aexpr);
1123 /* Take care of the registers. */
1124 if (aexpr->reg_mask_len > 0)
1128 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1130 QUIT; /* Allow user to bail out with ^C. */
1131 if (aexpr->reg_mask[ndx1] != 0)
1133 /* Assume chars have 8 bits. */
1134 for (ndx2 = 0; ndx2 < 8; ndx2++)
1135 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1136 /* It's used -- record it. */
1137 add_register (collect, ndx1 * 8 + ndx2);
1144 /* Data to be passed around in the calls to the locals and args
1147 struct add_local_symbols_data
1149 struct collection_list *collect;
1150 struct gdbarch *gdbarch;
1157 /* The callback for the locals and args iterators. */
1160 do_collect_symbol (const char *print_name,
1164 struct add_local_symbols_data *p = cb_data;
1166 collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1167 p->frame_offset, p->pc);
1171 /* Add all locals (or args) symbols to collection list. */
1173 add_local_symbols (struct collection_list *collect,
1174 struct gdbarch *gdbarch, CORE_ADDR pc,
1175 long frame_regno, long frame_offset, int type)
1177 struct block *block;
1178 struct add_local_symbols_data cb_data;
1180 cb_data.collect = collect;
1181 cb_data.gdbarch = gdbarch;
1183 cb_data.frame_regno = frame_regno;
1184 cb_data.frame_offset = frame_offset;
1189 block = block_for_pc (pc);
1192 warning (_("Can't collect locals; "
1193 "no symbol table info available.\n"));
1197 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1198 if (cb_data.count == 0)
1199 warning (_("No locals found in scope."));
1203 pc = get_pc_function_start (pc);
1204 block = block_for_pc (pc);
1207 warning (_("Can't collect args; no symbol table info available."));
1211 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1212 if (cb_data.count == 0)
1213 warning (_("No args found in scope."));
1218 add_static_trace_data (struct collection_list *collection)
1221 printf_filtered ("collect static trace data\n");
1222 collection->strace_data = 1;
1225 /* worker function */
1227 clear_collection_list (struct collection_list *list)
1231 list->next_memrange = 0;
1232 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1234 free_agent_expr (list->aexpr_list[ndx]);
1235 list->aexpr_list[ndx] = NULL;
1237 list->next_aexpr_elt = 0;
1238 memset (list->regs_mask, 0, sizeof (list->regs_mask));
1239 list->strace_data = 0;
1242 /* Reduce a collection list to string form (for gdb protocol). */
1244 stringify_collection_list (struct collection_list *list, char *string)
1246 char temp_buf[2048];
1250 char *(*str_list)[];
1254 count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
1255 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1257 if (list->strace_data)
1260 printf_filtered ("\nCollecting static trace data\n");
1263 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1267 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1268 if (list->regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1270 if (list->regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1273 printf_filtered ("\nCollecting registers (mask): 0x");
1278 QUIT; /* Allow user to bail out with ^C. */
1280 printf_filtered ("%02X", list->regs_mask[i]);
1281 sprintf (end, "%02X", list->regs_mask[i]);
1284 (*str_list)[ndx] = xstrdup (temp_buf);
1288 printf_filtered ("\n");
1289 if (list->next_memrange > 0 && info_verbose)
1290 printf_filtered ("Collecting memranges: \n");
1291 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1293 QUIT; /* Allow user to bail out with ^C. */
1294 sprintf_vma (tmp2, list->list[i].start);
1297 printf_filtered ("(%d, %s, %ld)\n",
1300 (long) (list->list[i].end - list->list[i].start));
1302 if (count + 27 > MAX_AGENT_EXPR_LEN)
1304 (*str_list)[ndx] = savestring (temp_buf, count);
1311 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1313 /* The "%X" conversion specifier expects an unsigned argument,
1314 so passing -1 (memrange_absolute) to it directly gives you
1315 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1317 if (list->list[i].type == memrange_absolute)
1318 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1320 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1323 count += strlen (end);
1324 end = temp_buf + count;
1327 for (i = 0; i < list->next_aexpr_elt; i++)
1329 QUIT; /* Allow user to bail out with ^C. */
1330 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1332 (*str_list)[ndx] = savestring (temp_buf, count);
1337 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1338 end += 10; /* 'X' + 8 hex digits + ',' */
1341 end = mem2hex (list->aexpr_list[i]->buf,
1342 end, list->aexpr_list[i]->len);
1343 count += 2 * list->aexpr_list[i]->len;
1348 (*str_list)[ndx] = savestring (temp_buf, count);
1353 (*str_list)[ndx] = NULL;
1366 encode_actions_1 (struct command_line *action,
1367 struct breakpoint *t,
1368 struct bp_location *tloc,
1370 LONGEST frame_offset,
1371 struct collection_list *collect,
1372 struct collection_list *stepping_list)
1375 struct expression *exp = NULL;
1377 struct value *tempval;
1378 struct cmd_list_element *cmd;
1379 struct agent_expr *aexpr;
1381 for (; action; action = action->next)
1383 QUIT; /* Allow user to bail out with ^C. */
1384 action_exp = action->line;
1385 while (isspace ((int) *action_exp))
1388 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1390 error (_("Bad action list item: %s"), action_exp);
1392 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1394 trace_string_kludge = 0;
1395 if (*action_exp == '/')
1396 action_exp = decode_agent_options (action_exp);
1399 { /* Repeat over a comma-separated list. */
1400 QUIT; /* Allow user to bail out with ^C. */
1401 while (isspace ((int) *action_exp))
1404 if (0 == strncasecmp ("$reg", action_exp, 4))
1406 for (i = 0; i < gdbarch_num_regs (tloc->gdbarch); i++)
1407 add_register (collect, i);
1408 action_exp = strchr (action_exp, ','); /* more? */
1410 else if (0 == strncasecmp ("$arg", action_exp, 4))
1412 add_local_symbols (collect,
1418 action_exp = strchr (action_exp, ','); /* more? */
1420 else if (0 == strncasecmp ("$loc", action_exp, 4))
1422 add_local_symbols (collect,
1428 action_exp = strchr (action_exp, ','); /* more? */
1430 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1432 struct cleanup *old_chain1 = NULL;
1434 aexpr = gen_trace_for_return_address (tloc->address,
1437 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1440 report_agent_reqs_errors (aexpr);
1442 discard_cleanups (old_chain1);
1443 add_aexpr (collect, aexpr);
1445 /* take care of the registers */
1446 if (aexpr->reg_mask_len > 0)
1450 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1452 QUIT; /* allow user to bail out with ^C */
1453 if (aexpr->reg_mask[ndx1] != 0)
1455 /* assume chars have 8 bits */
1456 for (ndx2 = 0; ndx2 < 8; ndx2++)
1457 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1458 /* it's used -- record it */
1459 add_register (collect,
1465 action_exp = strchr (action_exp, ','); /* more? */
1467 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1469 add_static_trace_data (collect);
1470 action_exp = strchr (action_exp, ','); /* more? */
1475 struct cleanup *old_chain = NULL;
1476 struct cleanup *old_chain1 = NULL;
1478 exp = parse_exp_1 (&action_exp, tloc->address,
1479 block_for_pc (tloc->address), 1);
1480 old_chain = make_cleanup (free_current_contents, &exp);
1482 switch (exp->elts[0].opcode)
1486 const char *name = &exp->elts[2].string;
1488 i = user_reg_map_name_to_regnum (tloc->gdbarch,
1489 name, strlen (name));
1491 internal_error (__FILE__, __LINE__,
1492 _("Register $%s not available"),
1495 printf_filtered ("OP_REGISTER: ");
1496 add_register (collect, i);
1501 /* Safe because we know it's a simple expression. */
1502 tempval = evaluate_expression (exp);
1503 addr = value_address (tempval);
1504 /* Initialize the TYPE_LENGTH if it is a typedef. */
1505 check_typedef (exp->elts[1].type);
1506 add_memrange (collect, memrange_absolute, addr,
1507 TYPE_LENGTH (exp->elts[1].type));
1511 collect_symbol (collect,
1512 exp->elts[2].symbol,
1519 default: /* Full-fledged expression. */
1520 aexpr = gen_trace_for_expr (tloc->address, exp);
1522 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1526 report_agent_reqs_errors (aexpr);
1528 discard_cleanups (old_chain1);
1529 add_aexpr (collect, aexpr);
1531 /* Take care of the registers. */
1532 if (aexpr->reg_mask_len > 0)
1537 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1539 QUIT; /* Allow user to bail out with ^C. */
1540 if (aexpr->reg_mask[ndx1] != 0)
1542 /* Assume chars have 8 bits. */
1543 for (ndx2 = 0; ndx2 < 8; ndx2++)
1544 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1545 /* It's used -- record it. */
1546 add_register (collect,
1553 do_cleanups (old_chain);
1556 while (action_exp && *action_exp++ == ',');
1558 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1561 { /* Repeat over a comma-separated list. */
1562 QUIT; /* Allow user to bail out with ^C. */
1563 while (isspace ((int) *action_exp))
1567 struct cleanup *old_chain = NULL;
1568 struct cleanup *old_chain1 = NULL;
1570 exp = parse_exp_1 (&action_exp, tloc->address,
1571 block_for_pc (tloc->address), 1);
1572 old_chain = make_cleanup (free_current_contents, &exp);
1574 aexpr = gen_eval_for_expr (tloc->address, exp);
1575 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1578 report_agent_reqs_errors (aexpr);
1580 discard_cleanups (old_chain1);
1581 /* Even though we're not officially collecting, add
1582 to the collect list anyway. */
1583 add_aexpr (collect, aexpr);
1585 do_cleanups (old_chain);
1588 while (action_exp && *action_exp++ == ',');
1590 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1592 /* We check against nested while-stepping when setting
1593 breakpoint action, so no way to run into nested
1595 gdb_assert (stepping_list);
1597 encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
1598 frame_offset, stepping_list, NULL);
1601 error (_("Invalid tracepoint command '%s'"), action->line);
1605 /* Render all actions into gdb protocol. */
1608 encode_actions (struct breakpoint *t, struct bp_location *tloc,
1609 char ***tdp_actions, char ***stepping_actions)
1611 static char tdp_buff[2048], step_buff[2048];
1612 char *default_collect_line = NULL;
1613 struct command_line *actions;
1614 struct command_line *default_collect_action = NULL;
1616 LONGEST frame_offset;
1617 struct cleanup *back_to;
1619 back_to = make_cleanup (null_cleanup, NULL);
1621 clear_collection_list (&tracepoint_list);
1622 clear_collection_list (&stepping_list);
1624 *tdp_actions = NULL;
1625 *stepping_actions = NULL;
1627 gdbarch_virtual_frame_pointer (tloc->gdbarch,
1628 tloc->address, &frame_reg, &frame_offset);
1630 actions = breakpoint_commands (t);
1632 /* If there are default expressions to collect, make up a collect
1633 action and prepend to the action list to encode. Note that since
1634 validation is per-tracepoint (local var "xyz" might be valid for
1635 one tracepoint and not another, etc), we make up the action on
1636 the fly, and don't cache it. */
1637 if (*default_collect)
1641 default_collect_line = xstrprintf ("collect %s", default_collect);
1642 make_cleanup (xfree, default_collect_line);
1644 line = default_collect_line;
1645 validate_actionline (&line, t);
1647 default_collect_action = xmalloc (sizeof (struct command_line));
1648 make_cleanup (xfree, default_collect_action);
1649 default_collect_action->next = actions;
1650 default_collect_action->line = line;
1651 actions = default_collect_action;
1653 encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1654 &tracepoint_list, &stepping_list);
1656 memrange_sortmerge (&tracepoint_list);
1657 memrange_sortmerge (&stepping_list);
1659 *tdp_actions = stringify_collection_list (&tracepoint_list,
1661 *stepping_actions = stringify_collection_list (&stepping_list,
1664 do_cleanups (back_to);
1668 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1670 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1672 collect->aexpr_list =
1673 xrealloc (collect->aexpr_list,
1674 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1675 collect->aexpr_listsize *= 2;
1677 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1678 collect->next_aexpr_elt++;
1682 process_tracepoint_on_disconnect (void)
1684 VEC(breakpoint_p) *tp_vec = NULL;
1686 struct breakpoint *b;
1687 int has_pending_p = 0;
1689 /* Check whether we still have pending tracepoint. If we have, warn the
1690 user that pending tracepoint will no longer work. */
1691 tp_vec = all_tracepoints ();
1692 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1701 struct bp_location *loc1;
1703 for (loc1 = b->loc; loc1; loc1 = loc1->next)
1705 if (loc1->shlib_disabled)
1716 VEC_free (breakpoint_p, tp_vec);
1719 warning (_("Pending tracepoints will not be resolved while"
1720 " GDB is disconnected\n"));
1725 start_tracing (char *notes)
1727 VEC(breakpoint_p) *tp_vec = NULL;
1729 struct breakpoint *b;
1730 struct trace_state_variable *tsv;
1731 int any_enabled = 0, num_to_download = 0;
1734 tp_vec = all_tracepoints ();
1736 /* No point in tracing without any tracepoints... */
1737 if (VEC_length (breakpoint_p, tp_vec) == 0)
1739 VEC_free (breakpoint_p, tp_vec);
1740 error (_("No tracepoints defined, not starting trace"));
1743 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1745 struct tracepoint *t = (struct tracepoint *) b;
1746 struct bp_location *loc;
1748 if (b->enable_state == bp_enabled)
1751 if ((b->type == bp_fast_tracepoint
1752 ? may_insert_fast_tracepoints
1753 : may_insert_tracepoints))
1756 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1757 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1762 if (target_supports_enable_disable_tracepoint ())
1763 warning (_("No tracepoints enabled"));
1766 /* No point in tracing with only disabled tracepoints that
1767 cannot be re-enabled. */
1768 VEC_free (breakpoint_p, tp_vec);
1769 error (_("No tracepoints enabled, not starting trace"));
1773 if (num_to_download <= 0)
1775 VEC_free (breakpoint_p, tp_vec);
1776 error (_("No tracepoints that may be downloaded, not starting trace"));
1779 target_trace_init ();
1781 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1783 struct tracepoint *t = (struct tracepoint *) b;
1784 struct bp_location *loc;
1785 int bp_location_downloaded = 0;
1787 /* Clear `inserted' flag. */
1788 for (loc = b->loc; loc; loc = loc->next)
1791 if ((b->type == bp_fast_tracepoint
1792 ? !may_insert_fast_tracepoints
1793 : !may_insert_tracepoints))
1796 t->number_on_target = 0;
1798 for (loc = b->loc; loc; loc = loc->next)
1800 /* Since tracepoint locations are never duplicated, `inserted'
1801 flag should be zero. */
1802 gdb_assert (!loc->inserted);
1804 target_download_tracepoint (loc);
1807 bp_location_downloaded = 1;
1810 t->number_on_target = b->number;
1812 for (loc = b->loc; loc; loc = loc->next)
1813 if (loc->probe != NULL)
1814 loc->probe->pops->set_semaphore (loc->probe, loc->gdbarch);
1816 if (bp_location_downloaded)
1817 observer_notify_breakpoint_modified (b);
1819 VEC_free (breakpoint_p, tp_vec);
1821 /* Send down all the trace state variables too. */
1822 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1824 target_download_trace_state_variable (tsv);
1827 /* Tell target to treat text-like sections as transparent. */
1828 target_trace_set_readonly_regions ();
1829 /* Set some mode flags. */
1830 target_set_disconnected_tracing (disconnected_tracing);
1831 target_set_circular_trace_buffer (circular_trace_buffer);
1834 notes = trace_notes;
1835 ret = target_set_trace_notes (trace_user, notes, NULL);
1837 if (!ret && (trace_user || notes))
1838 warning (_("Target does not support trace user/notes, info ignored"));
1840 /* Now insert traps and begin collecting data. */
1841 target_trace_start ();
1843 /* Reset our local state. */
1844 set_traceframe_num (-1);
1845 set_tracepoint_num (-1);
1846 set_traceframe_context (NULL);
1847 current_trace_status()->running = 1;
1848 clear_traceframe_info ();
1851 /* The tstart command requests the target to start a new trace run.
1852 The command passes any arguments it has to the target verbatim, as
1853 an optional "trace note". This is useful as for instance a warning
1854 to other users if the trace runs disconnected, and you don't want
1855 anybody else messing with the target. */
1858 trace_start_command (char *args, int from_tty)
1860 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1862 if (current_trace_status ()->running)
1865 && !query (_("A trace is running already. Start a new run? ")))
1866 error (_("New trace run not started."));
1869 start_tracing (args);
1872 /* The tstop command stops the tracing run. The command passes any
1873 supplied arguments to the target verbatim as a "stop note"; if the
1874 target supports trace notes, then it will be reported back as part
1875 of the trace run's status. */
1878 trace_stop_command (char *args, int from_tty)
1880 if (!current_trace_status ()->running)
1881 error (_("Trace is not running."));
1883 stop_tracing (args);
1887 stop_tracing (char *note)
1890 VEC(breakpoint_p) *tp_vec = NULL;
1892 struct breakpoint *t;
1894 target_trace_stop ();
1896 tp_vec = all_tracepoints ();
1897 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1899 struct bp_location *loc;
1901 if ((t->type == bp_fast_tracepoint
1902 ? !may_insert_fast_tracepoints
1903 : !may_insert_tracepoints))
1906 for (loc = t->loc; loc; loc = loc->next)
1908 /* GDB can be totally absent in some disconnected trace scenarios,
1909 but we don't really care if this semaphore goes out of sync.
1910 That's why we are decrementing it here, but not taking care
1912 if (loc->probe != NULL)
1913 loc->probe->pops->clear_semaphore (loc->probe, loc->gdbarch);
1917 VEC_free (breakpoint_p, tp_vec);
1920 note = trace_stop_notes;
1921 ret = target_set_trace_notes (NULL, NULL, note);
1924 warning (_("Target does not support trace notes, note ignored"));
1926 /* Should change in response to reply? */
1927 current_trace_status ()->running = 0;
1930 /* tstatus command */
1932 trace_status_command (char *args, int from_tty)
1934 struct trace_status *ts = current_trace_status ();
1936 VEC(breakpoint_p) *tp_vec = NULL;
1937 struct breakpoint *t;
1939 status = target_get_trace_status (ts);
1943 if (ts->filename != NULL)
1944 printf_filtered (_("Using a trace file.\n"));
1947 printf_filtered (_("Trace can not be run on this target.\n"));
1952 if (!ts->running_known)
1954 printf_filtered (_("Run/stop status is unknown.\n"));
1956 else if (ts->running)
1958 printf_filtered (_("Trace is running on the target.\n"));
1962 switch (ts->stop_reason)
1964 case trace_never_run:
1965 printf_filtered (_("No trace has been run on the target.\n"));
1969 printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1972 printf_filtered (_("Trace stopped by a tstop command.\n"));
1974 case trace_buffer_full:
1975 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1977 case trace_disconnected:
1978 printf_filtered (_("Trace stopped because of disconnection.\n"));
1980 case tracepoint_passcount:
1981 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1982 ts->stopping_tracepoint);
1984 case tracepoint_error:
1985 if (ts->stopping_tracepoint)
1986 printf_filtered (_("Trace stopped by an "
1987 "error (%s, tracepoint %d).\n"),
1988 ts->stop_desc, ts->stopping_tracepoint);
1990 printf_filtered (_("Trace stopped by an error (%s).\n"),
1993 case trace_stop_reason_unknown:
1994 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1997 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
2003 if (ts->traceframes_created >= 0
2004 && ts->traceframe_count != ts->traceframes_created)
2006 printf_filtered (_("Buffer contains %d trace "
2007 "frames (of %d created total).\n"),
2008 ts->traceframe_count, ts->traceframes_created);
2010 else if (ts->traceframe_count >= 0)
2012 printf_filtered (_("Collected %d trace frames.\n"),
2013 ts->traceframe_count);
2016 if (ts->buffer_free >= 0)
2018 if (ts->buffer_size >= 0)
2020 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
2021 ts->buffer_free, ts->buffer_size);
2022 if (ts->buffer_size > 0)
2023 printf_filtered (_(" (%d%% full)"),
2024 ((int) ((((long long) (ts->buffer_size
2025 - ts->buffer_free)) * 100)
2026 / ts->buffer_size)));
2027 printf_filtered (_(".\n"));
2030 printf_filtered (_("Trace buffer has %d bytes free.\n"),
2034 if (ts->disconnected_tracing)
2035 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
2037 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
2039 if (ts->circular_buffer)
2040 printf_filtered (_("Trace buffer is circular.\n"));
2042 if (ts->user_name && strlen (ts->user_name) > 0)
2043 printf_filtered (_("Trace user is %s.\n"), ts->user_name);
2045 if (ts->notes && strlen (ts->notes) > 0)
2046 printf_filtered (_("Trace notes: %s.\n"), ts->notes);
2048 /* Now report on what we're doing with tfind. */
2049 if (traceframe_number >= 0)
2050 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
2051 traceframe_number, tracepoint_number);
2053 printf_filtered (_("Not looking at any trace frame.\n"));
2055 /* Report start/stop times if supplied. */
2060 LONGEST run_time = ts->stop_time - ts->start_time;
2062 /* Reporting a run time is more readable than two long numbers. */
2063 printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
2064 (long int) ts->start_time / 1000000,
2065 (long int) ts->start_time % 1000000,
2066 (long int) run_time / 1000000,
2067 (long int) run_time % 1000000);
2070 printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
2071 (long int) ts->start_time / 1000000,
2072 (long int) ts->start_time % 1000000);
2074 else if (ts->stop_time)
2075 printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
2076 (long int) ts->stop_time / 1000000,
2077 (long int) ts->stop_time % 1000000);
2079 /* Now report any per-tracepoint status available. */
2080 tp_vec = all_tracepoints ();
2082 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
2083 target_get_tracepoint_status (t, NULL);
2085 VEC_free (breakpoint_p, tp_vec);
2088 /* Report the trace status to uiout, in a way suitable for MI, and not
2089 suitable for CLI. If ON_STOP is true, suppress a few fields that
2090 are not meaningful in the -trace-stop response.
2092 The implementation is essentially parallel to trace_status_command, but
2093 merging them will result in unreadable code. */
2095 trace_status_mi (int on_stop)
2097 struct ui_out *uiout = current_uiout;
2098 struct trace_status *ts = current_trace_status ();
2101 status = target_get_trace_status (ts);
2103 if (status == -1 && ts->filename == NULL)
2105 ui_out_field_string (uiout, "supported", "0");
2109 if (ts->filename != NULL)
2110 ui_out_field_string (uiout, "supported", "file");
2112 ui_out_field_string (uiout, "supported", "1");
2114 if (ts->filename != NULL)
2115 ui_out_field_string (uiout, "trace-file", ts->filename);
2117 gdb_assert (ts->running_known);
2121 ui_out_field_string (uiout, "running", "1");
2123 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
2124 Given that the frontend gets the status either on -trace-stop, or from
2125 -trace-status after re-connection, it does not seem like this
2126 information is necessary for anything. It is not necessary for either
2127 figuring the vital state of the target nor for navigation of trace
2128 frames. If the frontend wants to show the current state is some
2129 configure dialog, it can request the value when such dialog is
2130 invoked by the user. */
2134 char *stop_reason = NULL;
2135 int stopping_tracepoint = -1;
2138 ui_out_field_string (uiout, "running", "0");
2140 if (ts->stop_reason != trace_stop_reason_unknown)
2142 switch (ts->stop_reason)
2145 stop_reason = "request";
2147 case trace_buffer_full:
2148 stop_reason = "overflow";
2150 case trace_disconnected:
2151 stop_reason = "disconnection";
2153 case tracepoint_passcount:
2154 stop_reason = "passcount";
2155 stopping_tracepoint = ts->stopping_tracepoint;
2157 case tracepoint_error:
2158 stop_reason = "error";
2159 stopping_tracepoint = ts->stopping_tracepoint;
2165 ui_out_field_string (uiout, "stop-reason", stop_reason);
2166 if (stopping_tracepoint != -1)
2167 ui_out_field_int (uiout, "stopping-tracepoint",
2168 stopping_tracepoint);
2169 if (ts->stop_reason == tracepoint_error)
2170 ui_out_field_string (uiout, "error-description",
2176 if (ts->traceframe_count != -1)
2177 ui_out_field_int (uiout, "frames", ts->traceframe_count);
2178 if (ts->traceframes_created != -1)
2179 ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
2180 if (ts->buffer_size != -1)
2181 ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
2182 if (ts->buffer_free != -1)
2183 ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
2185 ui_out_field_int (uiout, "disconnected", ts->disconnected_tracing);
2186 ui_out_field_int (uiout, "circular", ts->circular_buffer);
2188 ui_out_field_string (uiout, "user-name", ts->user_name);
2189 ui_out_field_string (uiout, "notes", ts->notes);
2194 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2195 (long int) ts->start_time / 1000000,
2196 (long int) ts->start_time % 1000000);
2197 ui_out_field_string (uiout, "start-time", buf);
2198 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2199 (long int) ts->stop_time / 1000000,
2200 (long int) ts->stop_time % 1000000);
2201 ui_out_field_string (uiout, "stop-time", buf);
2205 /* This function handles the details of what to do about an ongoing
2206 tracing run if the user has asked to detach or otherwise disconnect
2209 disconnect_tracing (int from_tty)
2211 /* It can happen that the target that was tracing went away on its
2212 own, and we didn't notice. Get a status update, and if the
2213 current target doesn't even do tracing, then assume it's not
2215 if (target_get_trace_status (current_trace_status ()) < 0)
2216 current_trace_status ()->running = 0;
2218 /* If running interactively, give the user the option to cancel and
2219 then decide what to do differently with the run. Scripts are
2220 just going to disconnect and let the target deal with it,
2221 according to how it's been instructed previously via
2222 disconnected-tracing. */
2223 if (current_trace_status ()->running && from_tty)
2225 process_tracepoint_on_disconnect ();
2227 if (current_trace_status ()->disconnected_tracing)
2229 if (!query (_("Trace is running and will "
2230 "continue after detach; detach anyway? ")))
2231 error (_("Not confirmed."));
2235 if (!query (_("Trace is running but will "
2236 "stop on detach; detach anyway? ")))
2237 error (_("Not confirmed."));
2241 /* Also we want to be out of tfind mode, otherwise things can get
2242 confusing upon reconnection. Just use these calls instead of
2243 full tfind_1 behavior because we're in the middle of detaching,
2244 and there's no point to updating current stack frame etc. */
2245 set_current_traceframe (-1);
2246 set_tracepoint_num (-1);
2247 set_traceframe_context (NULL);
2250 /* Worker function for the various flavors of the tfind command. */
2252 tfind_1 (enum trace_find_type type, int num,
2253 ULONGEST addr1, ULONGEST addr2,
2256 int target_frameno = -1, target_tracept = -1;
2257 struct frame_id old_frame_id = null_frame_id;
2258 struct tracepoint *tp;
2259 struct ui_out *uiout = current_uiout;
2261 /* Only try to get the current stack frame if we have a chance of
2262 succeeding. In particular, if we're trying to get a first trace
2263 frame while all threads are running, it's not going to succeed,
2264 so leave it with a default value and let the frame comparison
2265 below (correctly) decide to print out the source location of the
2267 if (!(type == tfind_number && num == -1)
2268 && (has_stack_frames () || traceframe_number >= 0))
2269 old_frame_id = get_frame_id (get_current_frame ());
2271 target_frameno = target_trace_find (type, num, addr1, addr2,
2274 if (type == tfind_number
2276 && target_frameno == -1)
2278 /* We told the target to get out of tfind mode, and it did. */
2280 else if (target_frameno == -1)
2282 /* A request for a non-existent trace frame has failed.
2283 Our response will be different, depending on FROM_TTY:
2285 If FROM_TTY is true, meaning that this command was
2286 typed interactively by the user, then give an error
2287 and DO NOT change the state of traceframe_number etc.
2289 However if FROM_TTY is false, meaning that we're either
2290 in a script, a loop, or a user-defined command, then
2291 DON'T give an error, but DO change the state of
2292 traceframe_number etc. to invalid.
2294 The rationalle is that if you typed the command, you
2295 might just have committed a typo or something, and you'd
2296 like to NOT lose your current debugging state. However
2297 if you're in a user-defined command or especially in a
2298 loop, then you need a way to detect that the command
2299 failed WITHOUT aborting. This allows you to write
2300 scripts that search thru the trace buffer until the end,
2301 and then continue on to do something else. */
2304 error (_("Target failed to find requested trace frame."));
2308 printf_filtered ("End of trace buffer.\n");
2309 #if 0 /* dubious now? */
2310 /* The following will not recurse, since it's
2312 trace_find_command ("-1", from_tty);
2317 tp = get_tracepoint_by_number_on_target (target_tracept);
2319 reinit_frame_cache ();
2320 target_dcache_invalidate ();
2322 set_tracepoint_num (tp ? tp->base.number : target_tracept);
2324 if (target_frameno != get_traceframe_number ())
2325 observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2327 set_current_traceframe (target_frameno);
2329 if (target_frameno == -1)
2330 set_traceframe_context (NULL);
2332 set_traceframe_context (get_current_frame ());
2334 if (traceframe_number >= 0)
2336 /* Use different branches for MI and CLI to make CLI messages
2338 if (ui_out_is_mi_like_p (uiout))
2340 ui_out_field_string (uiout, "found", "1");
2341 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2342 ui_out_field_int (uiout, "traceframe", traceframe_number);
2346 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2347 traceframe_number, tracepoint_number);
2352 if (ui_out_is_mi_like_p (uiout))
2353 ui_out_field_string (uiout, "found", "0");
2354 else if (type == tfind_number && num == -1)
2355 printf_unfiltered (_("No longer looking at any trace frame\n"));
2356 else /* This case may never occur, check. */
2357 printf_unfiltered (_("No trace frame found\n"));
2360 /* If we're in nonstop mode and getting out of looking at trace
2361 frames, there won't be any current frame to go back to and
2364 && (has_stack_frames () || traceframe_number >= 0))
2366 enum print_what print_what;
2368 /* NOTE: in imitation of the step command, try to determine
2369 whether we have made a transition from one function to
2370 another. If so, we'll print the "stack frame" (ie. the new
2371 function and it's arguments) -- otherwise we'll just show the
2374 if (frame_id_eq (old_frame_id,
2375 get_frame_id (get_current_frame ())))
2376 print_what = SRC_LINE;
2378 print_what = SRC_AND_LOC;
2380 print_stack_frame (get_selected_frame (NULL), 1, print_what);
2385 /* trace_find_command takes a trace frame number n,
2386 sends "QTFrame:<n>" to the target,
2387 and accepts a reply that may contain several optional pieces
2388 of information: a frame number, a tracepoint number, and an
2389 indication of whether this is a trap frame or a stepping frame.
2391 The minimal response is just "OK" (which indicates that the
2392 target does not give us a frame number or a tracepoint number).
2393 Instead of that, the target may send us a string containing
2395 F<hexnum> (gives the selected frame number)
2396 T<hexnum> (gives the selected tracepoint number)
2401 trace_find_command (char *args, int from_tty)
2402 { /* This should only be called with a numeric argument. */
2405 if (current_trace_status ()->running
2406 && current_trace_status ()->filename == NULL)
2407 error (_("May not look at trace frames while trace is running."));
2409 if (args == 0 || *args == 0)
2410 { /* TFIND with no args means find NEXT trace frame. */
2411 if (traceframe_number == -1)
2412 frameno = 0; /* "next" is first one. */
2414 frameno = traceframe_number + 1;
2416 else if (0 == strcmp (args, "-"))
2418 if (traceframe_number == -1)
2419 error (_("not debugging trace buffer"));
2420 else if (from_tty && traceframe_number == 0)
2421 error (_("already at start of trace buffer"));
2423 frameno = traceframe_number - 1;
2425 /* A hack to work around eval's need for fp to have been collected. */
2426 else if (0 == strcmp (args, "-1"))
2429 frameno = parse_and_eval_long (args);
2432 error (_("invalid input (%d is less than zero)"), frameno);
2434 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2439 trace_find_end_command (char *args, int from_tty)
2441 trace_find_command ("-1", from_tty);
2446 trace_find_start_command (char *args, int from_tty)
2448 trace_find_command ("0", from_tty);
2451 /* tfind pc command */
2453 trace_find_pc_command (char *args, int from_tty)
2457 if (current_trace_status ()->running
2458 && current_trace_status ()->filename == NULL)
2459 error (_("May not look at trace frames while trace is running."));
2461 if (args == 0 || *args == 0)
2462 pc = regcache_read_pc (get_current_regcache ());
2464 pc = parse_and_eval_address (args);
2466 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2469 /* tfind tracepoint command */
2471 trace_find_tracepoint_command (char *args, int from_tty)
2474 struct tracepoint *tp;
2476 if (current_trace_status ()->running
2477 && current_trace_status ()->filename == NULL)
2478 error (_("May not look at trace frames while trace is running."));
2480 if (args == 0 || *args == 0)
2482 if (tracepoint_number == -1)
2483 error (_("No current tracepoint -- please supply an argument."));
2485 tdp = tracepoint_number; /* Default is current TDP. */
2488 tdp = parse_and_eval_long (args);
2490 /* If we have the tracepoint on hand, use the number that the
2491 target knows about (which may be different if we disconnected
2492 and reconnected). */
2493 tp = get_tracepoint (tdp);
2495 tdp = tp->number_on_target;
2497 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2500 /* TFIND LINE command:
2502 This command will take a sourceline for argument, just like BREAK
2503 or TRACE (ie. anything that "decode_line_1" can handle).
2505 With no argument, this command will find the next trace frame
2506 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2509 trace_find_line_command (char *args, int from_tty)
2511 static CORE_ADDR start_pc, end_pc;
2512 struct symtabs_and_lines sals;
2513 struct symtab_and_line sal;
2514 struct cleanup *old_chain;
2516 if (current_trace_status ()->running
2517 && current_trace_status ()->filename == NULL)
2518 error (_("May not look at trace frames while trace is running."));
2520 if (args == 0 || *args == 0)
2522 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2524 sals.sals = (struct symtab_and_line *)
2525 xmalloc (sizeof (struct symtab_and_line));
2530 sals = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2534 old_chain = make_cleanup (xfree, sals.sals);
2535 if (sal.symtab == 0)
2536 error (_("No line number information available."));
2538 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2540 if (start_pc == end_pc)
2542 printf_filtered ("Line %d of \"%s\"",
2544 symtab_to_filename_for_display (sal.symtab));
2546 printf_filtered (" is at address ");
2547 print_address (get_current_arch (), start_pc, gdb_stdout);
2549 printf_filtered (" but contains no code.\n");
2550 sal = find_pc_line (start_pc, 0);
2552 && find_line_pc_range (sal, &start_pc, &end_pc)
2553 && start_pc != end_pc)
2554 printf_filtered ("Attempting to find line %d instead.\n",
2557 error (_("Cannot find a good line."));
2561 /* Is there any case in which we get here, and have an address
2562 which the user would want to see? If we have debugging
2563 symbols and no line numbers? */
2564 error (_("Line number %d is out of range for \"%s\"."),
2565 sal.line, symtab_to_filename_for_display (sal.symtab));
2567 /* Find within range of stated line. */
2569 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2571 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2572 do_cleanups (old_chain);
2575 /* tfind range command */
2577 trace_find_range_command (char *args, int from_tty)
2579 static CORE_ADDR start, stop;
2582 if (current_trace_status ()->running
2583 && current_trace_status ()->filename == NULL)
2584 error (_("May not look at trace frames while trace is running."));
2586 if (args == 0 || *args == 0)
2587 { /* XXX FIXME: what should default behavior be? */
2588 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2592 if (0 != (tmp = strchr (args, ',')))
2594 *tmp++ = '\0'; /* Terminate start address. */
2595 while (isspace ((int) *tmp))
2597 start = parse_and_eval_address (args);
2598 stop = parse_and_eval_address (tmp);
2601 { /* No explicit end address? */
2602 start = parse_and_eval_address (args);
2603 stop = start + 1; /* ??? */
2606 tfind_1 (tfind_range, 0, start, stop, from_tty);
2609 /* tfind outside command */
2611 trace_find_outside_command (char *args, int from_tty)
2613 CORE_ADDR start, stop;
2616 if (current_trace_status ()->running
2617 && current_trace_status ()->filename == NULL)
2618 error (_("May not look at trace frames while trace is running."));
2620 if (args == 0 || *args == 0)
2621 { /* XXX FIXME: what should default behavior be? */
2622 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2626 if (0 != (tmp = strchr (args, ',')))
2628 *tmp++ = '\0'; /* Terminate start address. */
2629 while (isspace ((int) *tmp))
2631 start = parse_and_eval_address (args);
2632 stop = parse_and_eval_address (tmp);
2635 { /* No explicit end address? */
2636 start = parse_and_eval_address (args);
2637 stop = start + 1; /* ??? */
2640 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2643 /* info scope command: list the locals for a scope. */
2645 scope_info (char *args, int from_tty)
2647 struct symtabs_and_lines sals;
2649 struct minimal_symbol *msym;
2650 struct block *block;
2651 const char *symname;
2652 char *save_args = args;
2653 struct block_iterator iter;
2655 struct gdbarch *gdbarch;
2658 if (args == 0 || *args == 0)
2659 error (_("requires an argument (function, "
2660 "line or *addr) to define a scope"));
2662 sals = decode_line_1 (&args, DECODE_LINE_FUNFIRSTLINE, NULL, 0);
2663 if (sals.nelts == 0)
2664 return; /* Presumably decode_line_1 has already warned. */
2666 /* Resolve line numbers to PC. */
2667 resolve_sal_pc (&sals.sals[0]);
2668 block = block_for_pc (sals.sals[0].pc);
2672 QUIT; /* Allow user to bail out with ^C. */
2673 ALL_BLOCK_SYMBOLS (block, iter, sym)
2675 QUIT; /* Allow user to bail out with ^C. */
2677 printf_filtered ("Scope for %s:\n", save_args);
2680 symname = SYMBOL_PRINT_NAME (sym);
2681 if (symname == NULL || *symname == '\0')
2682 continue; /* Probably botched, certainly useless. */
2684 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2686 printf_filtered ("Symbol %s is ", symname);
2687 switch (SYMBOL_CLASS (sym))
2690 case LOC_UNDEF: /* Messed up symbol? */
2691 printf_filtered ("a bogus symbol, class %d.\n",
2692 SYMBOL_CLASS (sym));
2693 count--; /* Don't count this one. */
2696 printf_filtered ("a constant with value %s (%s)",
2697 plongest (SYMBOL_VALUE (sym)),
2698 hex_string (SYMBOL_VALUE (sym)));
2700 case LOC_CONST_BYTES:
2701 printf_filtered ("constant bytes: ");
2702 if (SYMBOL_TYPE (sym))
2703 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2704 fprintf_filtered (gdb_stdout, " %02x",
2705 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2708 printf_filtered ("in static storage at address ");
2709 printf_filtered ("%s", paddress (gdbarch,
2710 SYMBOL_VALUE_ADDRESS (sym)));
2713 /* GDBARCH is the architecture associated with the objfile
2714 the symbol is defined in; the target architecture may be
2715 different, and may provide additional registers. However,
2716 we do not know the target architecture at this point.
2717 We assume the objfile architecture will contain all the
2718 standard registers that occur in debug info in that
2720 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2723 if (SYMBOL_IS_ARGUMENT (sym))
2724 printf_filtered ("an argument in register $%s",
2725 gdbarch_register_name (gdbarch, regno));
2727 printf_filtered ("a local variable in register $%s",
2728 gdbarch_register_name (gdbarch, regno));
2731 printf_filtered ("an argument at stack/frame offset %s",
2732 plongest (SYMBOL_VALUE (sym)));
2735 printf_filtered ("a local variable at frame offset %s",
2736 plongest (SYMBOL_VALUE (sym)));
2739 printf_filtered ("a reference argument at offset %s",
2740 plongest (SYMBOL_VALUE (sym)));
2742 case LOC_REGPARM_ADDR:
2743 /* Note comment at LOC_REGISTER. */
2744 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2746 printf_filtered ("the address of an argument, in register $%s",
2747 gdbarch_register_name (gdbarch, regno));
2750 printf_filtered ("a typedef.\n");
2753 printf_filtered ("a label at address ");
2754 printf_filtered ("%s", paddress (gdbarch,
2755 SYMBOL_VALUE_ADDRESS (sym)));
2758 printf_filtered ("a function at address ");
2759 printf_filtered ("%s",
2760 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2762 case LOC_UNRESOLVED:
2763 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2766 printf_filtered ("Unresolved Static");
2769 printf_filtered ("static storage at address ");
2770 printf_filtered ("%s",
2771 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2774 case LOC_OPTIMIZED_OUT:
2775 printf_filtered ("optimized out.\n");
2778 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2779 BLOCK_START (block),
2783 if (SYMBOL_TYPE (sym))
2784 printf_filtered (", length %d.\n",
2785 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2787 if (BLOCK_FUNCTION (block))
2790 block = BLOCK_SUPERBLOCK (block);
2793 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2797 /* worker function (cleanup) */
2799 replace_comma (void *data)
2806 /* Helper for trace_dump_command. Dump the action list starting at
2807 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2808 actions of the body of a while-stepping action. STEPPING_FRAME is
2809 set if the current traceframe was determined to be a while-stepping
2813 trace_dump_actions (struct command_line *action,
2814 int stepping_actions, int stepping_frame,
2817 char *action_exp, *next_comma;
2819 for (; action != NULL; action = action->next)
2821 struct cmd_list_element *cmd;
2823 QUIT; /* Allow user to bail out with ^C. */
2824 action_exp = action->line;
2825 while (isspace ((int) *action_exp))
2828 /* The collection actions to be done while stepping are
2829 bracketed by the commands "while-stepping" and "end". */
2831 if (*action_exp == '#') /* comment line */
2834 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2836 error (_("Bad action list item: %s"), action_exp);
2838 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2842 for (i = 0; i < action->body_count; ++i)
2843 trace_dump_actions (action->body_list[i],
2844 1, stepping_frame, from_tty);
2846 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2848 /* Display the collected data.
2849 For the trap frame, display only what was collected at
2850 the trap. Likewise for stepping frames, display only
2851 what was collected while stepping. This means that the
2852 two boolean variables, STEPPING_FRAME and
2853 STEPPING_ACTIONS should be equal. */
2854 if (stepping_frame == stepping_actions)
2856 if (*action_exp == '/')
2857 action_exp = decode_agent_options (action_exp);
2860 { /* Repeat over a comma-separated list. */
2861 QUIT; /* Allow user to bail out with ^C. */
2862 if (*action_exp == ',')
2864 while (isspace ((int) *action_exp))
2867 next_comma = strchr (action_exp, ',');
2869 if (0 == strncasecmp (action_exp, "$reg", 4))
2870 registers_info (NULL, from_tty);
2871 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2873 else if (0 == strncasecmp (action_exp, "$loc", 4))
2874 locals_info (NULL, from_tty);
2875 else if (0 == strncasecmp (action_exp, "$arg", 4))
2876 args_info (NULL, from_tty);
2881 make_cleanup (replace_comma, next_comma);
2884 printf_filtered ("%s = ", action_exp);
2885 output_command (action_exp, from_tty);
2886 printf_filtered ("\n");
2890 action_exp = next_comma;
2892 while (action_exp && *action_exp == ',');
2898 /* The tdump command. */
2901 trace_dump_command (char *args, int from_tty)
2903 struct regcache *regcache;
2904 struct tracepoint *t;
2905 int stepping_frame = 0;
2906 struct bp_location *loc;
2907 char *line, *default_collect_line = NULL;
2908 struct command_line *actions, *default_collect_action = NULL;
2909 struct cleanup *old_chain = NULL;
2911 if (tracepoint_number == -1)
2913 warning (_("No current trace frame."));
2917 t = get_tracepoint (tracepoint_number);
2920 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2923 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2924 tracepoint_number, traceframe_number);
2926 /* The current frame is a trap frame if the frame PC is equal
2927 to the tracepoint PC. If not, then the current frame was
2928 collected during single-stepping. */
2930 regcache = get_current_regcache ();
2932 /* If the traceframe's address matches any of the tracepoint's
2933 locations, assume it is a direct hit rather than a while-stepping
2934 frame. (FIXME this is not reliable, should record each frame's
2937 for (loc = t->base.loc; loc; loc = loc->next)
2938 if (loc->address == regcache_read_pc (regcache))
2941 actions = breakpoint_commands (&t->base);
2943 /* If there is a default-collect list, make up a collect command,
2944 prepend to the tracepoint's commands, and pass the whole mess to
2945 the trace dump scanner. We need to validate because
2946 default-collect might have been junked since the trace run. */
2947 if (*default_collect)
2949 default_collect_line = xstrprintf ("collect %s", default_collect);
2950 old_chain = make_cleanup (xfree, default_collect_line);
2951 line = default_collect_line;
2952 validate_actionline (&line, &t->base);
2953 default_collect_action = xmalloc (sizeof (struct command_line));
2954 make_cleanup (xfree, default_collect_action);
2955 default_collect_action->next = actions;
2956 default_collect_action->line = line;
2957 actions = default_collect_action;
2960 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2962 if (*default_collect)
2963 do_cleanups (old_chain);
2966 /* Encode a piece of a tracepoint's source-level definition in a form
2967 that is suitable for both protocol and saving in files. */
2968 /* This version does not do multiple encodes for long strings; it should
2969 return an offset to the next piece to encode. FIXME */
2972 encode_source_string (int tpnum, ULONGEST addr,
2973 char *srctype, char *src, char *buf, int buf_size)
2975 if (80 + strlen (srctype) > buf_size)
2976 error (_("Buffer too small for source encoding"));
2977 sprintf (buf, "%x:%s:%s:%x:%x:",
2978 tpnum, phex_nz (addr, sizeof (addr)),
2979 srctype, 0, (int) strlen (src));
2980 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2981 error (_("Source string too long for buffer"));
2982 bin2hex (src, buf + strlen (buf), 0);
2986 extern int trace_regblock_size;
2988 /* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2989 non-zero, the save is performed on the target, otherwise GDB obtains all
2990 trace data and saves it locally. */
2993 trace_save (const char *filename, int target_does_save)
2995 struct cleanup *cleanup;
2997 struct trace_status *ts = current_trace_status ();
3000 struct uploaded_tp *uploaded_tps = NULL, *utp;
3001 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
3005 ULONGEST offset = 0;
3006 #define MAX_TRACE_UPLOAD 2000
3007 gdb_byte buf[MAX_TRACE_UPLOAD];
3010 /* If the target is to save the data to a file on its own, then just
3011 send the command and be done with it. */
3012 if (target_does_save)
3014 err = target_save_trace_data (filename);
3016 error (_("Target failed to save trace data to '%s'."),
3021 /* Get the trace status first before opening the file, so if the
3022 target is losing, we can get out without touching files. */
3023 status = target_get_trace_status (ts);
3025 pathname = tilde_expand (filename);
3026 cleanup = make_cleanup (xfree, pathname);
3028 fp = fopen (pathname, "wb");
3030 error (_("Unable to open file '%s' for saving trace data (%s)"),
3031 filename, safe_strerror (errno));
3032 make_cleanup_fclose (fp);
3034 /* Write a file header, with a high-bit-set char to indicate a
3035 binary file, plus a hint as what this file is, and a version
3036 number in case of future needs. */
3037 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
3039 perror_with_name (pathname);
3041 /* Write descriptive info. */
3043 /* Write out the size of a register block. */
3044 fprintf (fp, "R %x\n", trace_regblock_size);
3046 /* Write out status of the tracing run (aka "tstatus" info). */
3047 fprintf (fp, "status %c;%s",
3048 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
3049 if (ts->stop_reason == tracepoint_error)
3051 char *buf = (char *) alloca (strlen (ts->stop_desc) * 2 + 1);
3053 bin2hex ((gdb_byte *) ts->stop_desc, buf, 0);
3054 fprintf (fp, ":%s", buf);
3056 fprintf (fp, ":%x", ts->stopping_tracepoint);
3057 if (ts->traceframe_count >= 0)
3058 fprintf (fp, ";tframes:%x", ts->traceframe_count);
3059 if (ts->traceframes_created >= 0)
3060 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
3061 if (ts->buffer_free >= 0)
3062 fprintf (fp, ";tfree:%x", ts->buffer_free);
3063 if (ts->buffer_size >= 0)
3064 fprintf (fp, ";tsize:%x", ts->buffer_size);
3065 if (ts->disconnected_tracing)
3066 fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
3067 if (ts->circular_buffer)
3068 fprintf (fp, ";circular:%x", ts->circular_buffer);
3071 /* Note that we want to upload tracepoints and save those, rather
3072 than simply writing out the local ones, because the user may have
3073 changed tracepoints in GDB in preparation for a future tracing
3074 run, or maybe just mass-deleted all types of breakpoints as part
3075 of cleaning up. So as not to contaminate the session, leave the
3076 data in its uploaded form, don't make into real tracepoints. */
3078 /* Get trace state variables first, they may be checked when parsing
3079 uploaded commands. */
3081 target_upload_trace_state_variables (&uploaded_tsvs);
3083 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
3089 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
3090 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
3093 fprintf (fp, "tsv %x:%s:%x:%s\n",
3094 utsv->number, phex_nz (utsv->initial_value, 8),
3095 utsv->builtin, buf);
3101 free_uploaded_tsvs (&uploaded_tsvs);
3103 target_upload_tracepoints (&uploaded_tps);
3105 for (utp = uploaded_tps; utp; utp = utp->next)
3106 target_get_tracepoint_status (NULL, utp);
3108 for (utp = uploaded_tps; utp; utp = utp->next)
3110 fprintf (fp, "tp T%x:%s:%c:%x:%x",
3111 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3112 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
3113 if (utp->type == bp_fast_tracepoint)
3114 fprintf (fp, ":F%x", utp->orig_size);
3116 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
3119 for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
3120 fprintf (fp, "tp A%x:%s:%s\n",
3121 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3122 for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
3123 fprintf (fp, "tp S%x:%s:%s\n",
3124 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3127 encode_source_string (utp->number, utp->addr,
3128 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
3129 fprintf (fp, "tp Z%s\n", buf);
3131 if (utp->cond_string)
3133 encode_source_string (utp->number, utp->addr,
3134 "cond", utp->cond_string,
3135 buf, MAX_TRACE_UPLOAD);
3136 fprintf (fp, "tp Z%s\n", buf);
3138 for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
3140 encode_source_string (utp->number, utp->addr, "cmd", act,
3141 buf, MAX_TRACE_UPLOAD);
3142 fprintf (fp, "tp Z%s\n", buf);
3144 fprintf (fp, "tp V%x:%s:%x:%s\n",
3145 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3147 phex_nz (utp->traceframe_usage,
3148 sizeof (utp->traceframe_usage)));
3151 free_uploaded_tps (&uploaded_tps);
3153 /* Mark the end of the definition section. */
3156 /* Get and write the trace data proper. We ask for big blocks, in
3157 the hopes of efficiency, but will take less if the target has
3158 packet size limitations or some such. */
3161 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
3163 error (_("Failure to get requested trace buffer data"));
3164 /* No more data is forthcoming, we're done. */
3167 written = fwrite (buf, gotten, 1, fp);
3169 perror_with_name (pathname);
3173 /* Mark the end of trace data. (We know that gotten is 0 at this point.) */
3174 written = fwrite (&gotten, 4, 1, fp);
3176 perror_with_name (pathname);
3178 do_cleanups (cleanup);
3182 trace_save_command (char *args, int from_tty)
3184 int target_does_save = 0;
3186 char *filename = NULL;
3187 struct cleanup *back_to;
3190 error_no_arg (_("file in which to save trace data"));
3192 argv = gdb_buildargv (args);
3193 back_to = make_cleanup_freeargv (argv);
3195 for (; *argv; ++argv)
3197 if (strcmp (*argv, "-r") == 0)
3198 target_does_save = 1;
3199 else if (**argv == '-')
3200 error (_("unknown option `%s'"), *argv);
3206 error_no_arg (_("file in which to save trace data"));
3208 trace_save (filename, target_does_save);
3211 printf_filtered (_("Trace data saved to file '%s'.\n"), filename);
3213 do_cleanups (back_to);
3216 /* Tell the target what to do with an ongoing tracing run if GDB
3217 disconnects for some reason. */
3220 set_disconnected_tracing (char *args, int from_tty,
3221 struct cmd_list_element *c)
3223 target_set_disconnected_tracing (disconnected_tracing);
3227 set_circular_trace_buffer (char *args, int from_tty,
3228 struct cmd_list_element *c)
3230 target_set_circular_trace_buffer (circular_trace_buffer);
3234 set_trace_user (char *args, int from_tty,
3235 struct cmd_list_element *c)
3239 ret = target_set_trace_notes (trace_user, NULL, NULL);
3242 warning (_("Target does not support trace notes, user ignored"));
3246 set_trace_notes (char *args, int from_tty,
3247 struct cmd_list_element *c)
3251 ret = target_set_trace_notes (NULL, trace_notes, NULL);
3254 warning (_("Target does not support trace notes, note ignored"));
3258 set_trace_stop_notes (char *args, int from_tty,
3259 struct cmd_list_element *c)
3263 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
3266 warning (_("Target does not support trace notes, stop note ignored"));
3269 /* Convert the memory pointed to by mem into hex, placing result in buf.
3270 * Return a pointer to the last char put in buf (null)
3271 * "stolen" from sparc-stub.c
3274 static const char hexchars[] = "0123456789abcdef";
3277 mem2hex (gdb_byte *mem, char *buf, int count)
3285 *buf++ = hexchars[ch >> 4];
3286 *buf++ = hexchars[ch & 0xf];
3295 get_traceframe_number (void)
3297 return traceframe_number;
3300 /* Make the traceframe NUM be the current trace frame. Does nothing
3301 if NUM is already current. */
3304 set_current_traceframe (int num)
3308 if (traceframe_number == num)
3310 /* Nothing to do. */
3314 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3317 warning (_("could not change traceframe"));
3319 set_traceframe_num (newnum);
3321 /* Changing the traceframe changes our view of registers and of the
3323 registers_changed ();
3325 clear_traceframe_info ();
3328 /* Make the traceframe NUM be the current trace frame, and do nothing
3332 set_traceframe_number (int num)
3334 traceframe_number = num;
3337 /* A cleanup used when switching away and back from tfind mode. */
3339 struct current_traceframe_cleanup
3341 /* The traceframe we were inspecting. */
3342 int traceframe_number;
3346 do_restore_current_traceframe_cleanup (void *arg)
3348 struct current_traceframe_cleanup *old = arg;
3350 set_current_traceframe (old->traceframe_number);
3354 restore_current_traceframe_cleanup_dtor (void *arg)
3356 struct current_traceframe_cleanup *old = arg;
3362 make_cleanup_restore_current_traceframe (void)
3364 struct current_traceframe_cleanup *old;
3366 old = xmalloc (sizeof (struct current_traceframe_cleanup));
3367 old->traceframe_number = traceframe_number;
3369 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3370 restore_current_traceframe_cleanup_dtor);
3374 make_cleanup_restore_traceframe_number (void)
3376 return make_cleanup_restore_integer (&traceframe_number);
3379 /* Given a number and address, return an uploaded tracepoint with that
3380 number, creating if necessary. */
3382 struct uploaded_tp *
3383 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3385 struct uploaded_tp *utp;
3387 for (utp = *utpp; utp; utp = utp->next)
3388 if (utp->number == num && utp->addr == addr)
3390 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3391 memset (utp, 0, sizeof (struct uploaded_tp));
3394 utp->actions = NULL;
3395 utp->step_actions = NULL;
3396 utp->cmd_strings = NULL;
3403 free_uploaded_tps (struct uploaded_tp **utpp)
3405 struct uploaded_tp *next_one;
3409 next_one = (*utpp)->next;
3415 /* Given a number and address, return an uploaded tracepoint with that
3416 number, creating if necessary. */
3418 static struct uploaded_tsv *
3419 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3421 struct uploaded_tsv *utsv;
3423 for (utsv = *utsvp; utsv; utsv = utsv->next)
3424 if (utsv->number == num)
3426 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3427 memset (utsv, 0, sizeof (struct uploaded_tsv));
3429 utsv->next = *utsvp;
3435 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3437 struct uploaded_tsv *next_one;
3441 next_one = (*utsvp)->next;
3447 /* FIXME this function is heuristic and will miss the cases where the
3448 conditional is semantically identical but differs in whitespace,
3449 such as "x == 0" vs "x==0". */
3452 cond_string_is_same (char *str1, char *str2)
3454 if (str1 == NULL || str2 == NULL)
3455 return (str1 == str2);
3457 return (strcmp (str1, str2) == 0);
3460 /* Look for an existing tracepoint that seems similar enough to the
3461 uploaded one. Enablement isn't compared, because the user can
3462 toggle that freely, and may have done so in anticipation of the
3463 next trace run. Return the location of matched tracepoint. */
3465 static struct bp_location *
3466 find_matching_tracepoint_location (struct uploaded_tp *utp)
3468 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3470 struct breakpoint *b;
3471 struct bp_location *loc;
3473 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3475 struct tracepoint *t = (struct tracepoint *) b;
3477 if (b->type == utp->type
3478 && t->step_count == utp->step
3479 && t->pass_count == utp->pass
3480 && cond_string_is_same (t->base.cond_string, utp->cond_string)
3481 /* FIXME also test actions. */
3484 /* Scan the locations for an address match. */
3485 for (loc = b->loc; loc; loc = loc->next)
3487 if (loc->address == utp->addr)
3495 /* Given a list of tracepoints uploaded from a target, attempt to
3496 match them up with existing tracepoints, and create new ones if not
3500 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3502 struct uploaded_tp *utp;
3503 /* A set of tracepoints which are modified. */
3504 VEC(breakpoint_p) *modified_tp = NULL;
3506 struct breakpoint *b;
3508 /* Look for GDB tracepoints that match up with our uploaded versions. */
3509 for (utp = *uploaded_tps; utp; utp = utp->next)
3511 struct bp_location *loc;
3512 struct tracepoint *t;
3514 loc = find_matching_tracepoint_location (utp);
3519 /* Mark this location as already inserted. */
3521 t = (struct tracepoint *) loc->owner;
3522 printf_filtered (_("Assuming tracepoint %d is same "
3523 "as target's tracepoint %d at %s.\n"),
3524 loc->owner->number, utp->number,
3525 paddress (loc->gdbarch, utp->addr));
3527 /* The tracepoint LOC->owner was modified (the location LOC
3528 was marked as inserted in the target). Save it in
3529 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3530 observers will be notified later once for each tracepoint
3531 saved in MODIFIED_TP. */
3533 VEC_iterate (breakpoint_p, modified_tp, ix, b);
3535 if (b == loc->owner)
3541 VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3545 t = create_tracepoint_from_upload (utp);
3547 printf_filtered (_("Created tracepoint %d for "
3548 "target's tracepoint %d at %s.\n"),
3549 t->base.number, utp->number,
3550 paddress (get_current_arch (), utp->addr));
3552 printf_filtered (_("Failed to create tracepoint for target's "
3553 "tracepoint %d at %s, skipping it.\n"),
3555 paddress (get_current_arch (), utp->addr));
3557 /* Whether found or created, record the number used by the
3558 target, to help with mapping target tracepoints back to their
3559 counterparts here. */
3561 t->number_on_target = utp->number;
3564 /* Notify 'breakpoint-modified' observer that at least one of B's
3565 locations was changed. */
3566 for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
3567 observer_notify_breakpoint_modified (b);
3569 VEC_free (breakpoint_p, modified_tp);
3570 free_uploaded_tps (uploaded_tps);
3573 /* Trace state variables don't have much to identify them beyond their
3574 name, so just use that to detect matches. */
3576 static struct trace_state_variable *
3577 find_matching_tsv (struct uploaded_tsv *utsv)
3582 return find_trace_state_variable (utsv->name);
3585 static struct trace_state_variable *
3586 create_tsv_from_upload (struct uploaded_tsv *utsv)
3588 const char *namebase;
3591 struct trace_state_variable *tsv;
3592 struct cleanup *old_chain;
3596 namebase = utsv->name;
3597 buf = xstrprintf ("%s", namebase);
3602 buf = xstrprintf ("%s_%d", namebase, try_num++);
3605 /* Fish for a name that is not in use. */
3606 /* (should check against all internal vars?) */
3607 while (find_trace_state_variable (buf))
3610 buf = xstrprintf ("%s_%d", namebase, try_num++);
3613 old_chain = make_cleanup (xfree, buf);
3615 /* We have an available name, create the variable. */
3616 tsv = create_trace_state_variable (buf);
3617 tsv->initial_value = utsv->initial_value;
3618 tsv->builtin = utsv->builtin;
3620 observer_notify_tsv_created (tsv);
3622 do_cleanups (old_chain);
3627 /* Given a list of uploaded trace state variables, try to match them
3628 up with existing variables, or create additional ones. */
3631 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3634 struct uploaded_tsv *utsv;
3635 struct trace_state_variable *tsv;
3638 /* Most likely some numbers will have to be reassigned as part of
3639 the merge, so clear them all in anticipation. */
3640 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3643 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3645 tsv = find_matching_tsv (utsv);
3649 printf_filtered (_("Assuming trace state variable $%s "
3650 "is same as target's variable %d.\n"),
3651 tsv->name, utsv->number);
3655 tsv = create_tsv_from_upload (utsv);
3657 printf_filtered (_("Created trace state variable "
3658 "$%s for target's variable %d.\n"),
3659 tsv->name, utsv->number);
3661 /* Give precedence to numberings that come from the target. */
3663 tsv->number = utsv->number;
3666 /* Renumber everything that didn't get a target-assigned number. */
3668 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3669 if (tsv->number > highest)
3670 highest = tsv->number;
3673 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3674 if (tsv->number == 0)
3675 tsv->number = highest++;
3677 free_uploaded_tsvs (uploaded_tsvs);
3680 /* target tfile command */
3682 static struct target_ops tfile_ops;
3684 /* Fill in tfile_ops with its defined operations and properties. */
3686 #define TRACE_HEADER_SIZE 8
3688 static char *trace_filename;
3689 static int trace_fd = -1;
3690 static off_t trace_frames_offset;
3691 static off_t cur_offset;
3692 static int cur_data_size;
3693 int trace_regblock_size;
3695 static void tfile_interp_line (char *line,
3696 struct uploaded_tp **utpp,
3697 struct uploaded_tsv **utsvp);
3699 /* Read SIZE bytes into READBUF from the trace frame, starting at
3700 TRACE_FD's current position. Note that this call `read'
3701 underneath, hence it advances the file's seek position. Throws an
3702 error if the `read' syscall fails, or less than SIZE bytes are
3706 tfile_read (gdb_byte *readbuf, int size)
3710 gotten = read (trace_fd, readbuf, size);
3712 perror_with_name (trace_filename);
3713 else if (gotten < size)
3714 error (_("Premature end of file while reading trace file"));
3718 tfile_open (char *filename, int from_tty)
3720 volatile struct gdb_exception ex;
3722 struct cleanup *old_chain;
3725 char header[TRACE_HEADER_SIZE];
3726 char linebuf[1000]; /* Should be max remote packet size or so. */
3729 struct trace_status *ts;
3730 struct uploaded_tp *uploaded_tps = NULL;
3731 struct uploaded_tsv *uploaded_tsvs = NULL;
3733 target_preopen (from_tty);
3735 error (_("No trace file specified."));
3737 filename = tilde_expand (filename);
3738 if (!IS_ABSOLUTE_PATH(filename))
3740 temp = concat (current_directory, "/", filename, (char *) NULL);
3745 old_chain = make_cleanup (xfree, filename);
3747 flags = O_BINARY | O_LARGEFILE;
3749 scratch_chan = open (filename, flags, 0);
3750 if (scratch_chan < 0)
3751 perror_with_name (filename);
3753 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3755 discard_cleanups (old_chain); /* Don't free filename any more. */
3756 unpush_target (&tfile_ops);
3758 trace_filename = xstrdup (filename);
3759 trace_fd = scratch_chan;
3762 /* Read the file header and test for validity. */
3763 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
3765 bytes += TRACE_HEADER_SIZE;
3766 if (!(header[0] == 0x7f
3767 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3768 error (_("File is not a valid trace file."));
3770 push_target (&tfile_ops);
3772 trace_regblock_size = 0;
3773 ts = current_trace_status ();
3774 /* We know we're working with a file. Record its name. */
3775 ts->filename = trace_filename;
3776 /* Set defaults in case there is no status line. */
3777 ts->running_known = 0;
3778 ts->stop_reason = trace_stop_reason_unknown;
3779 ts->traceframe_count = -1;
3780 ts->buffer_free = 0;
3781 ts->disconnected_tracing = 0;
3782 ts->circular_buffer = 0;
3784 TRY_CATCH (ex, RETURN_MASK_ALL)
3786 /* Read through a section of newline-terminated lines that
3787 define things like tracepoints. */
3791 tfile_read (&byte, 1);
3796 /* Empty line marks end of the definition section. */
3801 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3804 linebuf[i++] = byte;
3806 error (_("Excessively long lines in trace file"));
3809 /* Record the starting offset of the binary trace data. */
3810 trace_frames_offset = bytes;
3812 /* If we don't have a blocksize, we can't interpret the
3814 if (trace_regblock_size == 0)
3815 error (_("No register block size recorded in trace file"));
3819 /* Pop the partially set up target. */
3821 throw_exception (ex);
3824 inferior_appeared (current_inferior (), TFILE_PID);
3825 inferior_ptid = pid_to_ptid (TFILE_PID);
3826 add_thread_silent (inferior_ptid);
3828 if (ts->traceframe_count <= 0)
3829 warning (_("No traceframes present in this file."));
3831 /* Add the file's tracepoints and variables into the current mix. */
3833 /* Get trace state variables first, they may be checked when parsing
3834 uploaded commands. */
3835 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3837 merge_uploaded_tracepoints (&uploaded_tps);
3839 post_create_inferior (&tfile_ops, from_tty);
3842 /* Interpret the given line from the definitions part of the trace
3846 tfile_interp_line (char *line,
3847 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3851 if (strncmp (p, "R ", strlen ("R ")) == 0)
3854 trace_regblock_size = strtol (p, &p, 16);
3856 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3858 p += strlen ("status ");
3859 parse_trace_status (p, current_trace_status ());
3861 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3863 p += strlen ("tp ");
3864 parse_tracepoint_definition (p, utpp);
3866 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3868 p += strlen ("tsv ");
3869 parse_tsv_definition (p, utsvp);
3872 warning (_("Ignoring trace file definition \"%s\""), line);
3875 /* Parse the part of trace status syntax that is shared between
3876 the remote protocol and the trace file reader. */
3879 parse_trace_status (char *line, struct trace_status *ts)
3881 char *p = line, *p1, *p2, *p3, *p_temp;
3885 ts->running_known = 1;
3886 ts->running = (*p++ == '1');
3887 ts->stop_reason = trace_stop_reason_unknown;
3888 xfree (ts->stop_desc);
3889 ts->stop_desc = NULL;
3890 ts->traceframe_count = -1;
3891 ts->traceframes_created = -1;
3892 ts->buffer_free = -1;
3893 ts->buffer_size = -1;
3894 ts->disconnected_tracing = 0;
3895 ts->circular_buffer = 0;
3896 xfree (ts->user_name);
3897 ts->user_name = NULL;
3900 ts->start_time = ts->stop_time = 0;
3904 p1 = strchr (p, ':');
3906 error (_("Malformed trace status, at %s\n\
3907 Status line: '%s'\n"), p, line);
3908 p3 = strchr (p, ';');
3910 p3 = p + strlen (p);
3911 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3913 p = unpack_varlen_hex (++p1, &val);
3914 ts->stop_reason = trace_buffer_full;
3916 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3918 p = unpack_varlen_hex (++p1, &val);
3919 ts->stop_reason = trace_never_run;
3921 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3924 p = unpack_varlen_hex (++p1, &val);
3925 ts->stop_reason = tracepoint_passcount;
3926 ts->stopping_tracepoint = val;
3928 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3930 p2 = strchr (++p1, ':');
3938 ts->stop_desc = xmalloc (strlen (line));
3939 end = hex2bin (p1, ts->stop_desc, (p2 - p1) / 2);
3940 ts->stop_desc[end] = '\0';
3943 ts->stop_desc = xstrdup ("");
3945 p = unpack_varlen_hex (++p2, &val);
3946 ts->stop_reason = tstop_command;
3948 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3950 p = unpack_varlen_hex (++p1, &val);
3951 ts->stop_reason = trace_disconnected;
3953 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3955 p2 = strchr (++p1, ':');
3958 ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1);
3959 end = hex2bin (p1, ts->stop_desc, (p2 - p1) / 2);
3960 ts->stop_desc[end] = '\0';
3963 ts->stop_desc = xstrdup ("");
3965 p = unpack_varlen_hex (++p2, &val);
3966 ts->stopping_tracepoint = val;
3967 ts->stop_reason = tracepoint_error;
3969 else if (strncmp (p, "tframes", p1 - p) == 0)
3971 p = unpack_varlen_hex (++p1, &val);
3972 ts->traceframe_count = val;
3974 else if (strncmp (p, "tcreated", p1 - p) == 0)
3976 p = unpack_varlen_hex (++p1, &val);
3977 ts->traceframes_created = val;
3979 else if (strncmp (p, "tfree", p1 - p) == 0)
3981 p = unpack_varlen_hex (++p1, &val);
3982 ts->buffer_free = val;
3984 else if (strncmp (p, "tsize", p1 - p) == 0)
3986 p = unpack_varlen_hex (++p1, &val);
3987 ts->buffer_size = val;
3989 else if (strncmp (p, "disconn", p1 - p) == 0)
3991 p = unpack_varlen_hex (++p1, &val);
3992 ts->disconnected_tracing = val;
3994 else if (strncmp (p, "circular", p1 - p) == 0)
3996 p = unpack_varlen_hex (++p1, &val);
3997 ts->circular_buffer = val;
3999 else if (strncmp (p, "starttime", p1 - p) == 0)
4001 p = unpack_varlen_hex (++p1, &val);
4002 ts->start_time = val;
4004 else if (strncmp (p, "stoptime", p1 - p) == 0)
4006 p = unpack_varlen_hex (++p1, &val);
4007 ts->stop_time = val;
4009 else if (strncmp (p, "username", p1 - p) == 0)
4012 ts->user_name = xmalloc (strlen (p) / 2);
4013 end = hex2bin (p1, ts->user_name, (p3 - p1) / 2);
4014 ts->user_name[end] = '\0';
4017 else if (strncmp (p, "notes", p1 - p) == 0)
4020 ts->notes = xmalloc (strlen (p) / 2);
4021 end = hex2bin (p1, ts->notes, (p3 - p1) / 2);
4022 ts->notes[end] = '\0';
4027 /* Silently skip unknown optional info. */
4028 p_temp = strchr (p1 + 1, ';');
4032 /* Must be at the end. */
4039 parse_tracepoint_status (char *p, struct breakpoint *bp,
4040 struct uploaded_tp *utp)
4043 struct tracepoint *tp = (struct tracepoint *) bp;
4045 p = unpack_varlen_hex (p, &uval);
4047 tp->base.hit_count += uval;
4049 utp->hit_count += uval;
4050 p = unpack_varlen_hex (p + 1, &uval);
4052 tp->traceframe_usage += uval;
4054 utp->traceframe_usage += uval;
4055 /* Ignore any extra, allowing for future extensions. */
4058 /* Given a line of text defining a part of a tracepoint, parse it into
4059 an "uploaded tracepoint". */
4062 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
4066 ULONGEST num, addr, step, pass, orig_size, xlen, start;
4069 char *cond, *srctype, *buf;
4070 struct uploaded_tp *utp = NULL;
4073 /* Both tracepoint and action definitions start with the same number
4074 and address sequence. */
4076 p = unpack_varlen_hex (p, &num);
4077 p++; /* skip a colon */
4078 p = unpack_varlen_hex (p, &addr);
4079 p++; /* skip a colon */
4082 enabled = (*p++ == 'E');
4083 p++; /* skip a colon */
4084 p = unpack_varlen_hex (p, &step);
4085 p++; /* skip a colon */
4086 p = unpack_varlen_hex (p, &pass);
4087 type = bp_tracepoint;
4089 /* Thumb through optional fields. */
4092 p++; /* skip a colon */
4095 type = bp_fast_tracepoint;
4097 p = unpack_varlen_hex (p, &orig_size);
4101 type = bp_static_tracepoint;
4107 p = unpack_varlen_hex (p, &xlen);
4108 p++; /* skip a comma */
4109 cond = (char *) xmalloc (2 * xlen + 1);
4110 strncpy (cond, p, 2 * xlen);
4111 cond[2 * xlen] = '\0';
4115 warning (_("Unrecognized char '%c' in tracepoint "
4116 "definition, skipping rest"), *p);
4118 utp = get_uploaded_tp (num, addr, utpp);
4120 utp->enabled = enabled;
4125 else if (piece == 'A')
4127 utp = get_uploaded_tp (num, addr, utpp);
4128 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
4130 else if (piece == 'S')
4132 utp = get_uploaded_tp (num, addr, utpp);
4133 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
4135 else if (piece == 'Z')
4137 /* Parse a chunk of source form definition. */
4138 utp = get_uploaded_tp (num, addr, utpp);
4140 p = strchr (p, ':');
4141 p++; /* skip a colon */
4142 p = unpack_varlen_hex (p, &start);
4143 p++; /* skip a colon */
4144 p = unpack_varlen_hex (p, &xlen);
4145 p++; /* skip a colon */
4147 buf = alloca (strlen (line));
4149 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4152 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
4153 utp->at_string = xstrdup (buf);
4154 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
4155 utp->cond_string = xstrdup (buf);
4156 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
4157 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
4159 else if (piece == 'V')
4161 utp = get_uploaded_tp (num, addr, utpp);
4163 parse_tracepoint_status (p, NULL, utp);
4167 /* Don't error out, the target might be sending us optional
4168 info that we don't care about. */
4169 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
4173 /* Convert a textual description of a trace state variable into an
4177 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
4180 ULONGEST num, initval, builtin;
4182 struct uploaded_tsv *utsv = NULL;
4184 buf = alloca (strlen (line));
4187 p = unpack_varlen_hex (p, &num);
4188 p++; /* skip a colon */
4189 p = unpack_varlen_hex (p, &initval);
4190 p++; /* skip a colon */
4191 p = unpack_varlen_hex (p, &builtin);
4192 p++; /* skip a colon */
4193 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4196 utsv = get_uploaded_tsv (num, utsvp);
4197 utsv->initial_value = initval;
4198 utsv->builtin = builtin;
4199 utsv->name = xstrdup (buf);
4202 /* Close the trace file and generally clean up. */
4205 tfile_close (int quitting)
4212 pid = ptid_get_pid (inferior_ptid);
4213 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
4214 exit_inferior_silent (pid);
4218 xfree (trace_filename);
4219 trace_filename = NULL;
4223 tfile_files_info (struct target_ops *t)
4225 printf_filtered ("\t`%s'\n", trace_filename);
4228 /* The trace status for a file is that tracing can never be run. */
4231 tfile_get_trace_status (struct trace_status *ts)
4233 /* Other bits of trace status were collected as part of opening the
4234 trace files, so nothing to do here. */
4240 tfile_get_tracepoint_status (struct breakpoint *tp, struct uploaded_tp *utp)
4242 /* Other bits of trace status were collected as part of opening the
4243 trace files, so nothing to do here. */
4246 /* Given the position of a traceframe in the file, figure out what
4247 address the frame was collected at. This would normally be the
4248 value of a collected PC register, but if not available, we
4252 tfile_get_traceframe_address (off_t tframe_offset)
4256 struct tracepoint *tp;
4257 off_t saved_offset = cur_offset;
4259 /* FIXME dig pc out of collected registers. */
4261 /* Fall back to using tracepoint address. */
4262 lseek (trace_fd, tframe_offset, SEEK_SET);
4263 tfile_read ((gdb_byte *) &tpnum, 2);
4264 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4266 (target_gdbarch ()));
4268 tp = get_tracepoint_by_number_on_target (tpnum);
4269 /* FIXME this is a poor heuristic if multiple locations. */
4270 if (tp && tp->base.loc)
4271 addr = tp->base.loc->address;
4273 /* Restore our seek position. */
4274 cur_offset = saved_offset;
4275 lseek (trace_fd, cur_offset, SEEK_SET);
4279 /* Given a type of search and some parameters, scan the collection of
4280 traceframes in the file looking for a match. When found, return
4281 both the traceframe and tracepoint number, otherwise -1 for
4285 tfile_trace_find (enum trace_find_type type, int num,
4286 ULONGEST addr1, ULONGEST addr2, int *tpp)
4289 int tfnum = 0, found = 0;
4290 unsigned int data_size;
4291 struct tracepoint *tp;
4292 off_t offset, tframe_offset;
4302 lseek (trace_fd, trace_frames_offset, SEEK_SET);
4303 offset = trace_frames_offset;
4306 tframe_offset = offset;
4307 tfile_read ((gdb_byte *) &tpnum, 2);
4308 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4310 (target_gdbarch ()));
4314 tfile_read ((gdb_byte *) &data_size, 4);
4315 data_size = (unsigned int) extract_unsigned_integer
4316 ((gdb_byte *) &data_size, 4,
4317 gdbarch_byte_order (target_gdbarch ()));
4326 tfaddr = tfile_get_traceframe_address (tframe_offset);
4327 if (tfaddr == addr1)
4331 tp = get_tracepoint (num);
4332 if (tp && tpnum == tp->number_on_target)
4336 tfaddr = tfile_get_traceframe_address (tframe_offset);
4337 if (addr1 <= tfaddr && tfaddr <= addr2)
4341 tfaddr = tfile_get_traceframe_address (tframe_offset);
4342 if (!(addr1 <= tfaddr && tfaddr <= addr2))
4346 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4352 cur_offset = offset;
4353 cur_data_size = data_size;
4357 /* Skip past the traceframe's data. */
4358 lseek (trace_fd, data_size, SEEK_CUR);
4359 offset += data_size;
4360 /* Update our own count of traceframes. */
4363 /* Did not find what we were looking for. */
4369 /* Prototype of the callback passed to tframe_walk_blocks. */
4370 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4372 /* Callback for traceframe_walk_blocks, used to find a given block
4373 type in a traceframe. */
4376 match_blocktype (char blocktype, void *data)
4378 char *wantedp = data;
4380 if (*wantedp == blocktype)
4386 /* Walk over all traceframe block starting at POS offset from
4387 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4388 unmodified. If CALLBACK returns true, this returns the position in
4389 the traceframe where the block is found, relative to the start of
4390 the traceframe (cur_offset). Returns -1 if no callback call
4391 returned true, indicating that all blocks have been walked. */
4394 traceframe_walk_blocks (walk_blocks_callback_func callback,
4395 int pos, void *data)
4397 /* Iterate through a traceframe's blocks, looking for a block of the
4400 lseek (trace_fd, cur_offset + pos, SEEK_SET);
4401 while (pos < cur_data_size)
4403 unsigned short mlen;
4406 tfile_read (&block_type, 1);
4410 if ((*callback) (block_type, data))
4416 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4417 pos += trace_regblock_size;
4420 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4421 tfile_read ((gdb_byte *) &mlen, 2);
4422 mlen = (unsigned short)
4423 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4425 (target_gdbarch ()));
4426 lseek (trace_fd, mlen, SEEK_CUR);
4427 pos += (8 + 2 + mlen);
4430 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4434 error (_("Unknown block type '%c' (0x%x) in trace frame"),
4435 block_type, block_type);
4443 /* Convenience wrapper around traceframe_walk_blocks. Looks for the
4444 position offset of a block of type TYPE_WANTED in the current trace
4445 frame, starting at POS. Returns -1 if no such block was found. */
4448 traceframe_find_block_type (char type_wanted, int pos)
4450 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4453 /* Look for a block of saved registers in the traceframe, and get the
4454 requested register from it. */
4457 tfile_fetch_registers (struct target_ops *ops,
4458 struct regcache *regcache, int regno)
4460 struct gdbarch *gdbarch = get_regcache_arch (regcache);
4461 int offset, regn, regsize, pc_regno;
4464 /* An uninitialized reg size says we're not going to be
4465 successful at getting register blocks. */
4466 if (!trace_regblock_size)
4469 regs = alloca (trace_regblock_size);
4471 if (traceframe_find_block_type ('R', 0) >= 0)
4473 tfile_read (regs, trace_regblock_size);
4475 /* Assume the block is laid out in GDB register number order,
4476 each register with the size that it has in GDB. */
4478 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4480 regsize = register_size (gdbarch, regn);
4481 /* Make sure we stay within block bounds. */
4482 if (offset + regsize >= trace_regblock_size)
4484 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4488 regcache_raw_supply (regcache, regno, regs + offset);
4491 else if (regno == -1)
4493 regcache_raw_supply (regcache, regn, regs + offset);
4501 /* We get here if no register data has been found. Mark registers
4503 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4504 regcache_raw_supply (regcache, regn, NULL);
4506 /* We can often usefully guess that the PC is going to be the same
4507 as the address of the tracepoint. */
4508 pc_regno = gdbarch_pc_regnum (gdbarch);
4509 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4511 struct tracepoint *tp = get_tracepoint (tracepoint_number);
4513 if (tp && tp->base.loc)
4515 /* But don't try to guess if tracepoint is multi-location... */
4516 if (tp->base.loc->next)
4518 warning (_("Tracepoint %d has multiple "
4519 "locations, cannot infer $pc"),
4523 /* ... or does while-stepping. */
4524 if (tp->step_count > 0)
4526 warning (_("Tracepoint %d does while-stepping, "
4527 "cannot infer $pc"),
4532 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4533 gdbarch_byte_order (gdbarch),
4534 tp->base.loc->address);
4535 regcache_raw_supply (regcache, pc_regno, regs);
4541 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4542 const char *annex, gdb_byte *readbuf,
4543 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4545 /* We're only doing regular memory for now. */
4546 if (object != TARGET_OBJECT_MEMORY)
4549 if (readbuf == NULL)
4550 error (_("tfile_xfer_partial: trace file is read-only"));
4552 if (traceframe_number != -1)
4556 /* Iterate through the traceframe's blocks, looking for
4558 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
4560 ULONGEST maddr, amt;
4561 unsigned short mlen;
4562 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
4564 tfile_read ((gdb_byte *) &maddr, 8);
4565 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4567 tfile_read ((gdb_byte *) &mlen, 2);
4568 mlen = (unsigned short)
4569 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4571 /* If the block includes the first part of the desired
4572 range, return as much it has; GDB will re-request the
4573 remainder, which might be in a different block of this
4575 if (maddr <= offset && offset < (maddr + mlen))
4577 amt = (maddr + mlen) - offset;
4581 if (maddr != offset)
4582 lseek (trace_fd, offset - maddr, SEEK_CUR);
4583 tfile_read (readbuf, amt);
4587 /* Skip over this block. */
4588 pos += (8 + 2 + mlen);
4592 /* It's unduly pedantic to refuse to look at the executable for
4593 read-only pieces; so do the equivalent of readonly regions aka
4595 /* FIXME account for relocation at some point. */
4602 for (s = exec_bfd->sections; s; s = s->next)
4604 if ((s->flags & SEC_LOAD) == 0
4605 || (s->flags & SEC_READONLY) == 0)
4609 size = bfd_get_section_size (s);
4610 if (vma <= offset && offset < (vma + size))
4614 amt = (vma + size) - offset;
4618 amt = bfd_get_section_contents (exec_bfd, s,
4619 readbuf, offset - vma, amt);
4625 /* Indicate failure to find the requested memory block. */
4629 /* Iterate through the blocks of a trace frame, looking for a 'V'
4630 block with a matching tsv number. */
4633 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4638 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
4642 tfile_read ((gdb_byte *) &vnum, 4);
4643 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
4645 (target_gdbarch ()));
4648 tfile_read ((gdb_byte *) val, 8);
4649 *val = extract_signed_integer ((gdb_byte *) val, 8,
4651 (target_gdbarch ()));
4657 /* Didn't find anything. */
4662 tfile_has_all_memory (struct target_ops *ops)
4668 tfile_has_memory (struct target_ops *ops)
4674 tfile_has_stack (struct target_ops *ops)
4676 return traceframe_number != -1;
4680 tfile_has_registers (struct target_ops *ops)
4682 return traceframe_number != -1;
4686 tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4691 /* Callback for traceframe_walk_blocks. Builds a traceframe_info
4692 object for the tfile target's current traceframe. */
4695 build_traceframe_info (char blocktype, void *data)
4697 struct traceframe_info *info = data;
4703 struct mem_range *r;
4705 unsigned short mlen;
4707 tfile_read ((gdb_byte *) &maddr, 8);
4708 tfile_read ((gdb_byte *) &mlen, 2);
4710 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4723 warning (_("Unhandled trace block type (%d) '%c ' "
4724 "while building trace frame info."),
4725 blocktype, blocktype);
4732 static struct traceframe_info *
4733 tfile_traceframe_info (void)
4735 struct traceframe_info *info = XCNEW (struct traceframe_info);
4737 traceframe_walk_blocks (build_traceframe_info, 0, info);
4742 init_tfile_ops (void)
4744 tfile_ops.to_shortname = "tfile";
4745 tfile_ops.to_longname = "Local trace dump file";
4747 = "Use a trace file as a target. Specify the filename of the trace file.";
4748 tfile_ops.to_open = tfile_open;
4749 tfile_ops.to_close = tfile_close;
4750 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4751 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4752 tfile_ops.to_files_info = tfile_files_info;
4753 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4754 tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
4755 tfile_ops.to_trace_find = tfile_trace_find;
4756 tfile_ops.to_get_trace_state_variable_value
4757 = tfile_get_trace_state_variable_value;
4758 tfile_ops.to_stratum = process_stratum;
4759 tfile_ops.to_has_all_memory = tfile_has_all_memory;
4760 tfile_ops.to_has_memory = tfile_has_memory;
4761 tfile_ops.to_has_stack = tfile_has_stack;
4762 tfile_ops.to_has_registers = tfile_has_registers;
4763 tfile_ops.to_traceframe_info = tfile_traceframe_info;
4764 tfile_ops.to_thread_alive = tfile_thread_alive;
4765 tfile_ops.to_magic = OPS_MAGIC;
4769 free_current_marker (void *arg)
4771 struct static_tracepoint_marker **marker_p = arg;
4773 if (*marker_p != NULL)
4775 release_static_tracepoint_marker (*marker_p);
4782 /* Given a line of text defining a static tracepoint marker, parse it
4783 into a "static tracepoint marker" object. Throws an error is
4784 parsing fails. If PP is non-null, it points to one past the end of
4785 the parsed marker definition. */
4788 parse_static_tracepoint_marker_definition (char *line, char **pp,
4789 struct static_tracepoint_marker *marker)
4796 p = unpack_varlen_hex (p, &addr);
4797 p++; /* skip a colon */
4799 marker->gdbarch = target_gdbarch ();
4800 marker->address = (CORE_ADDR) addr;
4802 endp = strchr (p, ':');
4804 error (_("bad marker definition: %s"), line);
4806 marker->str_id = xmalloc (endp - p + 1);
4807 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4808 marker->str_id[end] = '\0';
4811 p++; /* skip a colon */
4813 marker->extra = xmalloc (strlen (p) + 1);
4814 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4815 marker->extra[end] = '\0';
4821 /* Release a static tracepoint marker's contents. Note that the
4822 object itself isn't released here. There objects are usually on
4826 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4828 xfree (marker->str_id);
4829 marker->str_id = NULL;
4832 /* Print MARKER to gdb_stdout. */
4835 print_one_static_tracepoint_marker (int count,
4836 struct static_tracepoint_marker *marker)
4838 struct command_line *l;
4841 char wrap_indent[80];
4842 char extra_field_indent[80];
4843 struct ui_out *uiout = current_uiout;
4844 struct cleanup *bkpt_chain;
4845 VEC(breakpoint_p) *tracepoints;
4847 struct symtab_and_line sal;
4851 sal.pc = marker->address;
4853 tracepoints = static_tracepoints_here (marker->address);
4855 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4857 /* A counter field to help readability. This is not a stable
4859 ui_out_field_int (uiout, "count", count);
4861 ui_out_field_string (uiout, "marker-id", marker->str_id);
4863 ui_out_field_fmt (uiout, "enabled", "%c",
4864 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4865 ui_out_spaces (uiout, 2);
4867 strcpy (wrap_indent, " ");
4869 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4870 strcat (wrap_indent, " ");
4872 strcat (wrap_indent, " ");
4874 strcpy (extra_field_indent, " ");
4876 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4878 sal = find_pc_line (marker->address, 0);
4879 sym = find_pc_sect_function (marker->address, NULL);
4882 ui_out_text (uiout, "in ");
4883 ui_out_field_string (uiout, "func",
4884 SYMBOL_PRINT_NAME (sym));
4885 ui_out_wrap_hint (uiout, wrap_indent);
4886 ui_out_text (uiout, " at ");
4889 ui_out_field_skip (uiout, "func");
4891 if (sal.symtab != NULL)
4893 ui_out_field_string (uiout, "file",
4894 symtab_to_filename_for_display (sal.symtab));
4895 ui_out_text (uiout, ":");
4897 if (ui_out_is_mi_like_p (uiout))
4899 const char *fullname = symtab_to_fullname (sal.symtab);
4901 ui_out_field_string (uiout, "fullname", fullname);
4904 ui_out_field_skip (uiout, "fullname");
4906 ui_out_field_int (uiout, "line", sal.line);
4910 ui_out_field_skip (uiout, "fullname");
4911 ui_out_field_skip (uiout, "line");
4914 ui_out_text (uiout, "\n");
4915 ui_out_text (uiout, extra_field_indent);
4916 ui_out_text (uiout, _("Data: \""));
4917 ui_out_field_string (uiout, "extra-data", marker->extra);
4918 ui_out_text (uiout, "\"\n");
4920 if (!VEC_empty (breakpoint_p, tracepoints))
4922 struct cleanup *cleanup_chain;
4924 struct breakpoint *b;
4926 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4929 ui_out_text (uiout, extra_field_indent);
4930 ui_out_text (uiout, _("Probed by static tracepoints: "));
4931 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4934 ui_out_text (uiout, ", ");
4935 ui_out_text (uiout, "#");
4936 ui_out_field_int (uiout, "tracepoint-id", b->number);
4939 do_cleanups (cleanup_chain);
4941 if (ui_out_is_mi_like_p (uiout))
4942 ui_out_field_int (uiout, "number-of-tracepoints",
4943 VEC_length(breakpoint_p, tracepoints));
4945 ui_out_text (uiout, "\n");
4947 VEC_free (breakpoint_p, tracepoints);
4949 do_cleanups (bkpt_chain);
4953 info_static_tracepoint_markers_command (char *arg, int from_tty)
4955 VEC(static_tracepoint_marker_p) *markers;
4956 struct cleanup *old_chain;
4957 struct static_tracepoint_marker *marker;
4958 struct ui_out *uiout = current_uiout;
4961 /* We don't have to check target_can_use_agent and agent's capability on
4962 static tracepoint here, in order to be compatible with older GDBserver.
4963 We don't check USE_AGENT is true or not, because static tracepoints
4964 don't work without in-process agent, so we don't bother users to type
4965 `set agent on' when to use static tracepoint. */
4968 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4969 "StaticTracepointMarkersTable");
4971 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4973 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4975 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4976 if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
4977 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4979 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4980 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4982 ui_out_table_body (uiout);
4984 markers = target_static_tracepoint_markers_by_strid (NULL);
4985 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4988 VEC_iterate (static_tracepoint_marker_p,
4989 markers, i, marker);
4992 print_one_static_tracepoint_marker (i + 1, marker);
4993 release_static_tracepoint_marker (marker);
4996 do_cleanups (old_chain);
4999 /* The $_sdata convenience variable is a bit special. We don't know
5000 for sure type of the value until we actually have a chance to fetch
5001 the data --- the size of the object depends on what has been
5002 collected. We solve this by making $_sdata be an internalvar that
5003 creates a new value on access. */
5005 /* Return a new value with the correct type for the sdata object of
5006 the current trace frame. Return a void value if there's no object
5009 static struct value *
5010 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
5016 /* We need to read the whole object before we know its size. */
5017 size = target_read_alloc (¤t_target,
5018 TARGET_OBJECT_STATIC_TRACE_DATA,
5025 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
5027 v = allocate_value (type);
5028 memcpy (value_contents_raw (v), buf, size);
5033 return allocate_value (builtin_type (gdbarch)->builtin_void);
5036 #if !defined(HAVE_LIBEXPAT)
5038 struct traceframe_info *
5039 parse_traceframe_info (const char *tframe_info)
5041 static int have_warned;
5046 warning (_("Can not parse XML trace frame info; XML support "
5047 "was disabled at compile time"));
5053 #else /* HAVE_LIBEXPAT */
5055 #include "xml-support.h"
5057 /* Handle the start of a <memory> element. */
5060 traceframe_info_start_memory (struct gdb_xml_parser *parser,
5061 const struct gdb_xml_element *element,
5062 void *user_data, VEC(gdb_xml_value_s) *attributes)
5064 struct traceframe_info *info = user_data;
5065 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
5066 ULONGEST *start_p, *length_p;
5068 start_p = xml_find_attribute (attributes, "start")->value;
5069 length_p = xml_find_attribute (attributes, "length")->value;
5071 r->start = *start_p;
5072 r->length = *length_p;
5075 /* Discard the constructed trace frame info (if an error occurs). */
5078 free_result (void *p)
5080 struct traceframe_info *result = p;
5082 free_traceframe_info (result);
5085 /* The allowed elements and attributes for an XML memory map. */
5087 static const struct gdb_xml_attribute memory_attributes[] = {
5088 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5089 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5090 { NULL, GDB_XML_AF_NONE, NULL, NULL }
5093 static const struct gdb_xml_element traceframe_info_children[] = {
5094 { "memory", memory_attributes, NULL,
5095 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5096 traceframe_info_start_memory, NULL },
5097 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5100 static const struct gdb_xml_element traceframe_info_elements[] = {
5101 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
5103 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5106 /* Parse a traceframe-info XML document. */
5108 struct traceframe_info *
5109 parse_traceframe_info (const char *tframe_info)
5111 struct traceframe_info *result;
5112 struct cleanup *back_to;
5114 result = XCNEW (struct traceframe_info);
5115 back_to = make_cleanup (free_result, result);
5117 if (gdb_xml_parse_quick (_("trace frame info"),
5118 "traceframe-info.dtd", traceframe_info_elements,
5119 tframe_info, result) == 0)
5121 /* Parsed successfully, keep the result. */
5122 discard_cleanups (back_to);
5127 do_cleanups (back_to);
5131 #endif /* HAVE_LIBEXPAT */
5133 /* Returns the traceframe_info object for the current traceframe.
5134 This is where we avoid re-fetching the object from the target if we
5135 already have it cached. */
5137 static struct traceframe_info *
5138 get_traceframe_info (void)
5140 if (traceframe_info == NULL)
5141 traceframe_info = target_traceframe_info ();
5143 return traceframe_info;
5146 /* If the target supports the query, return in RESULT the set of
5147 collected memory in the current traceframe, found within the LEN
5148 bytes range starting at MEMADDR. Returns true if the target
5149 supports the query, otherwise returns false, and RESULT is left
5153 traceframe_available_memory (VEC(mem_range_s) **result,
5154 CORE_ADDR memaddr, ULONGEST len)
5156 struct traceframe_info *info = get_traceframe_info ();
5160 struct mem_range *r;
5165 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
5166 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
5168 ULONGEST lo1, hi1, lo2, hi2;
5169 struct mem_range *nr;
5172 hi1 = memaddr + len;
5175 hi2 = r->start + r->length;
5177 nr = VEC_safe_push (mem_range_s, *result, NULL);
5179 nr->start = max (lo1, lo2);
5180 nr->length = min (hi1, hi2) - nr->start;
5183 normalize_mem_ranges (*result);
5190 /* Implementation of `sdata' variable. */
5192 static const struct internalvar_funcs sdata_funcs =
5199 /* module initialization */
5201 _initialize_tracepoint (void)
5203 struct cmd_list_element *c;
5205 /* Explicitly create without lookup, since that tries to create a
5206 value with a void typed value, and when we get here, gdbarch
5207 isn't initialized yet. At this point, we're quite sure there
5208 isn't another convenience variable of the same name. */
5209 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
5211 traceframe_number = -1;
5212 tracepoint_number = -1;
5214 if (tracepoint_list.list == NULL)
5216 tracepoint_list.listsize = 128;
5217 tracepoint_list.list = xmalloc
5218 (tracepoint_list.listsize * sizeof (struct memrange));
5220 if (tracepoint_list.aexpr_list == NULL)
5222 tracepoint_list.aexpr_listsize = 128;
5223 tracepoint_list.aexpr_list = xmalloc
5224 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
5227 if (stepping_list.list == NULL)
5229 stepping_list.listsize = 128;
5230 stepping_list.list = xmalloc
5231 (stepping_list.listsize * sizeof (struct memrange));
5234 if (stepping_list.aexpr_list == NULL)
5236 stepping_list.aexpr_listsize = 128;
5237 stepping_list.aexpr_list = xmalloc
5238 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
5241 add_info ("scope", scope_info,
5242 _("List the variables local to a scope"));
5244 add_cmd ("tracepoints", class_trace, NULL,
5245 _("Tracing of program execution without stopping the program."),
5248 add_com ("tdump", class_trace, trace_dump_command,
5249 _("Print everything collected at the current tracepoint."));
5251 add_com ("tsave", class_trace, trace_save_command, _("\
5252 Save the trace data to a file.\n\
5253 Use the '-r' option to direct the target to save directly to the file,\n\
5254 using its own filesystem."));
5256 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
5257 Define a trace state variable.\n\
5258 Argument is a $-prefixed name, optionally followed\n\
5259 by '=' and an expression that sets the initial value\n\
5260 at the start of tracing."));
5261 set_cmd_completer (c, expression_completer);
5263 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
5264 Delete one or more trace state variables.\n\
5265 Arguments are the names of the variables to delete.\n\
5266 If no arguments are supplied, delete all variables."), &deletelist);
5267 /* FIXME add a trace variable completer. */
5269 add_info ("tvariables", tvariables_info, _("\
5270 Status of trace state variables and their values.\n\
5273 add_info ("static-tracepoint-markers",
5274 info_static_tracepoint_markers_command, _("\
5275 List target static tracepoints markers.\n\
5278 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
5279 Select a trace frame;\n\
5280 No argument means forward by one frame; '-' means backward by one frame."),
5281 &tfindlist, "tfind ", 1, &cmdlist);
5283 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
5284 Select a trace frame whose PC is outside the given range (exclusive).\n\
5285 Usage: tfind outside addr1, addr2"),
5288 add_cmd ("range", class_trace, trace_find_range_command, _("\
5289 Select a trace frame whose PC is in the given range (inclusive).\n\
5290 Usage: tfind range addr1,addr2"),
5293 add_cmd ("line", class_trace, trace_find_line_command, _("\
5294 Select a trace frame by source line.\n\
5295 Argument can be a line number (with optional source file),\n\
5296 a function name, or '*' followed by an address.\n\
5297 Default argument is 'the next source line that was traced'."),
5300 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
5301 Select a trace frame by tracepoint number.\n\
5302 Default is the tracepoint for the current trace frame."),
5305 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
5306 Select a trace frame by PC.\n\
5307 Default is the current PC, or the PC of the current trace frame."),
5310 add_cmd ("end", class_trace, trace_find_end_command, _("\
5311 De-select any trace frame and resume 'live' debugging."),
5314 add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
5316 add_cmd ("start", class_trace, trace_find_start_command,
5317 _("Select the first trace frame in the trace buffer."),
5320 add_com ("tstatus", class_trace, trace_status_command,
5321 _("Display the status of the current trace data collection."));
5323 add_com ("tstop", class_trace, trace_stop_command, _("\
5324 Stop trace data collection.\n\
5325 Usage: tstop [ <notes> ... ]\n\
5326 Any arguments supplied are recorded with the trace as a stop reason and\n\
5327 reported by tstatus (if the target supports trace notes)."));
5329 add_com ("tstart", class_trace, trace_start_command, _("\
5330 Start trace data collection.\n\
5331 Usage: tstart [ <notes> ... ]\n\
5332 Any arguments supplied are recorded with the trace as a note and\n\
5333 reported by tstatus (if the target supports trace notes)."));
5335 add_com ("end", class_trace, end_actions_pseudocommand, _("\
5336 Ends a list of commands or actions.\n\
5337 Several GDB commands allow you to enter a list of commands or actions.\n\
5338 Entering \"end\" on a line by itself is the normal way to terminate\n\
5340 Note: the \"end\" command cannot be used at the gdb prompt."));
5342 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
5343 Specify single-stepping behavior at a tracepoint.\n\
5344 Argument is number of instructions to trace in single-step mode\n\
5345 following the tracepoint. This command is normally followed by\n\
5346 one or more \"collect\" commands, to specify what to collect\n\
5347 while single-stepping.\n\n\
5348 Note: this command can only be used in a tracepoint \"actions\" list."));
5350 add_com_alias ("ws", "while-stepping", class_alias, 0);
5351 add_com_alias ("stepping", "while-stepping", class_alias, 0);
5353 add_com ("collect", class_trace, collect_pseudocommand, _("\
5354 Specify one or more data items to be collected at a tracepoint.\n\
5355 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
5356 collect all data (variables, registers) referenced by that expression.\n\
5357 Also accepts the following special arguments:\n\
5358 $regs -- all registers.\n\
5359 $args -- all function arguments.\n\
5360 $locals -- all variables local to the block/function scope.\n\
5361 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
5362 Note: this command can only be used in a tracepoint \"actions\" list."));
5364 add_com ("teval", class_trace, teval_pseudocommand, _("\
5365 Specify one or more expressions to be evaluated at a tracepoint.\n\
5366 Accepts a comma-separated list of (one or more) expressions.\n\
5367 The result of each evaluation will be discarded.\n\
5368 Note: this command can only be used in a tracepoint \"actions\" list."));
5370 add_com ("actions", class_trace, trace_actions_command, _("\
5371 Specify the actions to be taken at a tracepoint.\n\
5372 Tracepoint actions may include collecting of specified data,\n\
5373 single-stepping, or enabling/disabling other tracepoints,\n\
5374 depending on target's capabilities."));
5376 default_collect = xstrdup ("");
5377 add_setshow_string_cmd ("default-collect", class_trace,
5378 &default_collect, _("\
5379 Set the list of expressions to collect by default"), _("\
5380 Show the list of expressions to collect by default"), NULL,
5382 &setlist, &showlist);
5384 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5385 &disconnected_tracing, _("\
5386 Set whether tracing continues after GDB disconnects."), _("\
5387 Show whether tracing continues after GDB disconnects."), _("\
5388 Use this to continue a tracing run even if GDB disconnects\n\
5389 or detaches from the target. You can reconnect later and look at\n\
5390 trace data collected in the meantime."),
5391 set_disconnected_tracing,
5396 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5397 &circular_trace_buffer, _("\
5398 Set target's use of circular trace buffer."), _("\
5399 Show target's use of circular trace buffer."), _("\
5400 Use this to make the trace buffer into a circular buffer,\n\
5401 which will discard traceframes (oldest first) instead of filling\n\
5402 up and stopping the trace run."),
5403 set_circular_trace_buffer,
5408 add_setshow_string_cmd ("trace-user", class_trace,
5410 Set the user name to use for current and future trace runs"), _("\
5411 Show the user name to use for current and future trace runs"), NULL,
5412 set_trace_user, NULL,
5413 &setlist, &showlist);
5415 add_setshow_string_cmd ("trace-notes", class_trace,
5417 Set notes string to use for current and future trace runs"), _("\
5418 Show the notes string to use for current and future trace runs"), NULL,
5419 set_trace_notes, NULL,
5420 &setlist, &showlist);
5422 add_setshow_string_cmd ("trace-stop-notes", class_trace,
5423 &trace_stop_notes, _("\
5424 Set notes string to use for future tstop commands"), _("\
5425 Show the notes string to use for future tstop commands"), NULL,
5426 set_trace_stop_notes, NULL,
5427 &setlist, &showlist);
5431 add_target (&tfile_ops);