1 /* Tracing functionality for remote targets in custom GDB protocol
3 Copyright (C) 1997-2012 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);
96 /* GDB commands implemented in other modules:
99 extern void output_command (char *, int);
104 This module defines the following debugger commands:
105 trace : set a tracepoint on a function, line, or address.
106 info trace : list all debugger-defined tracepoints.
107 delete trace : delete one or more tracepoints.
108 enable trace : enable one or more tracepoints.
109 disable trace : disable one or more tracepoints.
110 actions : specify actions to be taken at a tracepoint.
111 passcount : specify a pass count for a tracepoint.
112 tstart : start a trace experiment.
113 tstop : stop a trace experiment.
114 tstatus : query the status of a trace experiment.
115 tfind : find a trace frame in the trace buffer.
116 tdump : print everything collected at the current tracepoint.
117 save-tracepoints : write tracepoint setup into a file.
119 This module defines the following user-visible debugger variables:
120 $trace_frame : sequence number of trace frame currently being debugged.
121 $trace_line : source line of trace frame currently being debugged.
122 $trace_file : source file of trace frame currently being debugged.
123 $tracepoint : tracepoint number of trace frame currently being debugged.
127 /* ======= Important global variables: ======= */
129 /* The list of all trace state variables. We don't retain pointers to
130 any of these for any reason - API is by name or number only - so it
131 works to have a vector of objects. */
133 typedef struct trace_state_variable tsv_s;
136 /* An object describing the contents of a traceframe. */
138 struct traceframe_info
140 /* Collected memory. */
141 VEC(mem_range_s) *memory;
144 static VEC(tsv_s) *tvariables;
146 /* The next integer to assign to a variable. */
148 static int next_tsv_number = 1;
150 /* Number of last traceframe collected. */
151 static int traceframe_number;
153 /* Tracepoint for last traceframe collected. */
154 static int tracepoint_number;
156 /* Symbol for function for last traceframe collected. */
157 static struct symbol *traceframe_fun;
159 /* Symtab and line for last traceframe collected. */
160 static struct symtab_and_line traceframe_sal;
162 /* The traceframe info of the current traceframe. NULL if we haven't
163 yet attempted to fetch it, or if the target does not support
164 fetching this object, or if we're not inspecting a traceframe
166 static struct traceframe_info *traceframe_info;
168 /* Tracing command lists. */
169 static struct cmd_list_element *tfindlist;
171 /* List of expressions to collect by default at each tracepoint hit. */
172 char *default_collect = "";
174 static int disconnected_tracing;
176 /* This variable controls whether we ask the target for a linear or
177 circular trace buffer. */
179 static int circular_trace_buffer;
181 /* Textual notes applying to the current and/or future trace runs. */
183 char *trace_user = NULL;
185 /* Textual notes applying to the current and/or future trace runs. */
187 char *trace_notes = NULL;
189 /* Textual notes applying to the stopping of a trace. */
191 char *trace_stop_notes = NULL;
193 /* ======= Important command functions: ======= */
194 static void trace_actions_command (char *, int);
195 static void trace_start_command (char *, int);
196 static void trace_stop_command (char *, int);
197 static void trace_status_command (char *, int);
198 static void trace_find_command (char *, int);
199 static void trace_find_pc_command (char *, int);
200 static void trace_find_tracepoint_command (char *, int);
201 static void trace_find_line_command (char *, int);
202 static void trace_find_range_command (char *, int);
203 static void trace_find_outside_command (char *, int);
204 static void trace_dump_command (char *, int);
206 /* support routines */
208 struct collection_list;
209 static void add_aexpr (struct collection_list *, struct agent_expr *);
210 static char *mem2hex (gdb_byte *, char *, int);
211 static void add_register (struct collection_list *collection,
214 static void free_uploaded_tps (struct uploaded_tp **utpp);
215 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
218 extern void _initialize_tracepoint (void);
220 static struct trace_status trace_status;
222 char *stop_reason_names[] = {
232 struct trace_status *
233 current_trace_status (void)
235 return &trace_status;
241 free_traceframe_info (struct traceframe_info *info)
245 VEC_free (mem_range_s, info->memory);
251 /* Free and clear the traceframe info cache of the current
255 clear_traceframe_info (void)
257 free_traceframe_info (traceframe_info);
258 traceframe_info = NULL;
261 /* Set traceframe number to NUM. */
263 set_traceframe_num (int num)
265 traceframe_number = num;
266 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
269 /* Set tracepoint number to NUM. */
271 set_tracepoint_num (int num)
273 tracepoint_number = num;
274 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
277 /* Set externally visible debug variables for querying/printing
278 the traceframe context (line, function, file). */
281 set_traceframe_context (struct frame_info *trace_frame)
285 /* Save as globals for internal use. */
286 if (trace_frame != NULL
287 && get_frame_pc_if_available (trace_frame, &trace_pc))
289 traceframe_sal = find_pc_line (trace_pc, 0);
290 traceframe_fun = find_pc_function (trace_pc);
292 /* Save linenumber as "$trace_line", a debugger variable visible to
294 set_internalvar_integer (lookup_internalvar ("trace_line"),
295 traceframe_sal.line);
299 init_sal (&traceframe_sal);
300 traceframe_fun = NULL;
301 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
304 /* Save func name as "$trace_func", a debugger variable visible to
306 if (traceframe_fun == NULL
307 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
308 clear_internalvar (lookup_internalvar ("trace_func"));
310 set_internalvar_string (lookup_internalvar ("trace_func"),
311 SYMBOL_LINKAGE_NAME (traceframe_fun));
313 /* Save file name as "$trace_file", a debugger variable visible to
315 if (traceframe_sal.symtab == NULL)
316 clear_internalvar (lookup_internalvar ("trace_file"));
318 set_internalvar_string (lookup_internalvar ("trace_file"),
319 traceframe_sal.symtab->filename);
322 /* Create a new trace state variable with the given name. */
324 struct trace_state_variable *
325 create_trace_state_variable (const char *name)
327 struct trace_state_variable tsv;
329 memset (&tsv, 0, sizeof (tsv));
330 tsv.name = xstrdup (name);
331 tsv.number = next_tsv_number++;
332 return VEC_safe_push (tsv_s, tvariables, &tsv);
335 /* Look for a trace state variable of the given name. */
337 struct trace_state_variable *
338 find_trace_state_variable (const char *name)
340 struct trace_state_variable *tsv;
343 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
344 if (strcmp (name, tsv->name) == 0)
351 delete_trace_state_variable (const char *name)
353 struct trace_state_variable *tsv;
356 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
357 if (strcmp (name, tsv->name) == 0)
359 xfree ((void *)tsv->name);
360 VEC_unordered_remove (tsv_s, tvariables, ix);
362 observer_notify_tsv_deleted (name);
367 warning (_("No trace variable named \"$%s\", not deleting"), name);
370 /* The 'tvariable' command collects a name and optional expression to
371 evaluate into an initial value. */
374 trace_variable_command (char *args, int from_tty)
376 struct expression *expr;
377 struct cleanup *old_chain;
378 struct internalvar *intvar = NULL;
380 struct trace_state_variable *tsv;
383 error_no_arg (_("trace state variable name"));
385 /* All the possible valid arguments are expressions. */
386 expr = parse_expression (args);
387 old_chain = make_cleanup (free_current_contents, &expr);
389 if (expr->nelts == 0)
390 error (_("No expression?"));
392 /* Only allow two syntaxes; "$name" and "$name=value". */
393 if (expr->elts[0].opcode == OP_INTERNALVAR)
395 intvar = expr->elts[1].internalvar;
397 else if (expr->elts[0].opcode == BINOP_ASSIGN
398 && expr->elts[1].opcode == OP_INTERNALVAR)
400 intvar = expr->elts[2].internalvar;
401 initval = value_as_long (evaluate_subexpression_type (expr, 4));
404 error (_("Syntax must be $NAME [ = EXPR ]"));
407 error (_("No name given"));
409 if (strlen (internalvar_name (intvar)) <= 0)
410 error (_("Must supply a non-empty variable name"));
412 /* If the variable already exists, just change its initial value. */
413 tsv = find_trace_state_variable (internalvar_name (intvar));
416 tsv->initial_value = initval;
417 printf_filtered (_("Trace state variable $%s "
418 "now has initial value %s.\n"),
419 tsv->name, plongest (tsv->initial_value));
420 do_cleanups (old_chain);
424 /* Create a new variable. */
425 tsv = create_trace_state_variable (internalvar_name (intvar));
426 tsv->initial_value = initval;
428 observer_notify_tsv_created (tsv->name, initval);
430 printf_filtered (_("Trace state variable $%s "
431 "created, with initial value %s.\n"),
432 tsv->name, plongest (tsv->initial_value));
434 do_cleanups (old_chain);
438 delete_trace_variable_command (char *args, int from_tty)
442 struct cleanup *back_to;
446 if (query (_("Delete all trace state variables? ")))
447 VEC_free (tsv_s, tvariables);
449 observer_notify_tsv_deleted (NULL);
453 argv = gdb_buildargv (args);
454 back_to = make_cleanup_freeargv (argv);
456 for (ix = 0; argv[ix] != NULL; ix++)
458 if (*argv[ix] == '$')
459 delete_trace_state_variable (argv[ix] + 1);
461 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
464 do_cleanups (back_to);
470 tvariables_info_1 (void)
472 struct trace_state_variable *tsv;
475 struct cleanup *back_to;
476 struct ui_out *uiout = current_uiout;
478 if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
480 printf_filtered (_("No trace state variables.\n"));
484 /* Try to acquire values from the target. */
485 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
486 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
489 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
490 count, "trace-variables");
491 ui_out_table_header (uiout, 15, ui_left, "name", "Name");
492 ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
493 ui_out_table_header (uiout, 11, ui_left, "current", "Current");
495 ui_out_table_body (uiout);
497 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
499 struct cleanup *back_to2;
503 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
505 name = concat ("$", tsv->name, (char *) NULL);
506 make_cleanup (xfree, name);
507 ui_out_field_string (uiout, "name", name);
508 ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
510 if (tsv->value_known)
511 c = plongest (tsv->value);
512 else if (ui_out_is_mi_like_p (uiout))
513 /* For MI, we prefer not to use magic string constants, but rather
514 omit the field completely. The difference between unknown and
515 undefined does not seem important enough to represent. */
517 else if (current_trace_status ()->running || traceframe_number >= 0)
518 /* The value is/was defined, but we don't have it. */
521 /* It is not meaningful to ask about the value. */
524 ui_out_field_string (uiout, "current", c);
525 ui_out_text (uiout, "\n");
527 do_cleanups (back_to2);
530 do_cleanups (back_to);
533 /* List all the trace state variables. */
536 tvariables_info (char *args, int from_tty)
538 tvariables_info_1 ();
541 /* Stash definitions of tsvs into the given file. */
544 save_trace_state_variables (struct ui_file *fp)
546 struct trace_state_variable *tsv;
549 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
551 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
552 if (tsv->initial_value)
553 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
554 fprintf_unfiltered (fp, "\n");
558 /* ACTIONS functions: */
560 /* The three functions:
561 collect_pseudocommand,
562 while_stepping_pseudocommand, and
563 end_actions_pseudocommand
564 are placeholders for "commands" that are actually ONLY to be used
565 within a tracepoint action list. If the actual function is ever called,
566 it means that somebody issued the "command" at the top level,
567 which is always an error. */
570 end_actions_pseudocommand (char *args, int from_tty)
572 error (_("This command cannot be used at the top level."));
576 while_stepping_pseudocommand (char *args, int from_tty)
578 error (_("This command can only be used in a tracepoint actions list."));
582 collect_pseudocommand (char *args, int from_tty)
584 error (_("This command can only be used in a tracepoint actions list."));
588 teval_pseudocommand (char *args, int from_tty)
590 error (_("This command can only be used in a tracepoint actions list."));
593 /* Parse any collection options, such as /s for strings. */
596 decode_agent_options (char *exp)
598 struct value_print_options opts;
603 /* Call this to borrow the print elements default for collection
605 get_user_print_options (&opts);
610 if (target_supports_string_tracing ())
612 /* Allow an optional decimal number giving an explicit maximum
613 string length, defaulting it to the "print elements" value;
614 so "collect/s80 mystr" gets at most 80 bytes of string. */
615 trace_string_kludge = opts.print_max;
617 if (*exp >= '0' && *exp <= '9')
618 trace_string_kludge = atoi (exp);
619 while (*exp >= '0' && *exp <= '9')
623 error (_("Target does not support \"/s\" option for string tracing."));
626 error (_("Undefined collection format \"%c\"."), *exp);
628 exp = skip_spaces (exp);
633 /* Enter a list of actions for a tracepoint. */
635 trace_actions_command (char *args, int from_tty)
637 struct tracepoint *t;
638 struct command_line *l;
640 t = get_tracepoint_by_number (&args, NULL, 1);
644 xstrprintf ("Enter actions for tracepoint %d, one per line.",
646 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
648 l = read_command_lines (tmpbuf, from_tty, 1,
649 check_tracepoint_command, t);
650 do_cleanups (cleanups);
651 breakpoint_set_commands (&t->base, l);
653 /* else just return */
656 /* Report the results of checking the agent expression, as errors or
660 report_agent_reqs_errors (struct agent_expr *aexpr)
662 /* All of the "flaws" are serious bytecode generation issues that
663 should never occur. */
664 if (aexpr->flaw != agent_flaw_none)
665 internal_error (__FILE__, __LINE__, _("expression is malformed"));
667 /* If analysis shows a stack underflow, GDB must have done something
668 badly wrong in its bytecode generation. */
669 if (aexpr->min_height < 0)
670 internal_error (__FILE__, __LINE__,
671 _("expression has min height < 0"));
673 /* Issue this error if the stack is predicted to get too deep. The
674 limit is rather arbitrary; a better scheme might be for the
675 target to report how much stack it will have available. The
676 depth roughly corresponds to parenthesization, so a limit of 20
677 amounts to 20 levels of expression nesting, which is actually
678 a pretty big hairy expression. */
679 if (aexpr->max_height > 20)
680 error (_("Expression is too complicated."));
683 /* worker function */
685 validate_actionline (char **line, struct breakpoint *b)
687 struct cmd_list_element *c;
688 struct expression *exp = NULL;
689 struct cleanup *old_chain = NULL;
691 struct bp_location *loc;
692 struct agent_expr *aexpr;
693 struct tracepoint *t = (struct tracepoint *) b;
695 /* If EOF is typed, *line is NULL. */
699 for (p = *line; isspace ((int) *p);)
702 /* Symbol lookup etc. */
703 if (*p == '\0') /* empty line: just prompt for another line. */
706 if (*p == '#') /* comment line */
709 c = lookup_cmd (&p, cmdlist, "", -1, 1);
711 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
713 if (cmd_cfunc_eq (c, collect_pseudocommand))
715 trace_string_kludge = 0;
717 p = decode_agent_options (p);
720 { /* Repeat over a comma-separated list. */
721 QUIT; /* Allow user to bail out with ^C. */
722 while (isspace ((int) *p))
725 if (*p == '$') /* Look for special pseudo-symbols. */
727 if (0 == strncasecmp ("reg", p + 1, 3)
728 || 0 == strncasecmp ("arg", p + 1, 3)
729 || 0 == strncasecmp ("loc", p + 1, 3)
730 || 0 == strncasecmp ("_ret", p + 1, 4)
731 || 0 == strncasecmp ("_sdata", p + 1, 6))
736 /* else fall thru, treat p as an expression and parse it! */
739 for (loc = t->base.loc; loc; loc = loc->next)
742 exp = parse_exp_1 (&p, loc->address,
743 block_for_pc (loc->address), 1);
744 old_chain = make_cleanup (free_current_contents, &exp);
746 if (exp->elts[0].opcode == OP_VAR_VALUE)
748 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
750 error (_("constant `%s' (value %s) "
751 "will not be collected."),
752 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
753 plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
755 else if (SYMBOL_CLASS (exp->elts[2].symbol)
756 == LOC_OPTIMIZED_OUT)
758 error (_("`%s' is optimized away "
759 "and cannot be collected."),
760 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
764 /* We have something to collect, make sure that the expr to
765 bytecode translator can handle it and that it's not too
767 aexpr = gen_trace_for_expr (loc->address, exp);
768 make_cleanup_free_agent_expr (aexpr);
770 if (aexpr->len > MAX_AGENT_EXPR_LEN)
771 error (_("Expression is too complicated."));
775 report_agent_reqs_errors (aexpr);
777 do_cleanups (old_chain);
780 while (p && *p++ == ',');
783 else if (cmd_cfunc_eq (c, teval_pseudocommand))
786 { /* Repeat over a comma-separated list. */
787 QUIT; /* Allow user to bail out with ^C. */
788 while (isspace ((int) *p))
792 for (loc = t->base.loc; loc; loc = loc->next)
795 /* Only expressions are allowed for this action. */
796 exp = parse_exp_1 (&p, loc->address,
797 block_for_pc (loc->address), 1);
798 old_chain = make_cleanup (free_current_contents, &exp);
800 /* We have something to evaluate, make sure that the expr to
801 bytecode translator can handle it and that it's not too
803 aexpr = gen_eval_for_expr (loc->address, exp);
804 make_cleanup_free_agent_expr (aexpr);
806 if (aexpr->len > MAX_AGENT_EXPR_LEN)
807 error (_("Expression is too complicated."));
810 report_agent_reqs_errors (aexpr);
812 do_cleanups (old_chain);
815 while (p && *p++ == ',');
818 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
820 char *steparg; /* In case warning is necessary. */
822 while (isspace ((int) *p))
826 if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
827 error (_("while-stepping step count `%s' is malformed."), *line);
830 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
834 error (_("`%s' is not a supported tracepoint action."), *line);
838 memrange_absolute = -1
843 int type; /* memrange_absolute for absolute memory range,
844 else basereg number. */
845 bfd_signed_vma start;
849 struct collection_list
851 unsigned char regs_mask[32]; /* room for up to 256 regs */
854 struct memrange *list;
855 long aexpr_listsize; /* size of array pointed to by expr_list elt */
857 struct agent_expr **aexpr_list;
859 /* True is the user requested a collection of "$_sdata", "static
863 tracepoint_list, stepping_list;
865 /* MEMRANGE functions: */
867 static int memrange_cmp (const void *, const void *);
869 /* Compare memranges for qsort. */
871 memrange_cmp (const void *va, const void *vb)
873 const struct memrange *a = va, *b = vb;
875 if (a->type < b->type)
877 if (a->type > b->type)
879 if (a->type == memrange_absolute)
881 if ((bfd_vma) a->start < (bfd_vma) b->start)
883 if ((bfd_vma) a->start > (bfd_vma) b->start)
888 if (a->start < b->start)
890 if (a->start > b->start)
896 /* Sort the memrange list using qsort, and merge adjacent memranges. */
898 memrange_sortmerge (struct collection_list *memranges)
902 qsort (memranges->list, memranges->next_memrange,
903 sizeof (struct memrange), memrange_cmp);
904 if (memranges->next_memrange > 0)
906 for (a = 0, b = 1; b < memranges->next_memrange; b++)
908 /* If memrange b overlaps or is adjacent to memrange a,
910 if (memranges->list[a].type == memranges->list[b].type
911 && memranges->list[b].start <= memranges->list[a].end)
913 if (memranges->list[b].end > memranges->list[a].end)
914 memranges->list[a].end = memranges->list[b].end;
915 continue; /* next b, same a */
919 memcpy (&memranges->list[a], &memranges->list[b],
920 sizeof (struct memrange));
922 memranges->next_memrange = a + 1;
926 /* Add a register to a collection list. */
928 add_register (struct collection_list *collection, unsigned int regno)
931 printf_filtered ("collect register %d\n", regno);
932 if (regno >= (8 * sizeof (collection->regs_mask)))
933 error (_("Internal: register number %d too large for tracepoint"),
935 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
938 /* Add a memrange to a collection list. */
940 add_memrange (struct collection_list *memranges,
941 int type, bfd_signed_vma base,
946 printf_filtered ("(%d,", type);
948 printf_filtered (",%ld)\n", len);
951 /* type: memrange_absolute == memory, other n == basereg */
952 memranges->list[memranges->next_memrange].type = type;
953 /* base: addr if memory, offset if reg relative. */
954 memranges->list[memranges->next_memrange].start = base;
955 /* len: we actually save end (base + len) for convenience */
956 memranges->list[memranges->next_memrange].end = base + len;
957 memranges->next_memrange++;
958 if (memranges->next_memrange >= memranges->listsize)
960 memranges->listsize *= 2;
961 memranges->list = xrealloc (memranges->list,
962 memranges->listsize);
965 if (type != memrange_absolute) /* Better collect the base register! */
966 add_register (memranges, type);
969 /* Add a symbol to a collection list. */
971 collect_symbol (struct collection_list *collect,
973 struct gdbarch *gdbarch,
974 long frame_regno, long frame_offset,
979 bfd_signed_vma offset;
980 int treat_as_expr = 0;
982 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
983 switch (SYMBOL_CLASS (sym))
986 printf_filtered ("%s: don't know symbol class %d\n",
987 SYMBOL_PRINT_NAME (sym),
991 printf_filtered ("constant %s (value %s) will not be collected.\n",
992 SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
995 offset = SYMBOL_VALUE_ADDRESS (sym);
1000 sprintf_vma (tmp, offset);
1001 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
1002 SYMBOL_PRINT_NAME (sym), len,
1005 /* A struct may be a C++ class with static fields, go to general
1006 expression handling. */
1007 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
1010 add_memrange (collect, memrange_absolute, offset, len);
1013 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
1015 printf_filtered ("LOC_REG[parm] %s: ",
1016 SYMBOL_PRINT_NAME (sym));
1017 add_register (collect, reg);
1018 /* Check for doubles stored in two registers. */
1019 /* FIXME: how about larger types stored in 3 or more regs? */
1020 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
1021 len > register_size (gdbarch, reg))
1022 add_register (collect, reg + 1);
1025 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
1026 printf_filtered (" (will not collect %s)\n",
1027 SYMBOL_PRINT_NAME (sym));
1031 offset = frame_offset + SYMBOL_VALUE (sym);
1034 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1035 SYMBOL_PRINT_NAME (sym), len);
1036 printf_vma (offset);
1037 printf_filtered (" from frame ptr reg %d\n", reg);
1039 add_memrange (collect, reg, offset, len);
1041 case LOC_REGPARM_ADDR:
1042 reg = SYMBOL_VALUE (sym);
1046 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
1047 SYMBOL_PRINT_NAME (sym), len);
1048 printf_vma (offset);
1049 printf_filtered (" from reg %d\n", reg);
1051 add_memrange (collect, reg, offset, len);
1055 offset = frame_offset + SYMBOL_VALUE (sym);
1058 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1059 SYMBOL_PRINT_NAME (sym), len);
1060 printf_vma (offset);
1061 printf_filtered (" from frame ptr reg %d\n", reg);
1063 add_memrange (collect, reg, offset, len);
1066 case LOC_UNRESOLVED:
1070 case LOC_OPTIMIZED_OUT:
1071 printf_filtered ("%s has been optimized out of existence.\n",
1072 SYMBOL_PRINT_NAME (sym));
1080 /* Expressions are the most general case. */
1083 struct agent_expr *aexpr;
1084 struct cleanup *old_chain1 = NULL;
1086 aexpr = gen_trace_for_var (scope, gdbarch, sym);
1088 /* It can happen that the symbol is recorded as a computed
1089 location, but it's been optimized away and doesn't actually
1090 have a location expression. */
1093 printf_filtered ("%s has been optimized out of existence.\n",
1094 SYMBOL_PRINT_NAME (sym));
1098 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1102 report_agent_reqs_errors (aexpr);
1104 discard_cleanups (old_chain1);
1105 add_aexpr (collect, aexpr);
1107 /* Take care of the registers. */
1108 if (aexpr->reg_mask_len > 0)
1112 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1114 QUIT; /* Allow user to bail out with ^C. */
1115 if (aexpr->reg_mask[ndx1] != 0)
1117 /* Assume chars have 8 bits. */
1118 for (ndx2 = 0; ndx2 < 8; ndx2++)
1119 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1120 /* It's used -- record it. */
1121 add_register (collect, ndx1 * 8 + ndx2);
1128 /* Data to be passed around in the calls to the locals and args
1131 struct add_local_symbols_data
1133 struct collection_list *collect;
1134 struct gdbarch *gdbarch;
1141 /* The callback for the locals and args iterators. */
1144 do_collect_symbol (const char *print_name,
1148 struct add_local_symbols_data *p = cb_data;
1150 collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1151 p->frame_offset, p->pc);
1155 /* Add all locals (or args) symbols to collection list. */
1157 add_local_symbols (struct collection_list *collect,
1158 struct gdbarch *gdbarch, CORE_ADDR pc,
1159 long frame_regno, long frame_offset, int type)
1161 struct block *block;
1162 struct add_local_symbols_data cb_data;
1164 cb_data.collect = collect;
1165 cb_data.gdbarch = gdbarch;
1167 cb_data.frame_regno = frame_regno;
1168 cb_data.frame_offset = frame_offset;
1173 block = block_for_pc (pc);
1176 warning (_("Can't collect locals; "
1177 "no symbol table info available.\n"));
1181 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1182 if (cb_data.count == 0)
1183 warning (_("No locals found in scope."));
1187 pc = get_pc_function_start (pc);
1188 block = block_for_pc (pc);
1191 warning (_("Can't collect args; no symbol table info available."));
1195 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1196 if (cb_data.count == 0)
1197 warning (_("No args found in scope."));
1202 add_static_trace_data (struct collection_list *collection)
1205 printf_filtered ("collect static trace data\n");
1206 collection->strace_data = 1;
1209 /* worker function */
1211 clear_collection_list (struct collection_list *list)
1215 list->next_memrange = 0;
1216 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1218 free_agent_expr (list->aexpr_list[ndx]);
1219 list->aexpr_list[ndx] = NULL;
1221 list->next_aexpr_elt = 0;
1222 memset (list->regs_mask, 0, sizeof (list->regs_mask));
1223 list->strace_data = 0;
1226 /* Reduce a collection list to string form (for gdb protocol). */
1228 stringify_collection_list (struct collection_list *list, char *string)
1230 char temp_buf[2048];
1234 char *(*str_list)[];
1238 count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
1239 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1241 if (list->strace_data)
1244 printf_filtered ("\nCollecting static trace data\n");
1247 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1251 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1252 if (list->regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1254 if (list->regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1257 printf_filtered ("\nCollecting registers (mask): 0x");
1262 QUIT; /* Allow user to bail out with ^C. */
1264 printf_filtered ("%02X", list->regs_mask[i]);
1265 sprintf (end, "%02X", list->regs_mask[i]);
1268 (*str_list)[ndx] = xstrdup (temp_buf);
1272 printf_filtered ("\n");
1273 if (list->next_memrange > 0 && info_verbose)
1274 printf_filtered ("Collecting memranges: \n");
1275 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1277 QUIT; /* Allow user to bail out with ^C. */
1278 sprintf_vma (tmp2, list->list[i].start);
1281 printf_filtered ("(%d, %s, %ld)\n",
1284 (long) (list->list[i].end - list->list[i].start));
1286 if (count + 27 > MAX_AGENT_EXPR_LEN)
1288 (*str_list)[ndx] = savestring (temp_buf, count);
1295 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1297 /* The "%X" conversion specifier expects an unsigned argument,
1298 so passing -1 (memrange_absolute) to it directly gives you
1299 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1301 if (list->list[i].type == memrange_absolute)
1302 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1304 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1307 count += strlen (end);
1308 end = temp_buf + count;
1311 for (i = 0; i < list->next_aexpr_elt; i++)
1313 QUIT; /* Allow user to bail out with ^C. */
1314 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1316 (*str_list)[ndx] = savestring (temp_buf, count);
1321 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1322 end += 10; /* 'X' + 8 hex digits + ',' */
1325 end = mem2hex (list->aexpr_list[i]->buf,
1326 end, list->aexpr_list[i]->len);
1327 count += 2 * list->aexpr_list[i]->len;
1332 (*str_list)[ndx] = savestring (temp_buf, count);
1337 (*str_list)[ndx] = NULL;
1350 encode_actions_1 (struct command_line *action,
1351 struct breakpoint *t,
1352 struct bp_location *tloc,
1354 LONGEST frame_offset,
1355 struct collection_list *collect,
1356 struct collection_list *stepping_list)
1359 struct expression *exp = NULL;
1361 struct value *tempval;
1362 struct cmd_list_element *cmd;
1363 struct agent_expr *aexpr;
1365 for (; action; action = action->next)
1367 QUIT; /* Allow user to bail out with ^C. */
1368 action_exp = action->line;
1369 while (isspace ((int) *action_exp))
1372 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1374 error (_("Bad action list item: %s"), action_exp);
1376 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1378 trace_string_kludge = 0;
1379 if (*action_exp == '/')
1380 action_exp = decode_agent_options (action_exp);
1383 { /* Repeat over a comma-separated list. */
1384 QUIT; /* Allow user to bail out with ^C. */
1385 while (isspace ((int) *action_exp))
1388 if (0 == strncasecmp ("$reg", action_exp, 4))
1390 for (i = 0; i < gdbarch_num_regs (tloc->gdbarch); i++)
1391 add_register (collect, i);
1392 action_exp = strchr (action_exp, ','); /* more? */
1394 else if (0 == strncasecmp ("$arg", action_exp, 4))
1396 add_local_symbols (collect,
1402 action_exp = strchr (action_exp, ','); /* more? */
1404 else if (0 == strncasecmp ("$loc", action_exp, 4))
1406 add_local_symbols (collect,
1412 action_exp = strchr (action_exp, ','); /* more? */
1414 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1416 struct cleanup *old_chain1 = NULL;
1418 aexpr = gen_trace_for_return_address (tloc->address,
1421 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1424 report_agent_reqs_errors (aexpr);
1426 discard_cleanups (old_chain1);
1427 add_aexpr (collect, aexpr);
1429 /* take care of the registers */
1430 if (aexpr->reg_mask_len > 0)
1434 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1436 QUIT; /* allow user to bail out with ^C */
1437 if (aexpr->reg_mask[ndx1] != 0)
1439 /* assume chars have 8 bits */
1440 for (ndx2 = 0; ndx2 < 8; ndx2++)
1441 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1442 /* it's used -- record it */
1443 add_register (collect,
1449 action_exp = strchr (action_exp, ','); /* more? */
1451 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1453 add_static_trace_data (collect);
1454 action_exp = strchr (action_exp, ','); /* more? */
1459 struct cleanup *old_chain = NULL;
1460 struct cleanup *old_chain1 = NULL;
1462 exp = parse_exp_1 (&action_exp, tloc->address,
1463 block_for_pc (tloc->address), 1);
1464 old_chain = make_cleanup (free_current_contents, &exp);
1466 switch (exp->elts[0].opcode)
1470 const char *name = &exp->elts[2].string;
1472 i = user_reg_map_name_to_regnum (tloc->gdbarch,
1473 name, strlen (name));
1475 internal_error (__FILE__, __LINE__,
1476 _("Register $%s not available"),
1479 printf_filtered ("OP_REGISTER: ");
1480 add_register (collect, i);
1485 /* Safe because we know it's a simple expression. */
1486 tempval = evaluate_expression (exp);
1487 addr = value_address (tempval);
1488 /* Initialize the TYPE_LENGTH if it is a typedef. */
1489 check_typedef (exp->elts[1].type);
1490 add_memrange (collect, memrange_absolute, addr,
1491 TYPE_LENGTH (exp->elts[1].type));
1495 collect_symbol (collect,
1496 exp->elts[2].symbol,
1503 default: /* Full-fledged expression. */
1504 aexpr = gen_trace_for_expr (tloc->address, exp);
1506 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1510 report_agent_reqs_errors (aexpr);
1512 discard_cleanups (old_chain1);
1513 add_aexpr (collect, aexpr);
1515 /* Take care of the registers. */
1516 if (aexpr->reg_mask_len > 0)
1521 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1523 QUIT; /* Allow user to bail out with ^C. */
1524 if (aexpr->reg_mask[ndx1] != 0)
1526 /* Assume chars have 8 bits. */
1527 for (ndx2 = 0; ndx2 < 8; ndx2++)
1528 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1529 /* It's used -- record it. */
1530 add_register (collect,
1537 do_cleanups (old_chain);
1540 while (action_exp && *action_exp++ == ',');
1542 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1545 { /* Repeat over a comma-separated list. */
1546 QUIT; /* Allow user to bail out with ^C. */
1547 while (isspace ((int) *action_exp))
1551 struct cleanup *old_chain = NULL;
1552 struct cleanup *old_chain1 = NULL;
1554 exp = parse_exp_1 (&action_exp, tloc->address,
1555 block_for_pc (tloc->address), 1);
1556 old_chain = make_cleanup (free_current_contents, &exp);
1558 aexpr = gen_eval_for_expr (tloc->address, exp);
1559 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1562 report_agent_reqs_errors (aexpr);
1564 discard_cleanups (old_chain1);
1565 /* Even though we're not officially collecting, add
1566 to the collect list anyway. */
1567 add_aexpr (collect, aexpr);
1569 do_cleanups (old_chain);
1572 while (action_exp && *action_exp++ == ',');
1574 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1576 /* We check against nested while-stepping when setting
1577 breakpoint action, so no way to run into nested
1579 gdb_assert (stepping_list);
1581 encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
1582 frame_offset, stepping_list, NULL);
1585 error (_("Invalid tracepoint command '%s'"), action->line);
1589 /* Render all actions into gdb protocol. */
1592 encode_actions (struct breakpoint *t, struct bp_location *tloc,
1593 char ***tdp_actions, char ***stepping_actions)
1595 static char tdp_buff[2048], step_buff[2048];
1596 char *default_collect_line = NULL;
1597 struct command_line *actions;
1598 struct command_line *default_collect_action = NULL;
1600 LONGEST frame_offset;
1601 struct cleanup *back_to;
1603 back_to = make_cleanup (null_cleanup, NULL);
1605 clear_collection_list (&tracepoint_list);
1606 clear_collection_list (&stepping_list);
1608 *tdp_actions = NULL;
1609 *stepping_actions = NULL;
1611 gdbarch_virtual_frame_pointer (tloc->gdbarch,
1612 tloc->address, &frame_reg, &frame_offset);
1614 actions = breakpoint_commands (t);
1616 /* If there are default expressions to collect, make up a collect
1617 action and prepend to the action list to encode. Note that since
1618 validation is per-tracepoint (local var "xyz" might be valid for
1619 one tracepoint and not another, etc), we make up the action on
1620 the fly, and don't cache it. */
1621 if (*default_collect)
1625 default_collect_line = xstrprintf ("collect %s", default_collect);
1626 make_cleanup (xfree, default_collect_line);
1628 line = default_collect_line;
1629 validate_actionline (&line, t);
1631 default_collect_action = xmalloc (sizeof (struct command_line));
1632 make_cleanup (xfree, default_collect_action);
1633 default_collect_action->next = actions;
1634 default_collect_action->line = line;
1635 actions = default_collect_action;
1637 encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1638 &tracepoint_list, &stepping_list);
1640 memrange_sortmerge (&tracepoint_list);
1641 memrange_sortmerge (&stepping_list);
1643 *tdp_actions = stringify_collection_list (&tracepoint_list,
1645 *stepping_actions = stringify_collection_list (&stepping_list,
1648 do_cleanups (back_to);
1652 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1654 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1656 collect->aexpr_list =
1657 xrealloc (collect->aexpr_list,
1658 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1659 collect->aexpr_listsize *= 2;
1661 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1662 collect->next_aexpr_elt++;
1666 process_tracepoint_on_disconnect (void)
1668 VEC(breakpoint_p) *tp_vec = NULL;
1670 struct breakpoint *b;
1671 int has_pending_p = 0;
1673 /* Check whether we still have pending tracepoint. If we have, warn the
1674 user that pending tracepoint will no longer work. */
1675 tp_vec = all_tracepoints ();
1676 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1685 struct bp_location *loc1;
1687 for (loc1 = b->loc; loc1; loc1 = loc1->next)
1689 if (loc1->shlib_disabled)
1700 VEC_free (breakpoint_p, tp_vec);
1703 warning (_("Pending tracepoints will not be resolved while"
1704 " GDB is disconnected\n"));
1709 start_tracing (char *notes)
1711 VEC(breakpoint_p) *tp_vec = NULL;
1713 struct breakpoint *b;
1714 struct trace_state_variable *tsv;
1715 int any_enabled = 0, num_to_download = 0;
1718 tp_vec = all_tracepoints ();
1720 /* No point in tracing without any tracepoints... */
1721 if (VEC_length (breakpoint_p, tp_vec) == 0)
1723 VEC_free (breakpoint_p, tp_vec);
1724 error (_("No tracepoints defined, not starting trace"));
1727 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1729 struct tracepoint *t = (struct tracepoint *) b;
1730 struct bp_location *loc;
1732 if (b->enable_state == bp_enabled)
1735 if ((b->type == bp_fast_tracepoint
1736 ? may_insert_fast_tracepoints
1737 : may_insert_tracepoints))
1740 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1741 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1746 if (target_supports_enable_disable_tracepoint ())
1747 warning (_("No tracepoints enabled"));
1750 /* No point in tracing with only disabled tracepoints that
1751 cannot be re-enabled. */
1752 VEC_free (breakpoint_p, tp_vec);
1753 error (_("No tracepoints enabled, not starting trace"));
1757 if (num_to_download <= 0)
1759 VEC_free (breakpoint_p, tp_vec);
1760 error (_("No tracepoints that may be downloaded, not starting trace"));
1763 target_trace_init ();
1765 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1767 struct tracepoint *t = (struct tracepoint *) b;
1768 struct bp_location *loc;
1769 int bp_location_downloaded = 0;
1771 /* Clear `inserted' flag. */
1772 for (loc = b->loc; loc; loc = loc->next)
1775 if ((b->type == bp_fast_tracepoint
1776 ? !may_insert_fast_tracepoints
1777 : !may_insert_tracepoints))
1780 t->number_on_target = 0;
1782 for (loc = b->loc; loc; loc = loc->next)
1784 /* Since tracepoint locations are never duplicated, `inserted'
1785 flag should be zero. */
1786 gdb_assert (!loc->inserted);
1788 target_download_tracepoint (loc);
1791 bp_location_downloaded = 1;
1794 t->number_on_target = b->number;
1796 for (loc = b->loc; loc; loc = loc->next)
1797 if (loc->probe != NULL)
1798 loc->probe->pops->set_semaphore (loc->probe, loc->gdbarch);
1800 if (bp_location_downloaded)
1801 observer_notify_breakpoint_modified (b);
1803 VEC_free (breakpoint_p, tp_vec);
1805 /* Send down all the trace state variables too. */
1806 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1808 target_download_trace_state_variable (tsv);
1811 /* Tell target to treat text-like sections as transparent. */
1812 target_trace_set_readonly_regions ();
1813 /* Set some mode flags. */
1814 target_set_disconnected_tracing (disconnected_tracing);
1815 target_set_circular_trace_buffer (circular_trace_buffer);
1818 notes = trace_notes;
1819 ret = target_set_trace_notes (trace_user, notes, NULL);
1821 if (!ret && (trace_user || notes))
1822 warning (_("Target does not support trace user/notes, info ignored"));
1824 /* Now insert traps and begin collecting data. */
1825 target_trace_start ();
1827 /* Reset our local state. */
1828 set_traceframe_num (-1);
1829 set_tracepoint_num (-1);
1830 set_traceframe_context (NULL);
1831 current_trace_status()->running = 1;
1832 clear_traceframe_info ();
1835 /* The tstart command requests the target to start a new trace run.
1836 The command passes any arguments it has to the target verbatim, as
1837 an optional "trace note". This is useful as for instance a warning
1838 to other users if the trace runs disconnected, and you don't want
1839 anybody else messing with the target. */
1842 trace_start_command (char *args, int from_tty)
1844 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1846 if (current_trace_status ()->running)
1849 && !query (_("A trace is running already. Start a new run? ")))
1850 error (_("New trace run not started."));
1853 start_tracing (args);
1856 /* The tstop command stops the tracing run. The command passes any
1857 supplied arguments to the target verbatim as a "stop note"; if the
1858 target supports trace notes, then it will be reported back as part
1859 of the trace run's status. */
1862 trace_stop_command (char *args, int from_tty)
1864 if (!current_trace_status ()->running)
1865 error (_("Trace is not running."));
1867 stop_tracing (args);
1871 stop_tracing (char *note)
1874 VEC(breakpoint_p) *tp_vec = NULL;
1876 struct breakpoint *t;
1878 target_trace_stop ();
1880 tp_vec = all_tracepoints ();
1881 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1883 struct bp_location *loc;
1885 if ((t->type == bp_fast_tracepoint
1886 ? !may_insert_fast_tracepoints
1887 : !may_insert_tracepoints))
1890 for (loc = t->loc; loc; loc = loc->next)
1892 /* GDB can be totally absent in some disconnected trace scenarios,
1893 but we don't really care if this semaphore goes out of sync.
1894 That's why we are decrementing it here, but not taking care
1896 if (loc->probe != NULL)
1897 loc->probe->pops->clear_semaphore (loc->probe, loc->gdbarch);
1901 VEC_free (breakpoint_p, tp_vec);
1904 note = trace_stop_notes;
1905 ret = target_set_trace_notes (NULL, NULL, note);
1908 warning (_("Target does not support trace notes, note ignored"));
1910 /* Should change in response to reply? */
1911 current_trace_status ()->running = 0;
1914 /* tstatus command */
1916 trace_status_command (char *args, int from_tty)
1918 struct trace_status *ts = current_trace_status ();
1920 VEC(breakpoint_p) *tp_vec = NULL;
1921 struct breakpoint *t;
1923 status = target_get_trace_status (ts);
1928 printf_filtered (_("Using a trace file.\n"));
1931 printf_filtered (_("Trace can not be run on this target.\n"));
1936 if (!ts->running_known)
1938 printf_filtered (_("Run/stop status is unknown.\n"));
1940 else if (ts->running)
1942 printf_filtered (_("Trace is running on the target.\n"));
1946 switch (ts->stop_reason)
1948 case trace_never_run:
1949 printf_filtered (_("No trace has been run on the target.\n"));
1953 printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1956 printf_filtered (_("Trace stopped by a tstop command.\n"));
1958 case trace_buffer_full:
1959 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1961 case trace_disconnected:
1962 printf_filtered (_("Trace stopped because of disconnection.\n"));
1964 case tracepoint_passcount:
1965 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1966 ts->stopping_tracepoint);
1968 case tracepoint_error:
1969 if (ts->stopping_tracepoint)
1970 printf_filtered (_("Trace stopped by an "
1971 "error (%s, tracepoint %d).\n"),
1972 ts->stop_desc, ts->stopping_tracepoint);
1974 printf_filtered (_("Trace stopped by an error (%s).\n"),
1977 case trace_stop_reason_unknown:
1978 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1981 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1987 if (ts->traceframes_created >= 0
1988 && ts->traceframe_count != ts->traceframes_created)
1990 printf_filtered (_("Buffer contains %d trace "
1991 "frames (of %d created total).\n"),
1992 ts->traceframe_count, ts->traceframes_created);
1994 else if (ts->traceframe_count >= 0)
1996 printf_filtered (_("Collected %d trace frames.\n"),
1997 ts->traceframe_count);
2000 if (ts->buffer_free >= 0)
2002 if (ts->buffer_size >= 0)
2004 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
2005 ts->buffer_free, ts->buffer_size);
2006 if (ts->buffer_size > 0)
2007 printf_filtered (_(" (%d%% full)"),
2008 ((int) ((((long long) (ts->buffer_size
2009 - ts->buffer_free)) * 100)
2010 / ts->buffer_size)));
2011 printf_filtered (_(".\n"));
2014 printf_filtered (_("Trace buffer has %d bytes free.\n"),
2018 if (ts->disconnected_tracing)
2019 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
2021 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
2023 if (ts->circular_buffer)
2024 printf_filtered (_("Trace buffer is circular.\n"));
2026 if (ts->user_name && strlen (ts->user_name) > 0)
2027 printf_filtered (_("Trace user is %s.\n"), ts->user_name);
2029 if (ts->notes && strlen (ts->notes) > 0)
2030 printf_filtered (_("Trace notes: %s.\n"), ts->notes);
2032 /* Now report on what we're doing with tfind. */
2033 if (traceframe_number >= 0)
2034 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
2035 traceframe_number, tracepoint_number);
2037 printf_filtered (_("Not looking at any trace frame.\n"));
2039 /* Report start/stop times if supplied. */
2044 LONGEST run_time = ts->stop_time - ts->start_time;
2046 /* Reporting a run time is more readable than two long numbers. */
2047 printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
2048 (long int) ts->start_time / 1000000,
2049 (long int) ts->start_time % 1000000,
2050 (long int) run_time / 1000000,
2051 (long int) run_time % 1000000);
2054 printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
2055 (long int) ts->start_time / 1000000,
2056 (long int) ts->start_time % 1000000);
2058 else if (ts->stop_time)
2059 printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
2060 (long int) ts->stop_time / 1000000,
2061 (long int) ts->stop_time % 1000000);
2063 /* Now report any per-tracepoint status available. */
2064 tp_vec = all_tracepoints ();
2066 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
2067 target_get_tracepoint_status (t, NULL);
2069 VEC_free (breakpoint_p, tp_vec);
2072 /* Report the trace status to uiout, in a way suitable for MI, and not
2073 suitable for CLI. If ON_STOP is true, suppress a few fields that
2074 are not meaningful in the -trace-stop response.
2076 The implementation is essentially parallel to trace_status_command, but
2077 merging them will result in unreadable code. */
2079 trace_status_mi (int on_stop)
2081 struct ui_out *uiout = current_uiout;
2082 struct trace_status *ts = current_trace_status ();
2085 status = target_get_trace_status (ts);
2087 if (status == -1 && !ts->from_file)
2089 ui_out_field_string (uiout, "supported", "0");
2094 ui_out_field_string (uiout, "supported", "file");
2096 ui_out_field_string (uiout, "supported", "1");
2098 gdb_assert (ts->running_known);
2102 ui_out_field_string (uiout, "running", "1");
2104 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
2105 Given that the frontend gets the status either on -trace-stop, or from
2106 -trace-status after re-connection, it does not seem like this
2107 information is necessary for anything. It is not necessary for either
2108 figuring the vital state of the target nor for navigation of trace
2109 frames. If the frontend wants to show the current state is some
2110 configure dialog, it can request the value when such dialog is
2111 invoked by the user. */
2115 char *stop_reason = NULL;
2116 int stopping_tracepoint = -1;
2119 ui_out_field_string (uiout, "running", "0");
2121 if (ts->stop_reason != trace_stop_reason_unknown)
2123 switch (ts->stop_reason)
2126 stop_reason = "request";
2128 case trace_buffer_full:
2129 stop_reason = "overflow";
2131 case trace_disconnected:
2132 stop_reason = "disconnection";
2134 case tracepoint_passcount:
2135 stop_reason = "passcount";
2136 stopping_tracepoint = ts->stopping_tracepoint;
2138 case tracepoint_error:
2139 stop_reason = "error";
2140 stopping_tracepoint = ts->stopping_tracepoint;
2146 ui_out_field_string (uiout, "stop-reason", stop_reason);
2147 if (stopping_tracepoint != -1)
2148 ui_out_field_int (uiout, "stopping-tracepoint",
2149 stopping_tracepoint);
2150 if (ts->stop_reason == tracepoint_error)
2151 ui_out_field_string (uiout, "error-description",
2157 if (ts->traceframe_count != -1)
2158 ui_out_field_int (uiout, "frames", ts->traceframe_count);
2159 if (ts->traceframes_created != -1)
2160 ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
2161 if (ts->buffer_size != -1)
2162 ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
2163 if (ts->buffer_free != -1)
2164 ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
2166 ui_out_field_int (uiout, "disconnected", ts->disconnected_tracing);
2167 ui_out_field_int (uiout, "circular", ts->circular_buffer);
2169 ui_out_field_string (uiout, "user-name", ts->user_name);
2170 ui_out_field_string (uiout, "notes", ts->notes);
2175 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2176 (long int) ts->start_time / 1000000,
2177 (long int) ts->start_time % 1000000);
2178 ui_out_field_string (uiout, "start-time", buf);
2179 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2180 (long int) ts->stop_time / 1000000,
2181 (long int) ts->stop_time % 1000000);
2182 ui_out_field_string (uiout, "stop-time", buf);
2186 /* This function handles the details of what to do about an ongoing
2187 tracing run if the user has asked to detach or otherwise disconnect
2190 disconnect_tracing (int from_tty)
2192 /* It can happen that the target that was tracing went away on its
2193 own, and we didn't notice. Get a status update, and if the
2194 current target doesn't even do tracing, then assume it's not
2196 if (target_get_trace_status (current_trace_status ()) < 0)
2197 current_trace_status ()->running = 0;
2199 /* If running interactively, give the user the option to cancel and
2200 then decide what to do differently with the run. Scripts are
2201 just going to disconnect and let the target deal with it,
2202 according to how it's been instructed previously via
2203 disconnected-tracing. */
2204 if (current_trace_status ()->running && from_tty)
2206 process_tracepoint_on_disconnect ();
2208 if (current_trace_status ()->disconnected_tracing)
2210 if (!query (_("Trace is running and will "
2211 "continue after detach; detach anyway? ")))
2212 error (_("Not confirmed."));
2216 if (!query (_("Trace is running but will "
2217 "stop on detach; detach anyway? ")))
2218 error (_("Not confirmed."));
2222 /* Also we want to be out of tfind mode, otherwise things can get
2223 confusing upon reconnection. Just use these calls instead of
2224 full tfind_1 behavior because we're in the middle of detaching,
2225 and there's no point to updating current stack frame etc. */
2226 set_current_traceframe (-1);
2227 set_tracepoint_num (-1);
2228 set_traceframe_context (NULL);
2231 /* Worker function for the various flavors of the tfind command. */
2233 tfind_1 (enum trace_find_type type, int num,
2234 ULONGEST addr1, ULONGEST addr2,
2237 int target_frameno = -1, target_tracept = -1;
2238 struct frame_id old_frame_id = null_frame_id;
2239 struct tracepoint *tp;
2240 struct ui_out *uiout = current_uiout;
2242 /* Only try to get the current stack frame if we have a chance of
2243 succeeding. In particular, if we're trying to get a first trace
2244 frame while all threads are running, it's not going to succeed,
2245 so leave it with a default value and let the frame comparison
2246 below (correctly) decide to print out the source location of the
2248 if (!(type == tfind_number && num == -1)
2249 && (has_stack_frames () || traceframe_number >= 0))
2250 old_frame_id = get_frame_id (get_current_frame ());
2252 target_frameno = target_trace_find (type, num, addr1, addr2,
2255 if (type == tfind_number
2257 && target_frameno == -1)
2259 /* We told the target to get out of tfind mode, and it did. */
2261 else if (target_frameno == -1)
2263 /* A request for a non-existent trace frame has failed.
2264 Our response will be different, depending on FROM_TTY:
2266 If FROM_TTY is true, meaning that this command was
2267 typed interactively by the user, then give an error
2268 and DO NOT change the state of traceframe_number etc.
2270 However if FROM_TTY is false, meaning that we're either
2271 in a script, a loop, or a user-defined command, then
2272 DON'T give an error, but DO change the state of
2273 traceframe_number etc. to invalid.
2275 The rationalle is that if you typed the command, you
2276 might just have committed a typo or something, and you'd
2277 like to NOT lose your current debugging state. However
2278 if you're in a user-defined command or especially in a
2279 loop, then you need a way to detect that the command
2280 failed WITHOUT aborting. This allows you to write
2281 scripts that search thru the trace buffer until the end,
2282 and then continue on to do something else. */
2285 error (_("Target failed to find requested trace frame."));
2289 printf_filtered ("End of trace buffer.\n");
2290 #if 0 /* dubious now? */
2291 /* The following will not recurse, since it's
2293 trace_find_command ("-1", from_tty);
2298 tp = get_tracepoint_by_number_on_target (target_tracept);
2300 reinit_frame_cache ();
2301 target_dcache_invalidate ();
2303 set_tracepoint_num (tp ? tp->base.number : target_tracept);
2305 if (target_frameno != get_traceframe_number ())
2306 observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2308 set_current_traceframe (target_frameno);
2310 if (target_frameno == -1)
2311 set_traceframe_context (NULL);
2313 set_traceframe_context (get_current_frame ());
2315 if (traceframe_number >= 0)
2317 /* Use different branches for MI and CLI to make CLI messages
2319 if (ui_out_is_mi_like_p (uiout))
2321 ui_out_field_string (uiout, "found", "1");
2322 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2323 ui_out_field_int (uiout, "traceframe", traceframe_number);
2327 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2328 traceframe_number, tracepoint_number);
2333 if (ui_out_is_mi_like_p (uiout))
2334 ui_out_field_string (uiout, "found", "0");
2335 else if (type == tfind_number && num == -1)
2336 printf_unfiltered (_("No longer looking at any trace frame\n"));
2337 else /* This case may never occur, check. */
2338 printf_unfiltered (_("No trace frame found\n"));
2341 /* If we're in nonstop mode and getting out of looking at trace
2342 frames, there won't be any current frame to go back to and
2345 && (has_stack_frames () || traceframe_number >= 0))
2347 enum print_what print_what;
2349 /* NOTE: in imitation of the step command, try to determine
2350 whether we have made a transition from one function to
2351 another. If so, we'll print the "stack frame" (ie. the new
2352 function and it's arguments) -- otherwise we'll just show the
2355 if (frame_id_eq (old_frame_id,
2356 get_frame_id (get_current_frame ())))
2357 print_what = SRC_LINE;
2359 print_what = SRC_AND_LOC;
2361 print_stack_frame (get_selected_frame (NULL), 1, print_what);
2366 /* trace_find_command takes a trace frame number n,
2367 sends "QTFrame:<n>" to the target,
2368 and accepts a reply that may contain several optional pieces
2369 of information: a frame number, a tracepoint number, and an
2370 indication of whether this is a trap frame or a stepping frame.
2372 The minimal response is just "OK" (which indicates that the
2373 target does not give us a frame number or a tracepoint number).
2374 Instead of that, the target may send us a string containing
2376 F<hexnum> (gives the selected frame number)
2377 T<hexnum> (gives the selected tracepoint number)
2382 trace_find_command (char *args, int from_tty)
2383 { /* This should only be called with a numeric argument. */
2386 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2387 error (_("May not look at trace frames while trace is running."));
2389 if (args == 0 || *args == 0)
2390 { /* TFIND with no args means find NEXT trace frame. */
2391 if (traceframe_number == -1)
2392 frameno = 0; /* "next" is first one. */
2394 frameno = traceframe_number + 1;
2396 else if (0 == strcmp (args, "-"))
2398 if (traceframe_number == -1)
2399 error (_("not debugging trace buffer"));
2400 else if (from_tty && traceframe_number == 0)
2401 error (_("already at start of trace buffer"));
2403 frameno = traceframe_number - 1;
2405 /* A hack to work around eval's need for fp to have been collected. */
2406 else if (0 == strcmp (args, "-1"))
2409 frameno = parse_and_eval_long (args);
2412 error (_("invalid input (%d is less than zero)"), frameno);
2414 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2419 trace_find_end_command (char *args, int from_tty)
2421 trace_find_command ("-1", from_tty);
2426 trace_find_start_command (char *args, int from_tty)
2428 trace_find_command ("0", from_tty);
2431 /* tfind pc command */
2433 trace_find_pc_command (char *args, int from_tty)
2437 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2438 error (_("May not look at trace frames while trace is running."));
2440 if (args == 0 || *args == 0)
2441 pc = regcache_read_pc (get_current_regcache ());
2443 pc = parse_and_eval_address (args);
2445 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2448 /* tfind tracepoint command */
2450 trace_find_tracepoint_command (char *args, int from_tty)
2453 struct tracepoint *tp;
2455 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2456 error (_("May not look at trace frames while trace is running."));
2458 if (args == 0 || *args == 0)
2460 if (tracepoint_number == -1)
2461 error (_("No current tracepoint -- please supply an argument."));
2463 tdp = tracepoint_number; /* Default is current TDP. */
2466 tdp = parse_and_eval_long (args);
2468 /* If we have the tracepoint on hand, use the number that the
2469 target knows about (which may be different if we disconnected
2470 and reconnected). */
2471 tp = get_tracepoint (tdp);
2473 tdp = tp->number_on_target;
2475 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2478 /* TFIND LINE command:
2480 This command will take a sourceline for argument, just like BREAK
2481 or TRACE (ie. anything that "decode_line_1" can handle).
2483 With no argument, this command will find the next trace frame
2484 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2487 trace_find_line_command (char *args, int from_tty)
2489 static CORE_ADDR start_pc, end_pc;
2490 struct symtabs_and_lines sals;
2491 struct symtab_and_line sal;
2492 struct cleanup *old_chain;
2494 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2495 error (_("May not look at trace frames while trace is running."));
2497 if (args == 0 || *args == 0)
2499 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2501 sals.sals = (struct symtab_and_line *)
2502 xmalloc (sizeof (struct symtab_and_line));
2507 sals = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2511 old_chain = make_cleanup (xfree, sals.sals);
2512 if (sal.symtab == 0)
2513 error (_("No line number information available."));
2515 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2517 if (start_pc == end_pc)
2519 printf_filtered ("Line %d of \"%s\"",
2520 sal.line, sal.symtab->filename);
2522 printf_filtered (" is at address ");
2523 print_address (get_current_arch (), start_pc, gdb_stdout);
2525 printf_filtered (" but contains no code.\n");
2526 sal = find_pc_line (start_pc, 0);
2528 && find_line_pc_range (sal, &start_pc, &end_pc)
2529 && start_pc != end_pc)
2530 printf_filtered ("Attempting to find line %d instead.\n",
2533 error (_("Cannot find a good line."));
2537 /* Is there any case in which we get here, and have an address
2538 which the user would want to see? If we have debugging
2539 symbols and no line numbers? */
2540 error (_("Line number %d is out of range for \"%s\"."),
2541 sal.line, sal.symtab->filename);
2543 /* Find within range of stated line. */
2545 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2547 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2548 do_cleanups (old_chain);
2551 /* tfind range command */
2553 trace_find_range_command (char *args, int from_tty)
2555 static CORE_ADDR start, stop;
2558 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2559 error (_("May not look at trace frames while trace is running."));
2561 if (args == 0 || *args == 0)
2562 { /* XXX FIXME: what should default behavior be? */
2563 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2567 if (0 != (tmp = strchr (args, ',')))
2569 *tmp++ = '\0'; /* Terminate start address. */
2570 while (isspace ((int) *tmp))
2572 start = parse_and_eval_address (args);
2573 stop = parse_and_eval_address (tmp);
2576 { /* No explicit end address? */
2577 start = parse_and_eval_address (args);
2578 stop = start + 1; /* ??? */
2581 tfind_1 (tfind_range, 0, start, stop, from_tty);
2584 /* tfind outside command */
2586 trace_find_outside_command (char *args, int from_tty)
2588 CORE_ADDR start, stop;
2591 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2592 error (_("May not look at trace frames while trace is running."));
2594 if (args == 0 || *args == 0)
2595 { /* XXX FIXME: what should default behavior be? */
2596 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2600 if (0 != (tmp = strchr (args, ',')))
2602 *tmp++ = '\0'; /* Terminate start address. */
2603 while (isspace ((int) *tmp))
2605 start = parse_and_eval_address (args);
2606 stop = parse_and_eval_address (tmp);
2609 { /* No explicit end address? */
2610 start = parse_and_eval_address (args);
2611 stop = start + 1; /* ??? */
2614 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2617 /* info scope command: list the locals for a scope. */
2619 scope_info (char *args, int from_tty)
2621 struct symtabs_and_lines sals;
2623 struct minimal_symbol *msym;
2624 struct block *block;
2625 const char *symname;
2626 char *save_args = args;
2627 struct block_iterator iter;
2629 struct gdbarch *gdbarch;
2632 if (args == 0 || *args == 0)
2633 error (_("requires an argument (function, "
2634 "line or *addr) to define a scope"));
2636 sals = decode_line_1 (&args, DECODE_LINE_FUNFIRSTLINE, NULL, 0);
2637 if (sals.nelts == 0)
2638 return; /* Presumably decode_line_1 has already warned. */
2640 /* Resolve line numbers to PC. */
2641 resolve_sal_pc (&sals.sals[0]);
2642 block = block_for_pc (sals.sals[0].pc);
2646 QUIT; /* Allow user to bail out with ^C. */
2647 ALL_BLOCK_SYMBOLS (block, iter, sym)
2649 QUIT; /* Allow user to bail out with ^C. */
2651 printf_filtered ("Scope for %s:\n", save_args);
2654 symname = SYMBOL_PRINT_NAME (sym);
2655 if (symname == NULL || *symname == '\0')
2656 continue; /* Probably botched, certainly useless. */
2658 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2660 printf_filtered ("Symbol %s is ", symname);
2661 switch (SYMBOL_CLASS (sym))
2664 case LOC_UNDEF: /* Messed up symbol? */
2665 printf_filtered ("a bogus symbol, class %d.\n",
2666 SYMBOL_CLASS (sym));
2667 count--; /* Don't count this one. */
2670 printf_filtered ("a constant with value %s (%s)",
2671 plongest (SYMBOL_VALUE (sym)),
2672 hex_string (SYMBOL_VALUE (sym)));
2674 case LOC_CONST_BYTES:
2675 printf_filtered ("constant bytes: ");
2676 if (SYMBOL_TYPE (sym))
2677 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2678 fprintf_filtered (gdb_stdout, " %02x",
2679 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2682 printf_filtered ("in static storage at address ");
2683 printf_filtered ("%s", paddress (gdbarch,
2684 SYMBOL_VALUE_ADDRESS (sym)));
2687 /* GDBARCH is the architecture associated with the objfile
2688 the symbol is defined in; the target architecture may be
2689 different, and may provide additional registers. However,
2690 we do not know the target architecture at this point.
2691 We assume the objfile architecture will contain all the
2692 standard registers that occur in debug info in that
2694 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2697 if (SYMBOL_IS_ARGUMENT (sym))
2698 printf_filtered ("an argument in register $%s",
2699 gdbarch_register_name (gdbarch, regno));
2701 printf_filtered ("a local variable in register $%s",
2702 gdbarch_register_name (gdbarch, regno));
2705 printf_filtered ("an argument at stack/frame offset %s",
2706 plongest (SYMBOL_VALUE (sym)));
2709 printf_filtered ("a local variable at frame offset %s",
2710 plongest (SYMBOL_VALUE (sym)));
2713 printf_filtered ("a reference argument at offset %s",
2714 plongest (SYMBOL_VALUE (sym)));
2716 case LOC_REGPARM_ADDR:
2717 /* Note comment at LOC_REGISTER. */
2718 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2720 printf_filtered ("the address of an argument, in register $%s",
2721 gdbarch_register_name (gdbarch, regno));
2724 printf_filtered ("a typedef.\n");
2727 printf_filtered ("a label at address ");
2728 printf_filtered ("%s", paddress (gdbarch,
2729 SYMBOL_VALUE_ADDRESS (sym)));
2732 printf_filtered ("a function at address ");
2733 printf_filtered ("%s",
2734 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2736 case LOC_UNRESOLVED:
2737 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2740 printf_filtered ("Unresolved Static");
2743 printf_filtered ("static storage at address ");
2744 printf_filtered ("%s",
2745 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2748 case LOC_OPTIMIZED_OUT:
2749 printf_filtered ("optimized out.\n");
2752 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2753 BLOCK_START (block),
2757 if (SYMBOL_TYPE (sym))
2758 printf_filtered (", length %d.\n",
2759 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2761 if (BLOCK_FUNCTION (block))
2764 block = BLOCK_SUPERBLOCK (block);
2767 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2771 /* worker function (cleanup) */
2773 replace_comma (void *data)
2780 /* Helper for trace_dump_command. Dump the action list starting at
2781 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2782 actions of the body of a while-stepping action. STEPPING_FRAME is
2783 set if the current traceframe was determined to be a while-stepping
2787 trace_dump_actions (struct command_line *action,
2788 int stepping_actions, int stepping_frame,
2791 char *action_exp, *next_comma;
2793 for (; action != NULL; action = action->next)
2795 struct cmd_list_element *cmd;
2797 QUIT; /* Allow user to bail out with ^C. */
2798 action_exp = action->line;
2799 while (isspace ((int) *action_exp))
2802 /* The collection actions to be done while stepping are
2803 bracketed by the commands "while-stepping" and "end". */
2805 if (*action_exp == '#') /* comment line */
2808 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2810 error (_("Bad action list item: %s"), action_exp);
2812 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2816 for (i = 0; i < action->body_count; ++i)
2817 trace_dump_actions (action->body_list[i],
2818 1, stepping_frame, from_tty);
2820 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2822 /* Display the collected data.
2823 For the trap frame, display only what was collected at
2824 the trap. Likewise for stepping frames, display only
2825 what was collected while stepping. This means that the
2826 two boolean variables, STEPPING_FRAME and
2827 STEPPING_ACTIONS should be equal. */
2828 if (stepping_frame == stepping_actions)
2830 if (*action_exp == '/')
2831 action_exp = decode_agent_options (action_exp);
2834 { /* Repeat over a comma-separated list. */
2835 QUIT; /* Allow user to bail out with ^C. */
2836 if (*action_exp == ',')
2838 while (isspace ((int) *action_exp))
2841 next_comma = strchr (action_exp, ',');
2843 if (0 == strncasecmp (action_exp, "$reg", 4))
2844 registers_info (NULL, from_tty);
2845 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2847 else if (0 == strncasecmp (action_exp, "$loc", 4))
2848 locals_info (NULL, from_tty);
2849 else if (0 == strncasecmp (action_exp, "$arg", 4))
2850 args_info (NULL, from_tty);
2855 make_cleanup (replace_comma, next_comma);
2858 printf_filtered ("%s = ", action_exp);
2859 output_command (action_exp, from_tty);
2860 printf_filtered ("\n");
2864 action_exp = next_comma;
2866 while (action_exp && *action_exp == ',');
2872 /* The tdump command. */
2875 trace_dump_command (char *args, int from_tty)
2877 struct regcache *regcache;
2878 struct tracepoint *t;
2879 int stepping_frame = 0;
2880 struct bp_location *loc;
2881 char *line, *default_collect_line = NULL;
2882 struct command_line *actions, *default_collect_action = NULL;
2883 struct cleanup *old_chain = NULL;
2885 if (tracepoint_number == -1)
2887 warning (_("No current trace frame."));
2891 t = get_tracepoint (tracepoint_number);
2894 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2897 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2898 tracepoint_number, traceframe_number);
2900 /* The current frame is a trap frame if the frame PC is equal
2901 to the tracepoint PC. If not, then the current frame was
2902 collected during single-stepping. */
2904 regcache = get_current_regcache ();
2906 /* If the traceframe's address matches any of the tracepoint's
2907 locations, assume it is a direct hit rather than a while-stepping
2908 frame. (FIXME this is not reliable, should record each frame's
2911 for (loc = t->base.loc; loc; loc = loc->next)
2912 if (loc->address == regcache_read_pc (regcache))
2915 actions = breakpoint_commands (&t->base);
2917 /* If there is a default-collect list, make up a collect command,
2918 prepend to the tracepoint's commands, and pass the whole mess to
2919 the trace dump scanner. We need to validate because
2920 default-collect might have been junked since the trace run. */
2921 if (*default_collect)
2923 default_collect_line = xstrprintf ("collect %s", default_collect);
2924 old_chain = make_cleanup (xfree, default_collect_line);
2925 line = default_collect_line;
2926 validate_actionline (&line, &t->base);
2927 default_collect_action = xmalloc (sizeof (struct command_line));
2928 make_cleanup (xfree, default_collect_action);
2929 default_collect_action->next = actions;
2930 default_collect_action->line = line;
2931 actions = default_collect_action;
2934 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2936 if (*default_collect)
2937 do_cleanups (old_chain);
2940 /* Encode a piece of a tracepoint's source-level definition in a form
2941 that is suitable for both protocol and saving in files. */
2942 /* This version does not do multiple encodes for long strings; it should
2943 return an offset to the next piece to encode. FIXME */
2946 encode_source_string (int tpnum, ULONGEST addr,
2947 char *srctype, char *src, char *buf, int buf_size)
2949 if (80 + strlen (srctype) > buf_size)
2950 error (_("Buffer too small for source encoding"));
2951 sprintf (buf, "%x:%s:%s:%x:%x:",
2952 tpnum, phex_nz (addr, sizeof (addr)),
2953 srctype, 0, (int) strlen (src));
2954 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2955 error (_("Source string too long for buffer"));
2956 bin2hex (src, buf + strlen (buf), 0);
2960 extern int trace_regblock_size;
2962 /* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2963 non-zero, the save is performed on the target, otherwise GDB obtains all
2964 trace data and saves it locally. */
2967 trace_save (const char *filename, int target_does_save)
2969 struct cleanup *cleanup;
2971 struct trace_status *ts = current_trace_status ();
2974 struct uploaded_tp *uploaded_tps = NULL, *utp;
2975 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2979 ULONGEST offset = 0;
2980 #define MAX_TRACE_UPLOAD 2000
2981 gdb_byte buf[MAX_TRACE_UPLOAD];
2984 /* If the target is to save the data to a file on its own, then just
2985 send the command and be done with it. */
2986 if (target_does_save)
2988 err = target_save_trace_data (filename);
2990 error (_("Target failed to save trace data to '%s'."),
2995 /* Get the trace status first before opening the file, so if the
2996 target is losing, we can get out without touching files. */
2997 status = target_get_trace_status (ts);
2999 pathname = tilde_expand (filename);
3000 cleanup = make_cleanup (xfree, pathname);
3002 fp = fopen (pathname, "wb");
3004 error (_("Unable to open file '%s' for saving trace data (%s)"),
3005 filename, safe_strerror (errno));
3006 make_cleanup_fclose (fp);
3008 /* Write a file header, with a high-bit-set char to indicate a
3009 binary file, plus a hint as what this file is, and a version
3010 number in case of future needs. */
3011 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
3013 perror_with_name (pathname);
3015 /* Write descriptive info. */
3017 /* Write out the size of a register block. */
3018 fprintf (fp, "R %x\n", trace_regblock_size);
3020 /* Write out status of the tracing run (aka "tstatus" info). */
3021 fprintf (fp, "status %c;%s",
3022 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
3023 if (ts->stop_reason == tracepoint_error)
3025 char *buf = (char *) alloca (strlen (ts->stop_desc) * 2 + 1);
3027 bin2hex ((gdb_byte *) ts->stop_desc, buf, 0);
3028 fprintf (fp, ":%s", buf);
3030 fprintf (fp, ":%x", ts->stopping_tracepoint);
3031 if (ts->traceframe_count >= 0)
3032 fprintf (fp, ";tframes:%x", ts->traceframe_count);
3033 if (ts->traceframes_created >= 0)
3034 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
3035 if (ts->buffer_free >= 0)
3036 fprintf (fp, ";tfree:%x", ts->buffer_free);
3037 if (ts->buffer_size >= 0)
3038 fprintf (fp, ";tsize:%x", ts->buffer_size);
3039 if (ts->disconnected_tracing)
3040 fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
3041 if (ts->circular_buffer)
3042 fprintf (fp, ";circular:%x", ts->circular_buffer);
3045 /* Note that we want to upload tracepoints and save those, rather
3046 than simply writing out the local ones, because the user may have
3047 changed tracepoints in GDB in preparation for a future tracing
3048 run, or maybe just mass-deleted all types of breakpoints as part
3049 of cleaning up. So as not to contaminate the session, leave the
3050 data in its uploaded form, don't make into real tracepoints. */
3052 /* Get trace state variables first, they may be checked when parsing
3053 uploaded commands. */
3055 target_upload_trace_state_variables (&uploaded_tsvs);
3057 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
3063 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
3064 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
3067 fprintf (fp, "tsv %x:%s:%x:%s\n",
3068 utsv->number, phex_nz (utsv->initial_value, 8),
3069 utsv->builtin, buf);
3075 free_uploaded_tsvs (&uploaded_tsvs);
3077 target_upload_tracepoints (&uploaded_tps);
3079 for (utp = uploaded_tps; utp; utp = utp->next)
3080 target_get_tracepoint_status (NULL, utp);
3082 for (utp = uploaded_tps; utp; utp = utp->next)
3084 fprintf (fp, "tp T%x:%s:%c:%x:%x",
3085 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3086 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
3087 if (utp->type == bp_fast_tracepoint)
3088 fprintf (fp, ":F%x", utp->orig_size);
3090 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
3093 for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
3094 fprintf (fp, "tp A%x:%s:%s\n",
3095 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3096 for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
3097 fprintf (fp, "tp S%x:%s:%s\n",
3098 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3101 encode_source_string (utp->number, utp->addr,
3102 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
3103 fprintf (fp, "tp Z%s\n", buf);
3105 if (utp->cond_string)
3107 encode_source_string (utp->number, utp->addr,
3108 "cond", utp->cond_string,
3109 buf, MAX_TRACE_UPLOAD);
3110 fprintf (fp, "tp Z%s\n", buf);
3112 for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
3114 encode_source_string (utp->number, utp->addr, "cmd", act,
3115 buf, MAX_TRACE_UPLOAD);
3116 fprintf (fp, "tp Z%s\n", buf);
3118 fprintf (fp, "tp V%x:%s:%x:%s\n",
3119 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3121 phex_nz (utp->traceframe_usage,
3122 sizeof (utp->traceframe_usage)));
3125 free_uploaded_tps (&uploaded_tps);
3127 /* Mark the end of the definition section. */
3130 /* Get and write the trace data proper. We ask for big blocks, in
3131 the hopes of efficiency, but will take less if the target has
3132 packet size limitations or some such. */
3135 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
3137 error (_("Failure to get requested trace buffer data"));
3138 /* No more data is forthcoming, we're done. */
3141 written = fwrite (buf, gotten, 1, fp);
3143 perror_with_name (pathname);
3147 /* Mark the end of trace data. (We know that gotten is 0 at this point.) */
3148 written = fwrite (&gotten, 4, 1, fp);
3150 perror_with_name (pathname);
3152 do_cleanups (cleanup);
3156 trace_save_command (char *args, int from_tty)
3158 int target_does_save = 0;
3160 char *filename = NULL;
3161 struct cleanup *back_to;
3164 error_no_arg (_("file in which to save trace data"));
3166 argv = gdb_buildargv (args);
3167 back_to = make_cleanup_freeargv (argv);
3169 for (; *argv; ++argv)
3171 if (strcmp (*argv, "-r") == 0)
3172 target_does_save = 1;
3173 else if (**argv == '-')
3174 error (_("unknown option `%s'"), *argv);
3180 error_no_arg (_("file in which to save trace data"));
3182 trace_save (filename, target_does_save);
3185 printf_filtered (_("Trace data saved to file '%s'.\n"), filename);
3187 do_cleanups (back_to);
3190 /* Tell the target what to do with an ongoing tracing run if GDB
3191 disconnects for some reason. */
3194 set_disconnected_tracing (char *args, int from_tty,
3195 struct cmd_list_element *c)
3197 target_set_disconnected_tracing (disconnected_tracing);
3201 set_circular_trace_buffer (char *args, int from_tty,
3202 struct cmd_list_element *c)
3204 target_set_circular_trace_buffer (circular_trace_buffer);
3208 set_trace_user (char *args, int from_tty,
3209 struct cmd_list_element *c)
3213 ret = target_set_trace_notes (trace_user, NULL, NULL);
3216 warning (_("Target does not support trace notes, user ignored"));
3220 set_trace_notes (char *args, int from_tty,
3221 struct cmd_list_element *c)
3225 ret = target_set_trace_notes (NULL, trace_notes, NULL);
3228 warning (_("Target does not support trace notes, note ignored"));
3232 set_trace_stop_notes (char *args, int from_tty,
3233 struct cmd_list_element *c)
3237 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
3240 warning (_("Target does not support trace notes, stop note ignored"));
3243 /* Convert the memory pointed to by mem into hex, placing result in buf.
3244 * Return a pointer to the last char put in buf (null)
3245 * "stolen" from sparc-stub.c
3248 static const char hexchars[] = "0123456789abcdef";
3251 mem2hex (gdb_byte *mem, char *buf, int count)
3259 *buf++ = hexchars[ch >> 4];
3260 *buf++ = hexchars[ch & 0xf];
3269 get_traceframe_number (void)
3271 return traceframe_number;
3274 /* Make the traceframe NUM be the current trace frame. Does nothing
3275 if NUM is already current. */
3278 set_current_traceframe (int num)
3282 if (traceframe_number == num)
3284 /* Nothing to do. */
3288 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3291 warning (_("could not change traceframe"));
3293 set_traceframe_num (newnum);
3295 /* Changing the traceframe changes our view of registers and of the
3297 registers_changed ();
3299 clear_traceframe_info ();
3302 /* Make the traceframe NUM be the current trace frame, and do nothing
3306 set_traceframe_number (int num)
3308 traceframe_number = num;
3311 /* A cleanup used when switching away and back from tfind mode. */
3313 struct current_traceframe_cleanup
3315 /* The traceframe we were inspecting. */
3316 int traceframe_number;
3320 do_restore_current_traceframe_cleanup (void *arg)
3322 struct current_traceframe_cleanup *old = arg;
3324 set_current_traceframe (old->traceframe_number);
3328 restore_current_traceframe_cleanup_dtor (void *arg)
3330 struct current_traceframe_cleanup *old = arg;
3336 make_cleanup_restore_current_traceframe (void)
3338 struct current_traceframe_cleanup *old;
3340 old = xmalloc (sizeof (struct current_traceframe_cleanup));
3341 old->traceframe_number = traceframe_number;
3343 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3344 restore_current_traceframe_cleanup_dtor);
3348 make_cleanup_restore_traceframe_number (void)
3350 return make_cleanup_restore_integer (&traceframe_number);
3353 /* Given a number and address, return an uploaded tracepoint with that
3354 number, creating if necessary. */
3356 struct uploaded_tp *
3357 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3359 struct uploaded_tp *utp;
3361 for (utp = *utpp; utp; utp = utp->next)
3362 if (utp->number == num && utp->addr == addr)
3364 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3365 memset (utp, 0, sizeof (struct uploaded_tp));
3368 utp->actions = NULL;
3369 utp->step_actions = NULL;
3370 utp->cmd_strings = NULL;
3377 free_uploaded_tps (struct uploaded_tp **utpp)
3379 struct uploaded_tp *next_one;
3383 next_one = (*utpp)->next;
3389 /* Given a number and address, return an uploaded tracepoint with that
3390 number, creating if necessary. */
3392 static struct uploaded_tsv *
3393 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3395 struct uploaded_tsv *utsv;
3397 for (utsv = *utsvp; utsv; utsv = utsv->next)
3398 if (utsv->number == num)
3400 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3401 memset (utsv, 0, sizeof (struct uploaded_tsv));
3403 utsv->next = *utsvp;
3409 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3411 struct uploaded_tsv *next_one;
3415 next_one = (*utsvp)->next;
3421 /* FIXME this function is heuristic and will miss the cases where the
3422 conditional is semantically identical but differs in whitespace,
3423 such as "x == 0" vs "x==0". */
3426 cond_string_is_same (char *str1, char *str2)
3428 if (str1 == NULL || str2 == NULL)
3429 return (str1 == str2);
3431 return (strcmp (str1, str2) == 0);
3434 /* Look for an existing tracepoint that seems similar enough to the
3435 uploaded one. Enablement isn't compared, because the user can
3436 toggle that freely, and may have done so in anticipation of the
3437 next trace run. Return the location of matched tracepoint. */
3439 static struct bp_location *
3440 find_matching_tracepoint_location (struct uploaded_tp *utp)
3442 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3444 struct breakpoint *b;
3445 struct bp_location *loc;
3447 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3449 struct tracepoint *t = (struct tracepoint *) b;
3451 if (b->type == utp->type
3452 && t->step_count == utp->step
3453 && t->pass_count == utp->pass
3454 && cond_string_is_same (t->base.cond_string, utp->cond_string)
3455 /* FIXME also test actions. */
3458 /* Scan the locations for an address match. */
3459 for (loc = b->loc; loc; loc = loc->next)
3461 if (loc->address == utp->addr)
3469 /* Given a list of tracepoints uploaded from a target, attempt to
3470 match them up with existing tracepoints, and create new ones if not
3474 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3476 struct uploaded_tp *utp;
3477 /* A set of tracepoints which are modified. */
3478 VEC(breakpoint_p) *modified_tp = NULL;
3480 struct breakpoint *b;
3482 /* Look for GDB tracepoints that match up with our uploaded versions. */
3483 for (utp = *uploaded_tps; utp; utp = utp->next)
3485 struct bp_location *loc;
3486 struct tracepoint *t;
3488 loc = find_matching_tracepoint_location (utp);
3493 /* Mark this location as already inserted. */
3495 t = (struct tracepoint *) loc->owner;
3496 printf_filtered (_("Assuming tracepoint %d is same "
3497 "as target's tracepoint %d at %s.\n"),
3498 loc->owner->number, utp->number,
3499 paddress (loc->gdbarch, utp->addr));
3501 /* The tracepoint LOC->owner was modified (the location LOC
3502 was marked as inserted in the target). Save it in
3503 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3504 observers will be notified later once for each tracepoint
3505 saved in MODIFIED_TP. */
3507 VEC_iterate (breakpoint_p, modified_tp, ix, b);
3509 if (b == loc->owner)
3515 VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3519 t = create_tracepoint_from_upload (utp);
3521 printf_filtered (_("Created tracepoint %d for "
3522 "target's tracepoint %d at %s.\n"),
3523 t->base.number, utp->number,
3524 paddress (get_current_arch (), utp->addr));
3526 printf_filtered (_("Failed to create tracepoint for target's "
3527 "tracepoint %d at %s, skipping it.\n"),
3529 paddress (get_current_arch (), utp->addr));
3531 /* Whether found or created, record the number used by the
3532 target, to help with mapping target tracepoints back to their
3533 counterparts here. */
3535 t->number_on_target = utp->number;
3538 /* Notify 'breakpoint-modified' observer that at least one of B's
3539 locations was changed. */
3540 for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
3541 observer_notify_breakpoint_modified (b);
3543 VEC_free (breakpoint_p, modified_tp);
3544 free_uploaded_tps (uploaded_tps);
3547 /* Trace state variables don't have much to identify them beyond their
3548 name, so just use that to detect matches. */
3550 static struct trace_state_variable *
3551 find_matching_tsv (struct uploaded_tsv *utsv)
3556 return find_trace_state_variable (utsv->name);
3559 static struct trace_state_variable *
3560 create_tsv_from_upload (struct uploaded_tsv *utsv)
3562 const char *namebase;
3565 struct trace_state_variable *tsv;
3566 struct cleanup *old_chain;
3570 namebase = utsv->name;
3571 buf = xstrprintf ("%s", namebase);
3576 buf = xstrprintf ("%s_%d", namebase, try_num++);
3579 /* Fish for a name that is not in use. */
3580 /* (should check against all internal vars?) */
3581 while (find_trace_state_variable (buf))
3584 buf = xstrprintf ("%s_%d", namebase, try_num++);
3587 old_chain = make_cleanup (xfree, buf);
3589 /* We have an available name, create the variable. */
3590 tsv = create_trace_state_variable (buf);
3591 tsv->initial_value = utsv->initial_value;
3592 tsv->builtin = utsv->builtin;
3594 observer_notify_tsv_created (tsv->name, tsv->initial_value);
3596 do_cleanups (old_chain);
3601 /* Given a list of uploaded trace state variables, try to match them
3602 up with existing variables, or create additional ones. */
3605 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3608 struct uploaded_tsv *utsv;
3609 struct trace_state_variable *tsv;
3612 /* Most likely some numbers will have to be reassigned as part of
3613 the merge, so clear them all in anticipation. */
3614 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3617 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3619 tsv = find_matching_tsv (utsv);
3623 printf_filtered (_("Assuming trace state variable $%s "
3624 "is same as target's variable %d.\n"),
3625 tsv->name, utsv->number);
3629 tsv = create_tsv_from_upload (utsv);
3631 printf_filtered (_("Created trace state variable "
3632 "$%s for target's variable %d.\n"),
3633 tsv->name, utsv->number);
3635 /* Give precedence to numberings that come from the target. */
3637 tsv->number = utsv->number;
3640 /* Renumber everything that didn't get a target-assigned number. */
3642 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3643 if (tsv->number > highest)
3644 highest = tsv->number;
3647 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3648 if (tsv->number == 0)
3649 tsv->number = highest++;
3651 free_uploaded_tsvs (uploaded_tsvs);
3654 /* target tfile command */
3656 static struct target_ops tfile_ops;
3658 /* Fill in tfile_ops with its defined operations and properties. */
3660 #define TRACE_HEADER_SIZE 8
3662 static char *trace_filename;
3663 static int trace_fd = -1;
3664 static off_t trace_frames_offset;
3665 static off_t cur_offset;
3666 static int cur_data_size;
3667 int trace_regblock_size;
3669 static void tfile_interp_line (char *line,
3670 struct uploaded_tp **utpp,
3671 struct uploaded_tsv **utsvp);
3673 /* Read SIZE bytes into READBUF from the trace frame, starting at
3674 TRACE_FD's current position. Note that this call `read'
3675 underneath, hence it advances the file's seek position. Throws an
3676 error if the `read' syscall fails, or less than SIZE bytes are
3680 tfile_read (gdb_byte *readbuf, int size)
3684 gotten = read (trace_fd, readbuf, size);
3686 perror_with_name (trace_filename);
3687 else if (gotten < size)
3688 error (_("Premature end of file while reading trace file"));
3692 tfile_open (char *filename, int from_tty)
3694 volatile struct gdb_exception ex;
3696 struct cleanup *old_chain;
3699 char header[TRACE_HEADER_SIZE];
3700 char linebuf[1000]; /* Should be max remote packet size or so. */
3703 struct trace_status *ts;
3704 struct uploaded_tp *uploaded_tps = NULL;
3705 struct uploaded_tsv *uploaded_tsvs = NULL;
3707 target_preopen (from_tty);
3709 error (_("No trace file specified."));
3711 filename = tilde_expand (filename);
3712 if (!IS_ABSOLUTE_PATH(filename))
3714 temp = concat (current_directory, "/", filename, (char *) NULL);
3719 old_chain = make_cleanup (xfree, filename);
3721 flags = O_BINARY | O_LARGEFILE;
3723 scratch_chan = open (filename, flags, 0);
3724 if (scratch_chan < 0)
3725 perror_with_name (filename);
3727 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3729 discard_cleanups (old_chain); /* Don't free filename any more. */
3730 unpush_target (&tfile_ops);
3732 trace_filename = xstrdup (filename);
3733 trace_fd = scratch_chan;
3736 /* Read the file header and test for validity. */
3737 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
3739 bytes += TRACE_HEADER_SIZE;
3740 if (!(header[0] == 0x7f
3741 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3742 error (_("File is not a valid trace file."));
3744 push_target (&tfile_ops);
3746 trace_regblock_size = 0;
3747 ts = current_trace_status ();
3748 /* We know we're working with a file. */
3750 /* Set defaults in case there is no status line. */
3751 ts->running_known = 0;
3752 ts->stop_reason = trace_stop_reason_unknown;
3753 ts->traceframe_count = -1;
3754 ts->buffer_free = 0;
3755 ts->disconnected_tracing = 0;
3756 ts->circular_buffer = 0;
3758 TRY_CATCH (ex, RETURN_MASK_ALL)
3760 /* Read through a section of newline-terminated lines that
3761 define things like tracepoints. */
3765 tfile_read (&byte, 1);
3770 /* Empty line marks end of the definition section. */
3775 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3778 linebuf[i++] = byte;
3780 error (_("Excessively long lines in trace file"));
3783 /* Record the starting offset of the binary trace data. */
3784 trace_frames_offset = bytes;
3786 /* If we don't have a blocksize, we can't interpret the
3788 if (trace_regblock_size == 0)
3789 error (_("No register block size recorded in trace file"));
3793 /* Pop the partially set up target. */
3795 throw_exception (ex);
3798 inferior_appeared (current_inferior (), TFILE_PID);
3799 inferior_ptid = pid_to_ptid (TFILE_PID);
3800 add_thread_silent (inferior_ptid);
3802 if (ts->traceframe_count <= 0)
3803 warning (_("No traceframes present in this file."));
3805 /* Add the file's tracepoints and variables into the current mix. */
3807 /* Get trace state variables first, they may be checked when parsing
3808 uploaded commands. */
3809 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3811 merge_uploaded_tracepoints (&uploaded_tps);
3813 post_create_inferior (&tfile_ops, from_tty);
3816 /* Interpret the given line from the definitions part of the trace
3820 tfile_interp_line (char *line,
3821 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3825 if (strncmp (p, "R ", strlen ("R ")) == 0)
3828 trace_regblock_size = strtol (p, &p, 16);
3830 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3832 p += strlen ("status ");
3833 parse_trace_status (p, current_trace_status ());
3835 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3837 p += strlen ("tp ");
3838 parse_tracepoint_definition (p, utpp);
3840 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3842 p += strlen ("tsv ");
3843 parse_tsv_definition (p, utsvp);
3846 warning (_("Ignoring trace file definition \"%s\""), line);
3849 /* Parse the part of trace status syntax that is shared between
3850 the remote protocol and the trace file reader. */
3853 parse_trace_status (char *line, struct trace_status *ts)
3855 char *p = line, *p1, *p2, *p3, *p_temp;
3859 ts->running_known = 1;
3860 ts->running = (*p++ == '1');
3861 ts->stop_reason = trace_stop_reason_unknown;
3862 xfree (ts->stop_desc);
3863 ts->stop_desc = NULL;
3864 ts->traceframe_count = -1;
3865 ts->traceframes_created = -1;
3866 ts->buffer_free = -1;
3867 ts->buffer_size = -1;
3868 ts->disconnected_tracing = 0;
3869 ts->circular_buffer = 0;
3870 xfree (ts->user_name);
3871 ts->user_name = NULL;
3874 ts->start_time = ts->stop_time = 0;
3878 p1 = strchr (p, ':');
3880 error (_("Malformed trace status, at %s\n\
3881 Status line: '%s'\n"), p, line);
3882 p3 = strchr (p, ';');
3884 p3 = p + strlen (p);
3885 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3887 p = unpack_varlen_hex (++p1, &val);
3888 ts->stop_reason = trace_buffer_full;
3890 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3892 p = unpack_varlen_hex (++p1, &val);
3893 ts->stop_reason = trace_never_run;
3895 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3898 p = unpack_varlen_hex (++p1, &val);
3899 ts->stop_reason = tracepoint_passcount;
3900 ts->stopping_tracepoint = val;
3902 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3904 p2 = strchr (++p1, ':');
3912 ts->stop_desc = xmalloc (strlen (line));
3913 end = hex2bin (p1, ts->stop_desc, (p2 - p1) / 2);
3914 ts->stop_desc[end] = '\0';
3917 ts->stop_desc = xstrdup ("");
3919 p = unpack_varlen_hex (++p2, &val);
3920 ts->stop_reason = tstop_command;
3922 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3924 p = unpack_varlen_hex (++p1, &val);
3925 ts->stop_reason = trace_disconnected;
3927 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3929 p2 = strchr (++p1, ':');
3932 ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1);
3933 end = hex2bin (p1, ts->stop_desc, (p2 - p1) / 2);
3934 ts->stop_desc[end] = '\0';
3937 ts->stop_desc = xstrdup ("");
3939 p = unpack_varlen_hex (++p2, &val);
3940 ts->stopping_tracepoint = val;
3941 ts->stop_reason = tracepoint_error;
3943 else if (strncmp (p, "tframes", p1 - p) == 0)
3945 p = unpack_varlen_hex (++p1, &val);
3946 ts->traceframe_count = val;
3948 else if (strncmp (p, "tcreated", p1 - p) == 0)
3950 p = unpack_varlen_hex (++p1, &val);
3951 ts->traceframes_created = val;
3953 else if (strncmp (p, "tfree", p1 - p) == 0)
3955 p = unpack_varlen_hex (++p1, &val);
3956 ts->buffer_free = val;
3958 else if (strncmp (p, "tsize", p1 - p) == 0)
3960 p = unpack_varlen_hex (++p1, &val);
3961 ts->buffer_size = val;
3963 else if (strncmp (p, "disconn", p1 - p) == 0)
3965 p = unpack_varlen_hex (++p1, &val);
3966 ts->disconnected_tracing = val;
3968 else if (strncmp (p, "circular", p1 - p) == 0)
3970 p = unpack_varlen_hex (++p1, &val);
3971 ts->circular_buffer = val;
3973 else if (strncmp (p, "starttime", p1 - p) == 0)
3975 p = unpack_varlen_hex (++p1, &val);
3976 ts->start_time = val;
3978 else if (strncmp (p, "stoptime", p1 - p) == 0)
3980 p = unpack_varlen_hex (++p1, &val);
3981 ts->stop_time = val;
3983 else if (strncmp (p, "username", p1 - p) == 0)
3986 ts->user_name = xmalloc (strlen (p) / 2);
3987 end = hex2bin (p1, ts->user_name, (p3 - p1) / 2);
3988 ts->user_name[end] = '\0';
3991 else if (strncmp (p, "notes", p1 - p) == 0)
3994 ts->notes = xmalloc (strlen (p) / 2);
3995 end = hex2bin (p1, ts->notes, (p3 - p1) / 2);
3996 ts->notes[end] = '\0';
4001 /* Silently skip unknown optional info. */
4002 p_temp = strchr (p1 + 1, ';');
4006 /* Must be at the end. */
4013 parse_tracepoint_status (char *p, struct breakpoint *bp,
4014 struct uploaded_tp *utp)
4017 struct tracepoint *tp = (struct tracepoint *) bp;
4019 p = unpack_varlen_hex (p, &uval);
4021 tp->base.hit_count += uval;
4023 utp->hit_count += uval;
4024 p = unpack_varlen_hex (p + 1, &uval);
4026 tp->traceframe_usage += uval;
4028 utp->traceframe_usage += uval;
4029 /* Ignore any extra, allowing for future extensions. */
4032 /* Given a line of text defining a part of a tracepoint, parse it into
4033 an "uploaded tracepoint". */
4036 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
4040 ULONGEST num, addr, step, pass, orig_size, xlen, start;
4043 char *cond, *srctype, *buf;
4044 struct uploaded_tp *utp = NULL;
4047 /* Both tracepoint and action definitions start with the same number
4048 and address sequence. */
4050 p = unpack_varlen_hex (p, &num);
4051 p++; /* skip a colon */
4052 p = unpack_varlen_hex (p, &addr);
4053 p++; /* skip a colon */
4056 enabled = (*p++ == 'E');
4057 p++; /* skip a colon */
4058 p = unpack_varlen_hex (p, &step);
4059 p++; /* skip a colon */
4060 p = unpack_varlen_hex (p, &pass);
4061 type = bp_tracepoint;
4063 /* Thumb through optional fields. */
4066 p++; /* skip a colon */
4069 type = bp_fast_tracepoint;
4071 p = unpack_varlen_hex (p, &orig_size);
4075 type = bp_static_tracepoint;
4081 p = unpack_varlen_hex (p, &xlen);
4082 p++; /* skip a comma */
4083 cond = (char *) xmalloc (2 * xlen + 1);
4084 strncpy (cond, p, 2 * xlen);
4085 cond[2 * xlen] = '\0';
4089 warning (_("Unrecognized char '%c' in tracepoint "
4090 "definition, skipping rest"), *p);
4092 utp = get_uploaded_tp (num, addr, utpp);
4094 utp->enabled = enabled;
4099 else if (piece == 'A')
4101 utp = get_uploaded_tp (num, addr, utpp);
4102 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
4104 else if (piece == 'S')
4106 utp = get_uploaded_tp (num, addr, utpp);
4107 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
4109 else if (piece == 'Z')
4111 /* Parse a chunk of source form definition. */
4112 utp = get_uploaded_tp (num, addr, utpp);
4114 p = strchr (p, ':');
4115 p++; /* skip a colon */
4116 p = unpack_varlen_hex (p, &start);
4117 p++; /* skip a colon */
4118 p = unpack_varlen_hex (p, &xlen);
4119 p++; /* skip a colon */
4121 buf = alloca (strlen (line));
4123 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4126 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
4127 utp->at_string = xstrdup (buf);
4128 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
4129 utp->cond_string = xstrdup (buf);
4130 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
4131 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
4133 else if (piece == 'V')
4135 utp = get_uploaded_tp (num, addr, utpp);
4137 parse_tracepoint_status (p, NULL, utp);
4141 /* Don't error out, the target might be sending us optional
4142 info that we don't care about. */
4143 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
4147 /* Convert a textual description of a trace state variable into an
4151 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
4154 ULONGEST num, initval, builtin;
4156 struct uploaded_tsv *utsv = NULL;
4158 buf = alloca (strlen (line));
4161 p = unpack_varlen_hex (p, &num);
4162 p++; /* skip a colon */
4163 p = unpack_varlen_hex (p, &initval);
4164 p++; /* skip a colon */
4165 p = unpack_varlen_hex (p, &builtin);
4166 p++; /* skip a colon */
4167 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4170 utsv = get_uploaded_tsv (num, utsvp);
4171 utsv->initial_value = initval;
4172 utsv->builtin = builtin;
4173 utsv->name = xstrdup (buf);
4176 /* Close the trace file and generally clean up. */
4179 tfile_close (int quitting)
4186 pid = ptid_get_pid (inferior_ptid);
4187 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
4188 exit_inferior_silent (pid);
4192 xfree (trace_filename);
4193 trace_filename = NULL;
4197 tfile_files_info (struct target_ops *t)
4199 /* (it would be useful to mention the name of the file). */
4200 printf_filtered ("Looking at a trace file.\n");
4203 /* The trace status for a file is that tracing can never be run. */
4206 tfile_get_trace_status (struct trace_status *ts)
4208 /* Other bits of trace status were collected as part of opening the
4209 trace files, so nothing to do here. */
4215 tfile_get_tracepoint_status (struct breakpoint *tp, struct uploaded_tp *utp)
4217 /* Other bits of trace status were collected as part of opening the
4218 trace files, so nothing to do here. */
4221 /* Given the position of a traceframe in the file, figure out what
4222 address the frame was collected at. This would normally be the
4223 value of a collected PC register, but if not available, we
4227 tfile_get_traceframe_address (off_t tframe_offset)
4231 struct tracepoint *tp;
4232 off_t saved_offset = cur_offset;
4234 /* FIXME dig pc out of collected registers. */
4236 /* Fall back to using tracepoint address. */
4237 lseek (trace_fd, tframe_offset, SEEK_SET);
4238 tfile_read ((gdb_byte *) &tpnum, 2);
4239 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4241 (target_gdbarch ()));
4243 tp = get_tracepoint_by_number_on_target (tpnum);
4244 /* FIXME this is a poor heuristic if multiple locations. */
4245 if (tp && tp->base.loc)
4246 addr = tp->base.loc->address;
4248 /* Restore our seek position. */
4249 cur_offset = saved_offset;
4250 lseek (trace_fd, cur_offset, SEEK_SET);
4254 /* Given a type of search and some parameters, scan the collection of
4255 traceframes in the file looking for a match. When found, return
4256 both the traceframe and tracepoint number, otherwise -1 for
4260 tfile_trace_find (enum trace_find_type type, int num,
4261 ULONGEST addr1, ULONGEST addr2, int *tpp)
4264 int tfnum = 0, found = 0;
4265 unsigned int data_size;
4266 struct tracepoint *tp;
4267 off_t offset, tframe_offset;
4277 lseek (trace_fd, trace_frames_offset, SEEK_SET);
4278 offset = trace_frames_offset;
4281 tframe_offset = offset;
4282 tfile_read ((gdb_byte *) &tpnum, 2);
4283 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4285 (target_gdbarch ()));
4289 tfile_read ((gdb_byte *) &data_size, 4);
4290 data_size = (unsigned int) extract_unsigned_integer
4291 ((gdb_byte *) &data_size, 4,
4292 gdbarch_byte_order (target_gdbarch ()));
4301 tfaddr = tfile_get_traceframe_address (tframe_offset);
4302 if (tfaddr == addr1)
4306 tp = get_tracepoint (num);
4307 if (tp && tpnum == tp->number_on_target)
4311 tfaddr = tfile_get_traceframe_address (tframe_offset);
4312 if (addr1 <= tfaddr && tfaddr <= addr2)
4316 tfaddr = tfile_get_traceframe_address (tframe_offset);
4317 if (!(addr1 <= tfaddr && tfaddr <= addr2))
4321 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4327 cur_offset = offset;
4328 cur_data_size = data_size;
4332 /* Skip past the traceframe's data. */
4333 lseek (trace_fd, data_size, SEEK_CUR);
4334 offset += data_size;
4335 /* Update our own count of traceframes. */
4338 /* Did not find what we were looking for. */
4344 /* Prototype of the callback passed to tframe_walk_blocks. */
4345 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4347 /* Callback for traceframe_walk_blocks, used to find a given block
4348 type in a traceframe. */
4351 match_blocktype (char blocktype, void *data)
4353 char *wantedp = data;
4355 if (*wantedp == blocktype)
4361 /* Walk over all traceframe block starting at POS offset from
4362 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4363 unmodified. If CALLBACK returns true, this returns the position in
4364 the traceframe where the block is found, relative to the start of
4365 the traceframe (cur_offset). Returns -1 if no callback call
4366 returned true, indicating that all blocks have been walked. */
4369 traceframe_walk_blocks (walk_blocks_callback_func callback,
4370 int pos, void *data)
4372 /* Iterate through a traceframe's blocks, looking for a block of the
4375 lseek (trace_fd, cur_offset + pos, SEEK_SET);
4376 while (pos < cur_data_size)
4378 unsigned short mlen;
4381 tfile_read (&block_type, 1);
4385 if ((*callback) (block_type, data))
4391 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4392 pos += trace_regblock_size;
4395 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4396 tfile_read ((gdb_byte *) &mlen, 2);
4397 mlen = (unsigned short)
4398 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4400 (target_gdbarch ()));
4401 lseek (trace_fd, mlen, SEEK_CUR);
4402 pos += (8 + 2 + mlen);
4405 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4409 error (_("Unknown block type '%c' (0x%x) in trace frame"),
4410 block_type, block_type);
4418 /* Convenience wrapper around traceframe_walk_blocks. Looks for the
4419 position offset of a block of type TYPE_WANTED in the current trace
4420 frame, starting at POS. Returns -1 if no such block was found. */
4423 traceframe_find_block_type (char type_wanted, int pos)
4425 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4428 /* Look for a block of saved registers in the traceframe, and get the
4429 requested register from it. */
4432 tfile_fetch_registers (struct target_ops *ops,
4433 struct regcache *regcache, int regno)
4435 struct gdbarch *gdbarch = get_regcache_arch (regcache);
4436 int offset, regn, regsize, pc_regno;
4439 /* An uninitialized reg size says we're not going to be
4440 successful at getting register blocks. */
4441 if (!trace_regblock_size)
4444 regs = alloca (trace_regblock_size);
4446 if (traceframe_find_block_type ('R', 0) >= 0)
4448 tfile_read (regs, trace_regblock_size);
4450 /* Assume the block is laid out in GDB register number order,
4451 each register with the size that it has in GDB. */
4453 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4455 regsize = register_size (gdbarch, regn);
4456 /* Make sure we stay within block bounds. */
4457 if (offset + regsize >= trace_regblock_size)
4459 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4463 regcache_raw_supply (regcache, regno, regs + offset);
4466 else if (regno == -1)
4468 regcache_raw_supply (regcache, regn, regs + offset);
4476 /* We get here if no register data has been found. Mark registers
4478 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4479 regcache_raw_supply (regcache, regn, NULL);
4481 /* We can often usefully guess that the PC is going to be the same
4482 as the address of the tracepoint. */
4483 pc_regno = gdbarch_pc_regnum (gdbarch);
4484 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4486 struct tracepoint *tp = get_tracepoint (tracepoint_number);
4488 if (tp && tp->base.loc)
4490 /* But don't try to guess if tracepoint is multi-location... */
4491 if (tp->base.loc->next)
4493 warning (_("Tracepoint %d has multiple "
4494 "locations, cannot infer $pc"),
4498 /* ... or does while-stepping. */
4499 if (tp->step_count > 0)
4501 warning (_("Tracepoint %d does while-stepping, "
4502 "cannot infer $pc"),
4507 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4508 gdbarch_byte_order (gdbarch),
4509 tp->base.loc->address);
4510 regcache_raw_supply (regcache, pc_regno, regs);
4516 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4517 const char *annex, gdb_byte *readbuf,
4518 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4520 /* We're only doing regular memory for now. */
4521 if (object != TARGET_OBJECT_MEMORY)
4524 if (readbuf == NULL)
4525 error (_("tfile_xfer_partial: trace file is read-only"));
4527 if (traceframe_number != -1)
4531 /* Iterate through the traceframe's blocks, looking for
4533 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
4535 ULONGEST maddr, amt;
4536 unsigned short mlen;
4537 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
4539 tfile_read ((gdb_byte *) &maddr, 8);
4540 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4542 tfile_read ((gdb_byte *) &mlen, 2);
4543 mlen = (unsigned short)
4544 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4546 /* If the block includes the first part of the desired
4547 range, return as much it has; GDB will re-request the
4548 remainder, which might be in a different block of this
4550 if (maddr <= offset && offset < (maddr + mlen))
4552 amt = (maddr + mlen) - offset;
4556 if (maddr != offset)
4557 lseek (trace_fd, offset - maddr, SEEK_CUR);
4558 tfile_read (readbuf, amt);
4562 /* Skip over this block. */
4563 pos += (8 + 2 + mlen);
4567 /* It's unduly pedantic to refuse to look at the executable for
4568 read-only pieces; so do the equivalent of readonly regions aka
4570 /* FIXME account for relocation at some point. */
4577 for (s = exec_bfd->sections; s; s = s->next)
4579 if ((s->flags & SEC_LOAD) == 0
4580 || (s->flags & SEC_READONLY) == 0)
4584 size = bfd_get_section_size (s);
4585 if (vma <= offset && offset < (vma + size))
4589 amt = (vma + size) - offset;
4593 amt = bfd_get_section_contents (exec_bfd, s,
4594 readbuf, offset - vma, amt);
4600 /* Indicate failure to find the requested memory block. */
4604 /* Iterate through the blocks of a trace frame, looking for a 'V'
4605 block with a matching tsv number. */
4608 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4613 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
4617 tfile_read ((gdb_byte *) &vnum, 4);
4618 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
4620 (target_gdbarch ()));
4623 tfile_read ((gdb_byte *) val, 8);
4624 *val = extract_signed_integer ((gdb_byte *) val, 8,
4626 (target_gdbarch ()));
4632 /* Didn't find anything. */
4637 tfile_has_all_memory (struct target_ops *ops)
4643 tfile_has_memory (struct target_ops *ops)
4649 tfile_has_stack (struct target_ops *ops)
4651 return traceframe_number != -1;
4655 tfile_has_registers (struct target_ops *ops)
4657 return traceframe_number != -1;
4661 tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4666 /* Callback for traceframe_walk_blocks. Builds a traceframe_info
4667 object for the tfile target's current traceframe. */
4670 build_traceframe_info (char blocktype, void *data)
4672 struct traceframe_info *info = data;
4678 struct mem_range *r;
4680 unsigned short mlen;
4682 tfile_read ((gdb_byte *) &maddr, 8);
4683 tfile_read ((gdb_byte *) &mlen, 2);
4685 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4698 warning (_("Unhandled trace block type (%d) '%c ' "
4699 "while building trace frame info."),
4700 blocktype, blocktype);
4707 static struct traceframe_info *
4708 tfile_traceframe_info (void)
4710 struct traceframe_info *info = XCNEW (struct traceframe_info);
4712 traceframe_walk_blocks (build_traceframe_info, 0, info);
4717 init_tfile_ops (void)
4719 tfile_ops.to_shortname = "tfile";
4720 tfile_ops.to_longname = "Local trace dump file";
4722 = "Use a trace file as a target. Specify the filename of the trace file.";
4723 tfile_ops.to_open = tfile_open;
4724 tfile_ops.to_close = tfile_close;
4725 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4726 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4727 tfile_ops.to_files_info = tfile_files_info;
4728 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4729 tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
4730 tfile_ops.to_trace_find = tfile_trace_find;
4731 tfile_ops.to_get_trace_state_variable_value
4732 = tfile_get_trace_state_variable_value;
4733 tfile_ops.to_stratum = process_stratum;
4734 tfile_ops.to_has_all_memory = tfile_has_all_memory;
4735 tfile_ops.to_has_memory = tfile_has_memory;
4736 tfile_ops.to_has_stack = tfile_has_stack;
4737 tfile_ops.to_has_registers = tfile_has_registers;
4738 tfile_ops.to_traceframe_info = tfile_traceframe_info;
4739 tfile_ops.to_thread_alive = tfile_thread_alive;
4740 tfile_ops.to_magic = OPS_MAGIC;
4744 free_current_marker (void *arg)
4746 struct static_tracepoint_marker **marker_p = arg;
4748 if (*marker_p != NULL)
4750 release_static_tracepoint_marker (*marker_p);
4757 /* Given a line of text defining a static tracepoint marker, parse it
4758 into a "static tracepoint marker" object. Throws an error is
4759 parsing fails. If PP is non-null, it points to one past the end of
4760 the parsed marker definition. */
4763 parse_static_tracepoint_marker_definition (char *line, char **pp,
4764 struct static_tracepoint_marker *marker)
4771 p = unpack_varlen_hex (p, &addr);
4772 p++; /* skip a colon */
4774 marker->gdbarch = target_gdbarch ();
4775 marker->address = (CORE_ADDR) addr;
4777 endp = strchr (p, ':');
4779 error (_("bad marker definition: %s"), line);
4781 marker->str_id = xmalloc (endp - p + 1);
4782 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4783 marker->str_id[end] = '\0';
4786 p++; /* skip a colon */
4788 marker->extra = xmalloc (strlen (p) + 1);
4789 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4790 marker->extra[end] = '\0';
4796 /* Release a static tracepoint marker's contents. Note that the
4797 object itself isn't released here. There objects are usually on
4801 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4803 xfree (marker->str_id);
4804 marker->str_id = NULL;
4807 /* Print MARKER to gdb_stdout. */
4810 print_one_static_tracepoint_marker (int count,
4811 struct static_tracepoint_marker *marker)
4813 struct command_line *l;
4816 char wrap_indent[80];
4817 char extra_field_indent[80];
4818 struct ui_out *uiout = current_uiout;
4819 struct cleanup *bkpt_chain;
4820 VEC(breakpoint_p) *tracepoints;
4822 struct symtab_and_line sal;
4826 sal.pc = marker->address;
4828 tracepoints = static_tracepoints_here (marker->address);
4830 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4832 /* A counter field to help readability. This is not a stable
4834 ui_out_field_int (uiout, "count", count);
4836 ui_out_field_string (uiout, "marker-id", marker->str_id);
4838 ui_out_field_fmt (uiout, "enabled", "%c",
4839 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4840 ui_out_spaces (uiout, 2);
4842 strcpy (wrap_indent, " ");
4844 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4845 strcat (wrap_indent, " ");
4847 strcat (wrap_indent, " ");
4849 strcpy (extra_field_indent, " ");
4851 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4853 sal = find_pc_line (marker->address, 0);
4854 sym = find_pc_sect_function (marker->address, NULL);
4857 ui_out_text (uiout, "in ");
4858 ui_out_field_string (uiout, "func",
4859 SYMBOL_PRINT_NAME (sym));
4860 ui_out_wrap_hint (uiout, wrap_indent);
4861 ui_out_text (uiout, " at ");
4864 ui_out_field_skip (uiout, "func");
4866 if (sal.symtab != NULL)
4868 ui_out_field_string (uiout, "file", sal.symtab->filename);
4869 ui_out_text (uiout, ":");
4871 if (ui_out_is_mi_like_p (uiout))
4873 const char *fullname = symtab_to_fullname (sal.symtab);
4876 ui_out_field_string (uiout, "fullname", fullname);
4879 ui_out_field_skip (uiout, "fullname");
4881 ui_out_field_int (uiout, "line", sal.line);
4885 ui_out_field_skip (uiout, "fullname");
4886 ui_out_field_skip (uiout, "line");
4889 ui_out_text (uiout, "\n");
4890 ui_out_text (uiout, extra_field_indent);
4891 ui_out_text (uiout, _("Data: \""));
4892 ui_out_field_string (uiout, "extra-data", marker->extra);
4893 ui_out_text (uiout, "\"\n");
4895 if (!VEC_empty (breakpoint_p, tracepoints))
4897 struct cleanup *cleanup_chain;
4899 struct breakpoint *b;
4901 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4904 ui_out_text (uiout, extra_field_indent);
4905 ui_out_text (uiout, _("Probed by static tracepoints: "));
4906 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4909 ui_out_text (uiout, ", ");
4910 ui_out_text (uiout, "#");
4911 ui_out_field_int (uiout, "tracepoint-id", b->number);
4914 do_cleanups (cleanup_chain);
4916 if (ui_out_is_mi_like_p (uiout))
4917 ui_out_field_int (uiout, "number-of-tracepoints",
4918 VEC_length(breakpoint_p, tracepoints));
4920 ui_out_text (uiout, "\n");
4922 VEC_free (breakpoint_p, tracepoints);
4924 do_cleanups (bkpt_chain);
4928 info_static_tracepoint_markers_command (char *arg, int from_tty)
4930 VEC(static_tracepoint_marker_p) *markers;
4931 struct cleanup *old_chain;
4932 struct static_tracepoint_marker *marker;
4933 struct ui_out *uiout = current_uiout;
4936 /* We don't have to check target_can_use_agent and agent's capability on
4937 static tracepoint here, in order to be compatible with older GDBserver.
4938 We don't check USE_AGENT is true or not, because static tracepoints
4939 don't work without in-process agent, so we don't bother users to type
4940 `set agent on' when to use static tracepoint. */
4943 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4944 "StaticTracepointMarkersTable");
4946 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4948 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4950 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4951 if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
4952 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4954 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4955 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4957 ui_out_table_body (uiout);
4959 markers = target_static_tracepoint_markers_by_strid (NULL);
4960 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4963 VEC_iterate (static_tracepoint_marker_p,
4964 markers, i, marker);
4967 print_one_static_tracepoint_marker (i + 1, marker);
4968 release_static_tracepoint_marker (marker);
4971 do_cleanups (old_chain);
4974 /* The $_sdata convenience variable is a bit special. We don't know
4975 for sure type of the value until we actually have a chance to fetch
4976 the data --- the size of the object depends on what has been
4977 collected. We solve this by making $_sdata be an internalvar that
4978 creates a new value on access. */
4980 /* Return a new value with the correct type for the sdata object of
4981 the current trace frame. Return a void value if there's no object
4984 static struct value *
4985 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
4991 /* We need to read the whole object before we know its size. */
4992 size = target_read_alloc (¤t_target,
4993 TARGET_OBJECT_STATIC_TRACE_DATA,
5000 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
5002 v = allocate_value (type);
5003 memcpy (value_contents_raw (v), buf, size);
5008 return allocate_value (builtin_type (gdbarch)->builtin_void);
5011 #if !defined(HAVE_LIBEXPAT)
5013 struct traceframe_info *
5014 parse_traceframe_info (const char *tframe_info)
5016 static int have_warned;
5021 warning (_("Can not parse XML trace frame info; XML support "
5022 "was disabled at compile time"));
5028 #else /* HAVE_LIBEXPAT */
5030 #include "xml-support.h"
5032 /* Handle the start of a <memory> element. */
5035 traceframe_info_start_memory (struct gdb_xml_parser *parser,
5036 const struct gdb_xml_element *element,
5037 void *user_data, VEC(gdb_xml_value_s) *attributes)
5039 struct traceframe_info *info = user_data;
5040 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
5041 ULONGEST *start_p, *length_p;
5043 start_p = xml_find_attribute (attributes, "start")->value;
5044 length_p = xml_find_attribute (attributes, "length")->value;
5046 r->start = *start_p;
5047 r->length = *length_p;
5050 /* Discard the constructed trace frame info (if an error occurs). */
5053 free_result (void *p)
5055 struct traceframe_info *result = p;
5057 free_traceframe_info (result);
5060 /* The allowed elements and attributes for an XML memory map. */
5062 static const struct gdb_xml_attribute memory_attributes[] = {
5063 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5064 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5065 { NULL, GDB_XML_AF_NONE, NULL, NULL }
5068 static const struct gdb_xml_element traceframe_info_children[] = {
5069 { "memory", memory_attributes, NULL,
5070 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5071 traceframe_info_start_memory, NULL },
5072 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5075 static const struct gdb_xml_element traceframe_info_elements[] = {
5076 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
5078 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5081 /* Parse a traceframe-info XML document. */
5083 struct traceframe_info *
5084 parse_traceframe_info (const char *tframe_info)
5086 struct traceframe_info *result;
5087 struct cleanup *back_to;
5089 result = XCNEW (struct traceframe_info);
5090 back_to = make_cleanup (free_result, result);
5092 if (gdb_xml_parse_quick (_("trace frame info"),
5093 "traceframe-info.dtd", traceframe_info_elements,
5094 tframe_info, result) == 0)
5096 /* Parsed successfully, keep the result. */
5097 discard_cleanups (back_to);
5102 do_cleanups (back_to);
5106 #endif /* HAVE_LIBEXPAT */
5108 /* Returns the traceframe_info object for the current traceframe.
5109 This is where we avoid re-fetching the object from the target if we
5110 already have it cached. */
5112 static struct traceframe_info *
5113 get_traceframe_info (void)
5115 if (traceframe_info == NULL)
5116 traceframe_info = target_traceframe_info ();
5118 return traceframe_info;
5121 /* If the target supports the query, return in RESULT the set of
5122 collected memory in the current traceframe, found within the LEN
5123 bytes range starting at MEMADDR. Returns true if the target
5124 supports the query, otherwise returns false, and RESULT is left
5128 traceframe_available_memory (VEC(mem_range_s) **result,
5129 CORE_ADDR memaddr, ULONGEST len)
5131 struct traceframe_info *info = get_traceframe_info ();
5135 struct mem_range *r;
5140 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
5141 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
5143 ULONGEST lo1, hi1, lo2, hi2;
5144 struct mem_range *nr;
5147 hi1 = memaddr + len;
5150 hi2 = r->start + r->length;
5152 nr = VEC_safe_push (mem_range_s, *result, NULL);
5154 nr->start = max (lo1, lo2);
5155 nr->length = min (hi1, hi2) - nr->start;
5158 normalize_mem_ranges (*result);
5165 /* Implementation of `sdata' variable. */
5167 static const struct internalvar_funcs sdata_funcs =
5174 /* module initialization */
5176 _initialize_tracepoint (void)
5178 struct cmd_list_element *c;
5180 /* Explicitly create without lookup, since that tries to create a
5181 value with a void typed value, and when we get here, gdbarch
5182 isn't initialized yet. At this point, we're quite sure there
5183 isn't another convenience variable of the same name. */
5184 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
5186 traceframe_number = -1;
5187 tracepoint_number = -1;
5189 if (tracepoint_list.list == NULL)
5191 tracepoint_list.listsize = 128;
5192 tracepoint_list.list = xmalloc
5193 (tracepoint_list.listsize * sizeof (struct memrange));
5195 if (tracepoint_list.aexpr_list == NULL)
5197 tracepoint_list.aexpr_listsize = 128;
5198 tracepoint_list.aexpr_list = xmalloc
5199 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
5202 if (stepping_list.list == NULL)
5204 stepping_list.listsize = 128;
5205 stepping_list.list = xmalloc
5206 (stepping_list.listsize * sizeof (struct memrange));
5209 if (stepping_list.aexpr_list == NULL)
5211 stepping_list.aexpr_listsize = 128;
5212 stepping_list.aexpr_list = xmalloc
5213 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
5216 add_info ("scope", scope_info,
5217 _("List the variables local to a scope"));
5219 add_cmd ("tracepoints", class_trace, NULL,
5220 _("Tracing of program execution without stopping the program."),
5223 add_com ("tdump", class_trace, trace_dump_command,
5224 _("Print everything collected at the current tracepoint."));
5226 add_com ("tsave", class_trace, trace_save_command, _("\
5227 Save the trace data to a file.\n\
5228 Use the '-r' option to direct the target to save directly to the file,\n\
5229 using its own filesystem."));
5231 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
5232 Define a trace state variable.\n\
5233 Argument is a $-prefixed name, optionally followed\n\
5234 by '=' and an expression that sets the initial value\n\
5235 at the start of tracing."));
5236 set_cmd_completer (c, expression_completer);
5238 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
5239 Delete one or more trace state variables.\n\
5240 Arguments are the names of the variables to delete.\n\
5241 If no arguments are supplied, delete all variables."), &deletelist);
5242 /* FIXME add a trace variable completer. */
5244 add_info ("tvariables", tvariables_info, _("\
5245 Status of trace state variables and their values.\n\
5248 add_info ("static-tracepoint-markers",
5249 info_static_tracepoint_markers_command, _("\
5250 List target static tracepoints markers.\n\
5253 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
5254 Select a trace frame;\n\
5255 No argument means forward by one frame; '-' means backward by one frame."),
5256 &tfindlist, "tfind ", 1, &cmdlist);
5258 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
5259 Select a trace frame whose PC is outside the given range (exclusive).\n\
5260 Usage: tfind outside addr1, addr2"),
5263 add_cmd ("range", class_trace, trace_find_range_command, _("\
5264 Select a trace frame whose PC is in the given range (inclusive).\n\
5265 Usage: tfind range addr1,addr2"),
5268 add_cmd ("line", class_trace, trace_find_line_command, _("\
5269 Select a trace frame by source line.\n\
5270 Argument can be a line number (with optional source file),\n\
5271 a function name, or '*' followed by an address.\n\
5272 Default argument is 'the next source line that was traced'."),
5275 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
5276 Select a trace frame by tracepoint number.\n\
5277 Default is the tracepoint for the current trace frame."),
5280 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
5281 Select a trace frame by PC.\n\
5282 Default is the current PC, or the PC of the current trace frame."),
5285 add_cmd ("end", class_trace, trace_find_end_command, _("\
5286 De-select any trace frame and resume 'live' debugging."),
5289 add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
5291 add_cmd ("start", class_trace, trace_find_start_command,
5292 _("Select the first trace frame in the trace buffer."),
5295 add_com ("tstatus", class_trace, trace_status_command,
5296 _("Display the status of the current trace data collection."));
5298 add_com ("tstop", class_trace, trace_stop_command, _("\
5299 Stop trace data collection.\n\
5300 Usage: tstop [ <notes> ... ]\n\
5301 Any arguments supplied are recorded with the trace as a stop reason and\n\
5302 reported by tstatus (if the target supports trace notes)."));
5304 add_com ("tstart", class_trace, trace_start_command, _("\
5305 Start trace data collection.\n\
5306 Usage: tstart [ <notes> ... ]\n\
5307 Any arguments supplied are recorded with the trace as a note and\n\
5308 reported by tstatus (if the target supports trace notes)."));
5310 add_com ("end", class_trace, end_actions_pseudocommand, _("\
5311 Ends a list of commands or actions.\n\
5312 Several GDB commands allow you to enter a list of commands or actions.\n\
5313 Entering \"end\" on a line by itself is the normal way to terminate\n\
5315 Note: the \"end\" command cannot be used at the gdb prompt."));
5317 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
5318 Specify single-stepping behavior at a tracepoint.\n\
5319 Argument is number of instructions to trace in single-step mode\n\
5320 following the tracepoint. This command is normally followed by\n\
5321 one or more \"collect\" commands, to specify what to collect\n\
5322 while single-stepping.\n\n\
5323 Note: this command can only be used in a tracepoint \"actions\" list."));
5325 add_com_alias ("ws", "while-stepping", class_alias, 0);
5326 add_com_alias ("stepping", "while-stepping", class_alias, 0);
5328 add_com ("collect", class_trace, collect_pseudocommand, _("\
5329 Specify one or more data items to be collected at a tracepoint.\n\
5330 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
5331 collect all data (variables, registers) referenced by that expression.\n\
5332 Also accepts the following special arguments:\n\
5333 $regs -- all registers.\n\
5334 $args -- all function arguments.\n\
5335 $locals -- all variables local to the block/function scope.\n\
5336 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
5337 Note: this command can only be used in a tracepoint \"actions\" list."));
5339 add_com ("teval", class_trace, teval_pseudocommand, _("\
5340 Specify one or more expressions to be evaluated at a tracepoint.\n\
5341 Accepts a comma-separated list of (one or more) expressions.\n\
5342 The result of each evaluation will be discarded.\n\
5343 Note: this command can only be used in a tracepoint \"actions\" list."));
5345 add_com ("actions", class_trace, trace_actions_command, _("\
5346 Specify the actions to be taken at a tracepoint.\n\
5347 Tracepoint actions may include collecting of specified data,\n\
5348 single-stepping, or enabling/disabling other tracepoints,\n\
5349 depending on target's capabilities."));
5351 default_collect = xstrdup ("");
5352 add_setshow_string_cmd ("default-collect", class_trace,
5353 &default_collect, _("\
5354 Set the list of expressions to collect by default"), _("\
5355 Show the list of expressions to collect by default"), NULL,
5357 &setlist, &showlist);
5359 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5360 &disconnected_tracing, _("\
5361 Set whether tracing continues after GDB disconnects."), _("\
5362 Show whether tracing continues after GDB disconnects."), _("\
5363 Use this to continue a tracing run even if GDB disconnects\n\
5364 or detaches from the target. You can reconnect later and look at\n\
5365 trace data collected in the meantime."),
5366 set_disconnected_tracing,
5371 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5372 &circular_trace_buffer, _("\
5373 Set target's use of circular trace buffer."), _("\
5374 Show target's use of circular trace buffer."), _("\
5375 Use this to make the trace buffer into a circular buffer,\n\
5376 which will discard traceframes (oldest first) instead of filling\n\
5377 up and stopping the trace run."),
5378 set_circular_trace_buffer,
5383 add_setshow_string_cmd ("trace-user", class_trace,
5385 Set the user name to use for current and future trace runs"), _("\
5386 Show the user name to use for current and future trace runs"), NULL,
5387 set_trace_user, NULL,
5388 &setlist, &showlist);
5390 add_setshow_string_cmd ("trace-notes", class_trace,
5392 Set notes string to use for current and future trace runs"), _("\
5393 Show the notes string to use for current and future trace runs"), NULL,
5394 set_trace_notes, NULL,
5395 &setlist, &showlist);
5397 add_setshow_string_cmd ("trace-stop-notes", class_trace,
5398 &trace_stop_notes, _("\
5399 Set notes string to use for future tstop commands"), _("\
5400 Show the notes string to use for future tstop commands"), NULL,
5401 set_trace_stop_notes, NULL,
5402 &setlist, &showlist);
5406 add_target (&tfile_ops);