1 /* Tracing functionality for remote targets in custom GDB protocol
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
4 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "arch-utils.h"
26 #include "expression.h"
31 #include "gdb_string.h"
33 #include "breakpoint.h"
34 #include "tracepoint.h"
37 #include "completer.h"
39 #include "dictionary.h"
41 #include "user-regs.h"
45 #include "filenames.h"
46 #include "gdbthread.h"
54 #include "exceptions.h"
55 #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 /* ======= Important command functions: ======= */
182 static void trace_actions_command (char *, int);
183 static void trace_start_command (char *, int);
184 static void trace_stop_command (char *, int);
185 static void trace_status_command (char *, int);
186 static void trace_find_command (char *, int);
187 static void trace_find_pc_command (char *, int);
188 static void trace_find_tracepoint_command (char *, int);
189 static void trace_find_line_command (char *, int);
190 static void trace_find_range_command (char *, int);
191 static void trace_find_outside_command (char *, int);
192 static void trace_dump_command (char *, int);
194 /* support routines */
196 struct collection_list;
197 static void add_aexpr (struct collection_list *, struct agent_expr *);
198 static char *mem2hex (gdb_byte *, char *, int);
199 static void add_register (struct collection_list *collection,
202 extern void send_disconnected_tracing_value (int value);
204 static void free_uploaded_tps (struct uploaded_tp **utpp);
205 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
208 extern void _initialize_tracepoint (void);
210 static struct trace_status trace_status;
212 char *stop_reason_names[] = {
222 struct trace_status *
223 current_trace_status (void)
225 return &trace_status;
231 free_traceframe_info (struct traceframe_info *info)
235 VEC_free (mem_range_s, info->memory);
241 /* Free and clear the traceframe info cache of the current
245 clear_traceframe_info (void)
247 free_traceframe_info (traceframe_info);
248 traceframe_info = NULL;
251 /* Set traceframe number to NUM. */
253 set_traceframe_num (int num)
255 traceframe_number = num;
256 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
259 /* Set tracepoint number to NUM. */
261 set_tracepoint_num (int num)
263 tracepoint_number = num;
264 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
267 /* Set externally visible debug variables for querying/printing
268 the traceframe context (line, function, file). */
271 set_traceframe_context (struct frame_info *trace_frame)
275 /* Save as globals for internal use. */
276 if (trace_frame != NULL
277 && get_frame_pc_if_available (trace_frame, &trace_pc))
279 traceframe_sal = find_pc_line (trace_pc, 0);
280 traceframe_fun = find_pc_function (trace_pc);
282 /* Save linenumber as "$trace_line", a debugger variable visible to
284 set_internalvar_integer (lookup_internalvar ("trace_line"),
285 traceframe_sal.line);
289 init_sal (&traceframe_sal);
290 traceframe_fun = NULL;
291 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
294 /* Save func name as "$trace_func", a debugger variable visible to
296 if (traceframe_fun == NULL
297 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
298 clear_internalvar (lookup_internalvar ("trace_func"));
300 set_internalvar_string (lookup_internalvar ("trace_func"),
301 SYMBOL_LINKAGE_NAME (traceframe_fun));
303 /* Save file name as "$trace_file", a debugger variable visible to
305 if (traceframe_sal.symtab == NULL
306 || traceframe_sal.symtab->filename == NULL)
307 clear_internalvar (lookup_internalvar ("trace_file"));
309 set_internalvar_string (lookup_internalvar ("trace_file"),
310 traceframe_sal.symtab->filename);
313 /* Create a new trace state variable with the given name. */
315 struct trace_state_variable *
316 create_trace_state_variable (const char *name)
318 struct trace_state_variable tsv;
320 memset (&tsv, 0, sizeof (tsv));
321 tsv.name = xstrdup (name);
322 tsv.number = next_tsv_number++;
323 return VEC_safe_push (tsv_s, tvariables, &tsv);
326 /* Look for a trace state variable of the given name. */
328 struct trace_state_variable *
329 find_trace_state_variable (const char *name)
331 struct trace_state_variable *tsv;
334 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
335 if (strcmp (name, tsv->name) == 0)
342 delete_trace_state_variable (const char *name)
344 struct trace_state_variable *tsv;
347 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
348 if (strcmp (name, tsv->name) == 0)
350 xfree ((void *)tsv->name);
351 VEC_unordered_remove (tsv_s, tvariables, ix);
355 warning (_("No trace variable named \"$%s\", not deleting"), name);
358 /* The 'tvariable' command collects a name and optional expression to
359 evaluate into an initial value. */
362 trace_variable_command (char *args, int from_tty)
364 struct expression *expr;
365 struct cleanup *old_chain;
366 struct internalvar *intvar = NULL;
368 struct trace_state_variable *tsv;
371 error_no_arg (_("trace state variable name"));
373 /* All the possible valid arguments are expressions. */
374 expr = parse_expression (args);
375 old_chain = make_cleanup (free_current_contents, &expr);
377 if (expr->nelts == 0)
378 error (_("No expression?"));
380 /* Only allow two syntaxes; "$name" and "$name=value". */
381 if (expr->elts[0].opcode == OP_INTERNALVAR)
383 intvar = expr->elts[1].internalvar;
385 else if (expr->elts[0].opcode == BINOP_ASSIGN
386 && expr->elts[1].opcode == OP_INTERNALVAR)
388 intvar = expr->elts[2].internalvar;
389 initval = value_as_long (evaluate_subexpression_type (expr, 4));
392 error (_("Syntax must be $NAME [ = EXPR ]"));
395 error (_("No name given"));
397 if (strlen (internalvar_name (intvar)) <= 0)
398 error (_("Must supply a non-empty variable name"));
400 /* If the variable already exists, just change its initial value. */
401 tsv = find_trace_state_variable (internalvar_name (intvar));
404 tsv->initial_value = initval;
405 printf_filtered (_("Trace state variable $%s "
406 "now has initial value %s.\n"),
407 tsv->name, plongest (tsv->initial_value));
408 do_cleanups (old_chain);
412 /* Create a new variable. */
413 tsv = create_trace_state_variable (internalvar_name (intvar));
414 tsv->initial_value = initval;
416 printf_filtered (_("Trace state variable $%s "
417 "created, with initial value %s.\n"),
418 tsv->name, plongest (tsv->initial_value));
420 do_cleanups (old_chain);
424 delete_trace_variable_command (char *args, int from_tty)
428 struct cleanup *back_to;
432 if (query (_("Delete all trace state variables? ")))
433 VEC_free (tsv_s, tvariables);
438 argv = gdb_buildargv (args);
439 back_to = make_cleanup_freeargv (argv);
441 for (ix = 0; argv[ix] != NULL; ix++)
443 if (*argv[ix] == '$')
444 delete_trace_state_variable (argv[ix] + 1);
446 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
449 do_cleanups (back_to);
455 tvariables_info_1 (void)
457 struct trace_state_variable *tsv;
460 struct cleanup *back_to;
461 struct ui_out *uiout = current_uiout;
463 if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
465 printf_filtered (_("No trace state variables.\n"));
469 /* Try to acquire values from the target. */
470 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
471 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
474 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
475 count, "trace-variables");
476 ui_out_table_header (uiout, 15, ui_left, "name", "Name");
477 ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
478 ui_out_table_header (uiout, 11, ui_left, "current", "Current");
480 ui_out_table_body (uiout);
482 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
484 struct cleanup *back_to2;
488 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
490 name = concat ("$", tsv->name, (char *) NULL);
491 make_cleanup (xfree, name);
492 ui_out_field_string (uiout, "name", name);
493 ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
495 if (tsv->value_known)
496 c = plongest (tsv->value);
497 else if (ui_out_is_mi_like_p (uiout))
498 /* For MI, we prefer not to use magic string constants, but rather
499 omit the field completely. The difference between unknown and
500 undefined does not seem important enough to represent. */
502 else if (current_trace_status ()->running || traceframe_number >= 0)
503 /* The value is/was defined, but we don't have it. */
506 /* It is not meaningful to ask about the value. */
509 ui_out_field_string (uiout, "current", c);
510 ui_out_text (uiout, "\n");
512 do_cleanups (back_to2);
515 do_cleanups (back_to);
518 /* List all the trace state variables. */
521 tvariables_info (char *args, int from_tty)
523 tvariables_info_1 ();
526 /* Stash definitions of tsvs into the given file. */
529 save_trace_state_variables (struct ui_file *fp)
531 struct trace_state_variable *tsv;
534 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
536 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
537 if (tsv->initial_value)
538 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
539 fprintf_unfiltered (fp, "\n");
543 /* ACTIONS functions: */
545 /* The three functions:
546 collect_pseudocommand,
547 while_stepping_pseudocommand, and
548 end_actions_pseudocommand
549 are placeholders for "commands" that are actually ONLY to be used
550 within a tracepoint action list. If the actual function is ever called,
551 it means that somebody issued the "command" at the top level,
552 which is always an error. */
555 end_actions_pseudocommand (char *args, int from_tty)
557 error (_("This command cannot be used at the top level."));
561 while_stepping_pseudocommand (char *args, int from_tty)
563 error (_("This command can only be used in a tracepoint actions list."));
567 collect_pseudocommand (char *args, int from_tty)
569 error (_("This command can only be used in a tracepoint actions list."));
573 teval_pseudocommand (char *args, int from_tty)
575 error (_("This command can only be used in a tracepoint actions list."));
578 /* Parse any collection options, such as /s for strings. */
581 decode_agent_options (char *exp)
583 struct value_print_options opts;
588 /* Call this to borrow the print elements default for collection
590 get_user_print_options (&opts);
595 if (target_supports_string_tracing ())
597 /* Allow an optional decimal number giving an explicit maximum
598 string length, defaulting it to the "print elements" value;
599 so "collect/s80 mystr" gets at most 80 bytes of string. */
600 trace_string_kludge = opts.print_max;
602 if (*exp >= '0' && *exp <= '9')
603 trace_string_kludge = atoi (exp);
604 while (*exp >= '0' && *exp <= '9')
608 error (_("Target does not support \"/s\" option for string tracing."));
611 error (_("Undefined collection format \"%c\"."), *exp);
613 exp = skip_spaces (exp);
618 /* Enter a list of actions for a tracepoint. */
620 trace_actions_command (char *args, int from_tty)
622 struct tracepoint *t;
623 struct command_line *l;
625 t = get_tracepoint_by_number (&args, NULL, 1);
629 xstrprintf ("Enter actions for tracepoint %d, one per line.",
631 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
633 l = read_command_lines (tmpbuf, from_tty, 1,
634 check_tracepoint_command, t);
635 do_cleanups (cleanups);
636 breakpoint_set_commands (&t->base, l);
638 /* else just return */
641 /* Report the results of checking the agent expression, as errors or
645 report_agent_reqs_errors (struct agent_expr *aexpr)
647 /* All of the "flaws" are serious bytecode generation issues that
648 should never occur. */
649 if (aexpr->flaw != agent_flaw_none)
650 internal_error (__FILE__, __LINE__, _("expression is malformed"));
652 /* If analysis shows a stack underflow, GDB must have done something
653 badly wrong in its bytecode generation. */
654 if (aexpr->min_height < 0)
655 internal_error (__FILE__, __LINE__,
656 _("expression has min height < 0"));
658 /* Issue this error if the stack is predicted to get too deep. The
659 limit is rather arbitrary; a better scheme might be for the
660 target to report how much stack it will have available. The
661 depth roughly corresponds to parenthesization, so a limit of 20
662 amounts to 20 levels of expression nesting, which is actually
663 a pretty big hairy expression. */
664 if (aexpr->max_height > 20)
665 error (_("Expression is too complicated."));
668 /* worker function */
670 validate_actionline (char **line, struct breakpoint *b)
672 struct cmd_list_element *c;
673 struct expression *exp = NULL;
674 struct cleanup *old_chain = NULL;
676 struct bp_location *loc;
677 struct agent_expr *aexpr;
678 struct tracepoint *t = (struct tracepoint *) b;
680 /* If EOF is typed, *line is NULL. */
684 for (p = *line; isspace ((int) *p);)
687 /* Symbol lookup etc. */
688 if (*p == '\0') /* empty line: just prompt for another line. */
691 if (*p == '#') /* comment line */
694 c = lookup_cmd (&p, cmdlist, "", -1, 1);
696 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
698 if (cmd_cfunc_eq (c, collect_pseudocommand))
700 trace_string_kludge = 0;
702 p = decode_agent_options (p);
705 { /* Repeat over a comma-separated list. */
706 QUIT; /* Allow user to bail out with ^C. */
707 while (isspace ((int) *p))
710 if (*p == '$') /* Look for special pseudo-symbols. */
712 if (0 == strncasecmp ("reg", p + 1, 3)
713 || 0 == strncasecmp ("arg", p + 1, 3)
714 || 0 == strncasecmp ("loc", p + 1, 3)
715 || 0 == strncasecmp ("_ret", p + 1, 4)
716 || 0 == strncasecmp ("_sdata", p + 1, 6))
721 /* else fall thru, treat p as an expression and parse it! */
724 for (loc = t->base.loc; loc; loc = loc->next)
727 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
728 old_chain = make_cleanup (free_current_contents, &exp);
730 if (exp->elts[0].opcode == OP_VAR_VALUE)
732 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
734 error (_("constant `%s' (value %ld) "
735 "will not be collected."),
736 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
737 SYMBOL_VALUE (exp->elts[2].symbol));
739 else if (SYMBOL_CLASS (exp->elts[2].symbol)
740 == LOC_OPTIMIZED_OUT)
742 error (_("`%s' is optimized away "
743 "and cannot be collected."),
744 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
748 /* We have something to collect, make sure that the expr to
749 bytecode translator can handle it and that it's not too
751 aexpr = gen_trace_for_expr (loc->address, exp);
752 make_cleanup_free_agent_expr (aexpr);
754 if (aexpr->len > MAX_AGENT_EXPR_LEN)
755 error (_("Expression is too complicated."));
759 report_agent_reqs_errors (aexpr);
761 do_cleanups (old_chain);
764 while (p && *p++ == ',');
767 else if (cmd_cfunc_eq (c, teval_pseudocommand))
770 { /* Repeat over a comma-separated list. */
771 QUIT; /* Allow user to bail out with ^C. */
772 while (isspace ((int) *p))
776 for (loc = t->base.loc; loc; loc = loc->next)
779 /* Only expressions are allowed for this action. */
780 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
781 old_chain = make_cleanup (free_current_contents, &exp);
783 /* We have something to evaluate, make sure that the expr to
784 bytecode translator can handle it and that it's not too
786 aexpr = gen_eval_for_expr (loc->address, exp);
787 make_cleanup_free_agent_expr (aexpr);
789 if (aexpr->len > MAX_AGENT_EXPR_LEN)
790 error (_("Expression is too complicated."));
793 report_agent_reqs_errors (aexpr);
795 do_cleanups (old_chain);
798 while (p && *p++ == ',');
801 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
803 char *steparg; /* In case warning is necessary. */
805 while (isspace ((int) *p))
809 if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
810 error (_("while-stepping step count `%s' is malformed."), *line);
813 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
817 error (_("`%s' is not a supported tracepoint action."), *line);
821 memrange_absolute = -1
826 int type; /* memrange_absolute for absolute memory range,
827 else basereg number. */
828 bfd_signed_vma start;
832 struct collection_list
834 unsigned char regs_mask[32]; /* room for up to 256 regs */
837 struct memrange *list;
838 long aexpr_listsize; /* size of array pointed to by expr_list elt */
840 struct agent_expr **aexpr_list;
842 /* True is the user requested a collection of "$_sdata", "static
846 tracepoint_list, stepping_list;
848 /* MEMRANGE functions: */
850 static int memrange_cmp (const void *, const void *);
852 /* Compare memranges for qsort. */
854 memrange_cmp (const void *va, const void *vb)
856 const struct memrange *a = va, *b = vb;
858 if (a->type < b->type)
860 if (a->type > b->type)
862 if (a->type == memrange_absolute)
864 if ((bfd_vma) a->start < (bfd_vma) b->start)
866 if ((bfd_vma) a->start > (bfd_vma) b->start)
871 if (a->start < b->start)
873 if (a->start > b->start)
879 /* Sort the memrange list using qsort, and merge adjacent memranges. */
881 memrange_sortmerge (struct collection_list *memranges)
885 qsort (memranges->list, memranges->next_memrange,
886 sizeof (struct memrange), memrange_cmp);
887 if (memranges->next_memrange > 0)
889 for (a = 0, b = 1; b < memranges->next_memrange; b++)
891 /* If memrange b overlaps or is adjacent to memrange a,
893 if (memranges->list[a].type == memranges->list[b].type
894 && memranges->list[b].start <= memranges->list[a].end)
896 if (memranges->list[b].end > memranges->list[a].end)
897 memranges->list[a].end = memranges->list[b].end;
898 continue; /* next b, same a */
902 memcpy (&memranges->list[a], &memranges->list[b],
903 sizeof (struct memrange));
905 memranges->next_memrange = a + 1;
909 /* Add a register to a collection list. */
911 add_register (struct collection_list *collection, unsigned int regno)
914 printf_filtered ("collect register %d\n", regno);
915 if (regno >= (8 * sizeof (collection->regs_mask)))
916 error (_("Internal: register number %d too large for tracepoint"),
918 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
921 /* Add a memrange to a collection list. */
923 add_memrange (struct collection_list *memranges,
924 int type, bfd_signed_vma base,
929 printf_filtered ("(%d,", type);
931 printf_filtered (",%ld)\n", len);
934 /* type: memrange_absolute == memory, other n == basereg */
935 memranges->list[memranges->next_memrange].type = type;
936 /* base: addr if memory, offset if reg relative. */
937 memranges->list[memranges->next_memrange].start = base;
938 /* len: we actually save end (base + len) for convenience */
939 memranges->list[memranges->next_memrange].end = base + len;
940 memranges->next_memrange++;
941 if (memranges->next_memrange >= memranges->listsize)
943 memranges->listsize *= 2;
944 memranges->list = xrealloc (memranges->list,
945 memranges->listsize);
948 if (type != memrange_absolute) /* Better collect the base register! */
949 add_register (memranges, type);
952 /* Add a symbol to a collection list. */
954 collect_symbol (struct collection_list *collect,
956 struct gdbarch *gdbarch,
957 long frame_regno, long frame_offset,
962 bfd_signed_vma offset;
963 int treat_as_expr = 0;
965 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
966 switch (SYMBOL_CLASS (sym))
969 printf_filtered ("%s: don't know symbol class %d\n",
970 SYMBOL_PRINT_NAME (sym),
974 printf_filtered ("constant %s (value %ld) will not be collected.\n",
975 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
978 offset = SYMBOL_VALUE_ADDRESS (sym);
983 sprintf_vma (tmp, offset);
984 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
985 SYMBOL_PRINT_NAME (sym), len,
988 /* A struct may be a C++ class with static fields, go to general
989 expression handling. */
990 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
993 add_memrange (collect, memrange_absolute, offset, len);
996 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
998 printf_filtered ("LOC_REG[parm] %s: ",
999 SYMBOL_PRINT_NAME (sym));
1000 add_register (collect, reg);
1001 /* Check for doubles stored in two registers. */
1002 /* FIXME: how about larger types stored in 3 or more regs? */
1003 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
1004 len > register_size (gdbarch, reg))
1005 add_register (collect, reg + 1);
1008 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
1009 printf_filtered (" (will not collect %s)\n",
1010 SYMBOL_PRINT_NAME (sym));
1014 offset = frame_offset + SYMBOL_VALUE (sym);
1017 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1018 SYMBOL_PRINT_NAME (sym), len);
1019 printf_vma (offset);
1020 printf_filtered (" from frame ptr reg %d\n", reg);
1022 add_memrange (collect, reg, offset, len);
1024 case LOC_REGPARM_ADDR:
1025 reg = SYMBOL_VALUE (sym);
1029 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
1030 SYMBOL_PRINT_NAME (sym), len);
1031 printf_vma (offset);
1032 printf_filtered (" from reg %d\n", reg);
1034 add_memrange (collect, reg, offset, len);
1038 offset = frame_offset + SYMBOL_VALUE (sym);
1041 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1042 SYMBOL_PRINT_NAME (sym), len);
1043 printf_vma (offset);
1044 printf_filtered (" from frame ptr reg %d\n", reg);
1046 add_memrange (collect, reg, offset, len);
1049 case LOC_UNRESOLVED:
1053 case LOC_OPTIMIZED_OUT:
1054 printf_filtered ("%s has been optimized out of existence.\n",
1055 SYMBOL_PRINT_NAME (sym));
1063 /* Expressions are the most general case. */
1066 struct agent_expr *aexpr;
1067 struct cleanup *old_chain1 = NULL;
1069 aexpr = gen_trace_for_var (scope, gdbarch, sym);
1071 /* It can happen that the symbol is recorded as a computed
1072 location, but it's been optimized away and doesn't actually
1073 have a location expression. */
1076 printf_filtered ("%s has been optimized out of existence.\n",
1077 SYMBOL_PRINT_NAME (sym));
1081 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1085 report_agent_reqs_errors (aexpr);
1087 discard_cleanups (old_chain1);
1088 add_aexpr (collect, aexpr);
1090 /* Take care of the registers. */
1091 if (aexpr->reg_mask_len > 0)
1095 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1097 QUIT; /* Allow user to bail out with ^C. */
1098 if (aexpr->reg_mask[ndx1] != 0)
1100 /* Assume chars have 8 bits. */
1101 for (ndx2 = 0; ndx2 < 8; ndx2++)
1102 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1103 /* It's used -- record it. */
1104 add_register (collect, ndx1 * 8 + ndx2);
1111 /* Data to be passed around in the calls to the locals and args
1114 struct add_local_symbols_data
1116 struct collection_list *collect;
1117 struct gdbarch *gdbarch;
1124 /* The callback for the locals and args iterators. */
1127 do_collect_symbol (const char *print_name,
1131 struct add_local_symbols_data *p = cb_data;
1133 collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1134 p->frame_offset, p->pc);
1138 /* Add all locals (or args) symbols to collection list. */
1140 add_local_symbols (struct collection_list *collect,
1141 struct gdbarch *gdbarch, CORE_ADDR pc,
1142 long frame_regno, long frame_offset, int type)
1144 struct block *block;
1145 struct add_local_symbols_data cb_data;
1147 cb_data.collect = collect;
1148 cb_data.gdbarch = gdbarch;
1150 cb_data.frame_regno = frame_regno;
1151 cb_data.frame_offset = frame_offset;
1156 block = block_for_pc (pc);
1159 warning (_("Can't collect locals; "
1160 "no symbol table info available.\n"));
1164 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1165 if (cb_data.count == 0)
1166 warning (_("No locals found in scope."));
1170 pc = get_pc_function_start (pc);
1171 block = block_for_pc (pc);
1174 warning (_("Can't collect args; no symbol table info available."));
1178 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1179 if (cb_data.count == 0)
1180 warning (_("No args found in scope."));
1185 add_static_trace_data (struct collection_list *collection)
1188 printf_filtered ("collect static trace data\n");
1189 collection->strace_data = 1;
1192 /* worker function */
1194 clear_collection_list (struct collection_list *list)
1198 list->next_memrange = 0;
1199 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1201 free_agent_expr (list->aexpr_list[ndx]);
1202 list->aexpr_list[ndx] = NULL;
1204 list->next_aexpr_elt = 0;
1205 memset (list->regs_mask, 0, sizeof (list->regs_mask));
1206 list->strace_data = 0;
1209 /* Reduce a collection list to string form (for gdb protocol). */
1211 stringify_collection_list (struct collection_list *list, char *string)
1213 char temp_buf[2048];
1217 char *(*str_list)[];
1221 count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
1222 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1224 if (list->strace_data)
1227 printf_filtered ("\nCollecting static trace data\n");
1230 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1234 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1235 if (list->regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1237 if (list->regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1240 printf_filtered ("\nCollecting registers (mask): 0x");
1245 QUIT; /* Allow user to bail out with ^C. */
1247 printf_filtered ("%02X", list->regs_mask[i]);
1248 sprintf (end, "%02X", list->regs_mask[i]);
1251 (*str_list)[ndx] = xstrdup (temp_buf);
1255 printf_filtered ("\n");
1256 if (list->next_memrange > 0 && info_verbose)
1257 printf_filtered ("Collecting memranges: \n");
1258 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1260 QUIT; /* Allow user to bail out with ^C. */
1261 sprintf_vma (tmp2, list->list[i].start);
1264 printf_filtered ("(%d, %s, %ld)\n",
1267 (long) (list->list[i].end - list->list[i].start));
1269 if (count + 27 > MAX_AGENT_EXPR_LEN)
1271 (*str_list)[ndx] = savestring (temp_buf, count);
1278 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1280 /* The "%X" conversion specifier expects an unsigned argument,
1281 so passing -1 (memrange_absolute) to it directly gives you
1282 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1284 if (list->list[i].type == memrange_absolute)
1285 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1287 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1290 count += strlen (end);
1291 end = temp_buf + count;
1294 for (i = 0; i < list->next_aexpr_elt; i++)
1296 QUIT; /* Allow user to bail out with ^C. */
1297 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1299 (*str_list)[ndx] = savestring (temp_buf, count);
1304 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1305 end += 10; /* 'X' + 8 hex digits + ',' */
1308 end = mem2hex (list->aexpr_list[i]->buf,
1309 end, list->aexpr_list[i]->len);
1310 count += 2 * list->aexpr_list[i]->len;
1315 (*str_list)[ndx] = savestring (temp_buf, count);
1320 (*str_list)[ndx] = NULL;
1333 encode_actions_1 (struct command_line *action,
1334 struct breakpoint *t,
1335 struct bp_location *tloc,
1337 LONGEST frame_offset,
1338 struct collection_list *collect,
1339 struct collection_list *stepping_list)
1342 struct expression *exp = NULL;
1344 struct value *tempval;
1345 struct cmd_list_element *cmd;
1346 struct agent_expr *aexpr;
1348 for (; action; action = action->next)
1350 QUIT; /* Allow user to bail out with ^C. */
1351 action_exp = action->line;
1352 while (isspace ((int) *action_exp))
1355 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1357 error (_("Bad action list item: %s"), action_exp);
1359 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1361 trace_string_kludge = 0;
1362 if (*action_exp == '/')
1363 action_exp = decode_agent_options (action_exp);
1366 { /* Repeat over a comma-separated list. */
1367 QUIT; /* Allow user to bail out with ^C. */
1368 while (isspace ((int) *action_exp))
1371 if (0 == strncasecmp ("$reg", action_exp, 4))
1373 for (i = 0; i < gdbarch_num_regs (t->gdbarch); i++)
1374 add_register (collect, i);
1375 action_exp = strchr (action_exp, ','); /* more? */
1377 else if (0 == strncasecmp ("$arg", action_exp, 4))
1379 add_local_symbols (collect,
1385 action_exp = strchr (action_exp, ','); /* more? */
1387 else if (0 == strncasecmp ("$loc", action_exp, 4))
1389 add_local_symbols (collect,
1395 action_exp = strchr (action_exp, ','); /* more? */
1397 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1399 struct cleanup *old_chain1 = NULL;
1401 aexpr = gen_trace_for_return_address (tloc->address,
1404 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1407 report_agent_reqs_errors (aexpr);
1409 discard_cleanups (old_chain1);
1410 add_aexpr (collect, aexpr);
1412 /* take care of the registers */
1413 if (aexpr->reg_mask_len > 0)
1417 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1419 QUIT; /* allow user to bail out with ^C */
1420 if (aexpr->reg_mask[ndx1] != 0)
1422 /* assume chars have 8 bits */
1423 for (ndx2 = 0; ndx2 < 8; ndx2++)
1424 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1425 /* it's used -- record it */
1426 add_register (collect,
1432 action_exp = strchr (action_exp, ','); /* more? */
1434 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1436 add_static_trace_data (collect);
1437 action_exp = strchr (action_exp, ','); /* more? */
1441 unsigned long addr, len;
1442 struct cleanup *old_chain = NULL;
1443 struct cleanup *old_chain1 = NULL;
1445 exp = parse_exp_1 (&action_exp,
1446 block_for_pc (tloc->address), 1);
1447 old_chain = make_cleanup (free_current_contents, &exp);
1449 switch (exp->elts[0].opcode)
1453 const char *name = &exp->elts[2].string;
1455 i = user_reg_map_name_to_regnum (t->gdbarch,
1456 name, strlen (name));
1458 internal_error (__FILE__, __LINE__,
1459 _("Register $%s not available"),
1462 printf_filtered ("OP_REGISTER: ");
1463 add_register (collect, i);
1468 /* Safe because we know it's a simple expression. */
1469 tempval = evaluate_expression (exp);
1470 addr = value_address (tempval);
1471 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
1472 add_memrange (collect, memrange_absolute, addr, len);
1476 collect_symbol (collect,
1477 exp->elts[2].symbol,
1484 default: /* Full-fledged expression. */
1485 aexpr = gen_trace_for_expr (tloc->address, exp);
1487 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1491 report_agent_reqs_errors (aexpr);
1493 discard_cleanups (old_chain1);
1494 add_aexpr (collect, aexpr);
1496 /* Take care of the registers. */
1497 if (aexpr->reg_mask_len > 0)
1502 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1504 QUIT; /* Allow user to bail out with ^C. */
1505 if (aexpr->reg_mask[ndx1] != 0)
1507 /* Assume chars have 8 bits. */
1508 for (ndx2 = 0; ndx2 < 8; ndx2++)
1509 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1510 /* It's used -- record it. */
1511 add_register (collect,
1518 do_cleanups (old_chain);
1521 while (action_exp && *action_exp++ == ',');
1523 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1526 { /* Repeat over a comma-separated list. */
1527 QUIT; /* Allow user to bail out with ^C. */
1528 while (isspace ((int) *action_exp))
1532 struct cleanup *old_chain = NULL;
1533 struct cleanup *old_chain1 = NULL;
1535 exp = parse_exp_1 (&action_exp,
1536 block_for_pc (tloc->address), 1);
1537 old_chain = make_cleanup (free_current_contents, &exp);
1539 aexpr = gen_eval_for_expr (tloc->address, exp);
1540 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1543 report_agent_reqs_errors (aexpr);
1545 discard_cleanups (old_chain1);
1546 /* Even though we're not officially collecting, add
1547 to the collect list anyway. */
1548 add_aexpr (collect, aexpr);
1550 do_cleanups (old_chain);
1553 while (action_exp && *action_exp++ == ',');
1555 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1557 /* We check against nested while-stepping when setting
1558 breakpoint action, so no way to run into nested
1560 gdb_assert (stepping_list);
1562 encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
1563 frame_offset, stepping_list, NULL);
1566 error (_("Invalid tracepoint command '%s'"), action->line);
1570 /* Render all actions into gdb protocol. */
1572 encode_actions (struct breakpoint *t, struct bp_location *tloc,
1573 char ***tdp_actions, char ***stepping_actions)
1575 static char tdp_buff[2048], step_buff[2048];
1576 char *default_collect_line = NULL;
1577 struct command_line *actions;
1578 struct command_line *default_collect_action = NULL;
1580 LONGEST frame_offset;
1581 struct cleanup *back_to;
1583 back_to = make_cleanup (null_cleanup, NULL);
1585 clear_collection_list (&tracepoint_list);
1586 clear_collection_list (&stepping_list);
1588 *tdp_actions = NULL;
1589 *stepping_actions = NULL;
1591 gdbarch_virtual_frame_pointer (t->gdbarch,
1592 t->loc->address, &frame_reg, &frame_offset);
1594 actions = breakpoint_commands (t);
1596 /* If there are default expressions to collect, make up a collect
1597 action and prepend to the action list to encode. Note that since
1598 validation is per-tracepoint (local var "xyz" might be valid for
1599 one tracepoint and not another, etc), we make up the action on
1600 the fly, and don't cache it. */
1601 if (*default_collect)
1605 default_collect_line = xstrprintf ("collect %s", default_collect);
1606 make_cleanup (xfree, default_collect_line);
1608 line = default_collect_line;
1609 validate_actionline (&line, t);
1611 default_collect_action = xmalloc (sizeof (struct command_line));
1612 make_cleanup (xfree, default_collect_action);
1613 default_collect_action->next = actions;
1614 default_collect_action->line = line;
1615 actions = default_collect_action;
1617 encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1618 &tracepoint_list, &stepping_list);
1620 memrange_sortmerge (&tracepoint_list);
1621 memrange_sortmerge (&stepping_list);
1623 *tdp_actions = stringify_collection_list (&tracepoint_list,
1625 *stepping_actions = stringify_collection_list (&stepping_list,
1628 do_cleanups (back_to);
1632 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1634 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1636 collect->aexpr_list =
1637 xrealloc (collect->aexpr_list,
1638 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1639 collect->aexpr_listsize *= 2;
1641 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1642 collect->next_aexpr_elt++;
1647 start_tracing (void)
1649 VEC(breakpoint_p) *tp_vec = NULL;
1651 struct breakpoint *b;
1652 struct trace_state_variable *tsv;
1653 int any_enabled = 0, num_to_download = 0;
1655 tp_vec = all_tracepoints ();
1657 /* No point in tracing without any tracepoints... */
1658 if (VEC_length (breakpoint_p, tp_vec) == 0)
1660 VEC_free (breakpoint_p, tp_vec);
1661 error (_("No tracepoints defined, not starting trace"));
1664 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1666 struct tracepoint *t = (struct tracepoint *) b;
1668 if (b->enable_state == bp_enabled)
1671 if ((b->type == bp_fast_tracepoint
1672 ? may_insert_fast_tracepoints
1673 : may_insert_tracepoints))
1676 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1677 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1682 if (target_supports_enable_disable_tracepoint ())
1683 warning (_("No tracepoints enabled"));
1686 /* No point in tracing with only disabled tracepoints that
1687 cannot be re-enabled. */
1688 VEC_free (breakpoint_p, tp_vec);
1689 error (_("No tracepoints enabled, not starting trace"));
1693 if (num_to_download <= 0)
1695 VEC_free (breakpoint_p, tp_vec);
1696 error (_("No tracepoints that may be downloaded, not starting trace"));
1699 target_trace_init ();
1701 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1703 struct tracepoint *t = (struct tracepoint *) b;
1705 if ((b->type == bp_fast_tracepoint
1706 ? !may_insert_fast_tracepoints
1707 : !may_insert_tracepoints))
1710 t->number_on_target = 0;
1711 target_download_tracepoint (b);
1712 t->number_on_target = b->number;
1714 VEC_free (breakpoint_p, tp_vec);
1716 /* Send down all the trace state variables too. */
1717 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1719 target_download_trace_state_variable (tsv);
1722 /* Tell target to treat text-like sections as transparent. */
1723 target_trace_set_readonly_regions ();
1724 /* Set some mode flags. */
1725 target_set_disconnected_tracing (disconnected_tracing);
1726 target_set_circular_trace_buffer (circular_trace_buffer);
1728 /* Now insert traps and begin collecting data. */
1729 target_trace_start ();
1731 /* Reset our local state. */
1732 set_traceframe_num (-1);
1733 set_tracepoint_num (-1);
1734 set_traceframe_context (NULL);
1735 current_trace_status()->running = 1;
1736 clear_traceframe_info ();
1741 Tell target to clear any previous trace experiment.
1742 Walk the list of tracepoints, and send them (and their actions)
1743 to the target. If no errors,
1744 Tell target to start a new trace experiment. */
1747 trace_start_command (char *args, int from_tty)
1749 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1751 if (current_trace_status ()->running)
1754 && !query (_("A trace is running already. Start a new run? ")))
1755 error (_("New trace run not started."));
1763 trace_stop_command (char *args, int from_tty)
1765 if (!current_trace_status ()->running)
1766 error (_("Trace is not running."));
1774 target_trace_stop ();
1775 /* Should change in response to reply? */
1776 current_trace_status ()->running = 0;
1779 /* tstatus command */
1781 trace_status_command (char *args, int from_tty)
1783 struct trace_status *ts = current_trace_status ();
1786 status = target_get_trace_status (ts);
1791 printf_filtered (_("Using a trace file.\n"));
1794 printf_filtered (_("Trace can not be run on this target.\n"));
1799 if (!ts->running_known)
1801 printf_filtered (_("Run/stop status is unknown.\n"));
1803 else if (ts->running)
1805 printf_filtered (_("Trace is running on the target.\n"));
1809 switch (ts->stop_reason)
1811 case trace_never_run:
1812 printf_filtered (_("No trace has been run on the target.\n"));
1815 printf_filtered (_("Trace stopped by a tstop command.\n"));
1817 case trace_buffer_full:
1818 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1820 case trace_disconnected:
1821 printf_filtered (_("Trace stopped because of disconnection.\n"));
1823 case tracepoint_passcount:
1824 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1825 ts->stopping_tracepoint);
1827 case tracepoint_error:
1828 if (ts->stopping_tracepoint)
1829 printf_filtered (_("Trace stopped by an "
1830 "error (%s, tracepoint %d).\n"),
1831 ts->error_desc, ts->stopping_tracepoint);
1833 printf_filtered (_("Trace stopped by an error (%s).\n"),
1836 case trace_stop_reason_unknown:
1837 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1840 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1846 if (ts->traceframes_created >= 0
1847 && ts->traceframe_count != ts->traceframes_created)
1849 printf_filtered (_("Buffer contains %d trace "
1850 "frames (of %d created total).\n"),
1851 ts->traceframe_count, ts->traceframes_created);
1853 else if (ts->traceframe_count >= 0)
1855 printf_filtered (_("Collected %d trace frames.\n"),
1856 ts->traceframe_count);
1859 if (ts->buffer_free >= 0)
1861 if (ts->buffer_size >= 0)
1863 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1864 ts->buffer_free, ts->buffer_size);
1865 if (ts->buffer_size > 0)
1866 printf_filtered (_(" (%d%% full)"),
1867 ((int) ((((long long) (ts->buffer_size
1868 - ts->buffer_free)) * 100)
1869 / ts->buffer_size)));
1870 printf_filtered (_(".\n"));
1873 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1877 if (ts->disconnected_tracing)
1878 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1880 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1882 if (ts->circular_buffer)
1883 printf_filtered (_("Trace buffer is circular.\n"));
1885 /* Now report on what we're doing with tfind. */
1886 if (traceframe_number >= 0)
1887 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1888 traceframe_number, tracepoint_number);
1890 printf_filtered (_("Not looking at any trace frame.\n"));
1893 /* Report the trace status to uiout, in a way suitable for MI, and not
1894 suitable for CLI. If ON_STOP is true, suppress a few fields that
1895 are not meaningful in the -trace-stop response.
1897 The implementation is essentially parallel to trace_status_command, but
1898 merging them will result in unreadable code. */
1900 trace_status_mi (int on_stop)
1902 struct ui_out *uiout = current_uiout;
1903 struct trace_status *ts = current_trace_status ();
1906 status = target_get_trace_status (ts);
1908 if (status == -1 && !ts->from_file)
1910 ui_out_field_string (uiout, "supported", "0");
1915 ui_out_field_string (uiout, "supported", "file");
1917 ui_out_field_string (uiout, "supported", "1");
1919 gdb_assert (ts->running_known);
1923 ui_out_field_string (uiout, "running", "1");
1925 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1926 Given that the frontend gets the status either on -trace-stop, or from
1927 -trace-status after re-connection, it does not seem like this
1928 information is necessary for anything. It is not necessary for either
1929 figuring the vital state of the target nor for navigation of trace
1930 frames. If the frontend wants to show the current state is some
1931 configure dialog, it can request the value when such dialog is
1932 invoked by the user. */
1936 char *stop_reason = NULL;
1937 int stopping_tracepoint = -1;
1940 ui_out_field_string (uiout, "running", "0");
1942 if (ts->stop_reason != trace_stop_reason_unknown)
1944 switch (ts->stop_reason)
1947 stop_reason = "request";
1949 case trace_buffer_full:
1950 stop_reason = "overflow";
1952 case trace_disconnected:
1953 stop_reason = "disconnection";
1955 case tracepoint_passcount:
1956 stop_reason = "passcount";
1957 stopping_tracepoint = ts->stopping_tracepoint;
1959 case tracepoint_error:
1960 stop_reason = "error";
1961 stopping_tracepoint = ts->stopping_tracepoint;
1967 ui_out_field_string (uiout, "stop-reason", stop_reason);
1968 if (stopping_tracepoint != -1)
1969 ui_out_field_int (uiout, "stopping-tracepoint",
1970 stopping_tracepoint);
1971 if (ts->stop_reason == tracepoint_error)
1972 ui_out_field_string (uiout, "error-description",
1978 if (ts->traceframe_count != -1)
1979 ui_out_field_int (uiout, "frames", ts->traceframe_count);
1980 if (ts->traceframes_created != -1)
1981 ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
1982 if (ts->buffer_size != -1)
1983 ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
1984 if (ts->buffer_free != -1)
1985 ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
1987 ui_out_field_int (uiout, "disconnected", ts->disconnected_tracing);
1988 ui_out_field_int (uiout, "circular", ts->circular_buffer);
1991 /* This function handles the details of what to do about an ongoing
1992 tracing run if the user has asked to detach or otherwise disconnect
1995 disconnect_tracing (int from_tty)
1997 /* It can happen that the target that was tracing went away on its
1998 own, and we didn't notice. Get a status update, and if the
1999 current target doesn't even do tracing, then assume it's not
2001 if (target_get_trace_status (current_trace_status ()) < 0)
2002 current_trace_status ()->running = 0;
2004 /* If running interactively, give the user the option to cancel and
2005 then decide what to do differently with the run. Scripts are
2006 just going to disconnect and let the target deal with it,
2007 according to how it's been instructed previously via
2008 disconnected-tracing. */
2009 if (current_trace_status ()->running && from_tty)
2011 if (current_trace_status ()->disconnected_tracing)
2013 if (!query (_("Trace is running and will "
2014 "continue after detach; detach anyway? ")))
2015 error (_("Not confirmed."));
2019 if (!query (_("Trace is running but will "
2020 "stop on detach; detach anyway? ")))
2021 error (_("Not confirmed."));
2025 /* Also we want to be out of tfind mode, otherwise things can get
2026 confusing upon reconnection. Just use these calls instead of
2027 full tfind_1 behavior because we're in the middle of detaching,
2028 and there's no point to updating current stack frame etc. */
2029 set_current_traceframe (-1);
2030 set_traceframe_context (NULL);
2033 /* Worker function for the various flavors of the tfind command. */
2035 tfind_1 (enum trace_find_type type, int num,
2036 ULONGEST addr1, ULONGEST addr2,
2039 int target_frameno = -1, target_tracept = -1;
2040 struct frame_id old_frame_id = null_frame_id;
2041 struct tracepoint *tp;
2042 struct ui_out *uiout = current_uiout;
2044 /* Only try to get the current stack frame if we have a chance of
2045 succeeding. In particular, if we're trying to get a first trace
2046 frame while all threads are running, it's not going to succeed,
2047 so leave it with a default value and let the frame comparison
2048 below (correctly) decide to print out the source location of the
2050 if (!(type == tfind_number && num == -1)
2051 && (has_stack_frames () || traceframe_number >= 0))
2052 old_frame_id = get_frame_id (get_current_frame ());
2054 target_frameno = target_trace_find (type, num, addr1, addr2,
2057 if (type == tfind_number
2059 && target_frameno == -1)
2061 /* We told the target to get out of tfind mode, and it did. */
2063 else if (target_frameno == -1)
2065 /* A request for a non-existent trace frame has failed.
2066 Our response will be different, depending on FROM_TTY:
2068 If FROM_TTY is true, meaning that this command was
2069 typed interactively by the user, then give an error
2070 and DO NOT change the state of traceframe_number etc.
2072 However if FROM_TTY is false, meaning that we're either
2073 in a script, a loop, or a user-defined command, then
2074 DON'T give an error, but DO change the state of
2075 traceframe_number etc. to invalid.
2077 The rationalle is that if you typed the command, you
2078 might just have committed a typo or something, and you'd
2079 like to NOT lose your current debugging state. However
2080 if you're in a user-defined command or especially in a
2081 loop, then you need a way to detect that the command
2082 failed WITHOUT aborting. This allows you to write
2083 scripts that search thru the trace buffer until the end,
2084 and then continue on to do something else. */
2087 error (_("Target failed to find requested trace frame."));
2091 printf_filtered ("End of trace buffer.\n");
2092 #if 0 /* dubious now? */
2093 /* The following will not recurse, since it's
2095 trace_find_command ("-1", from_tty);
2100 tp = get_tracepoint_by_number_on_target (target_tracept);
2102 reinit_frame_cache ();
2103 registers_changed ();
2104 target_dcache_invalidate ();
2105 set_traceframe_num (target_frameno);
2106 clear_traceframe_info ();
2107 set_tracepoint_num (tp ? tp->base.number : target_tracept);
2108 if (target_frameno == -1)
2109 set_traceframe_context (NULL);
2111 set_traceframe_context (get_current_frame ());
2113 if (traceframe_number >= 0)
2115 /* Use different branches for MI and CLI to make CLI messages
2117 if (ui_out_is_mi_like_p (uiout))
2119 ui_out_field_string (uiout, "found", "1");
2120 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2121 ui_out_field_int (uiout, "traceframe", traceframe_number);
2125 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2126 traceframe_number, tracepoint_number);
2131 if (ui_out_is_mi_like_p (uiout))
2132 ui_out_field_string (uiout, "found", "0");
2133 else if (type == tfind_number && num == -1)
2134 printf_unfiltered (_("No longer looking at any trace frame\n"));
2135 else /* This case may never occur, check. */
2136 printf_unfiltered (_("No trace frame found\n"));
2139 /* If we're in nonstop mode and getting out of looking at trace
2140 frames, there won't be any current frame to go back to and
2143 && (has_stack_frames () || traceframe_number >= 0))
2145 enum print_what print_what;
2147 /* NOTE: in imitation of the step command, try to determine
2148 whether we have made a transition from one function to
2149 another. If so, we'll print the "stack frame" (ie. the new
2150 function and it's arguments) -- otherwise we'll just show the
2153 if (frame_id_eq (old_frame_id,
2154 get_frame_id (get_current_frame ())))
2155 print_what = SRC_LINE;
2157 print_what = SRC_AND_LOC;
2159 print_stack_frame (get_selected_frame (NULL), 1, print_what);
2164 /* trace_find_command takes a trace frame number n,
2165 sends "QTFrame:<n>" to the target,
2166 and accepts a reply that may contain several optional pieces
2167 of information: a frame number, a tracepoint number, and an
2168 indication of whether this is a trap frame or a stepping frame.
2170 The minimal response is just "OK" (which indicates that the
2171 target does not give us a frame number or a tracepoint number).
2172 Instead of that, the target may send us a string containing
2174 F<hexnum> (gives the selected frame number)
2175 T<hexnum> (gives the selected tracepoint number)
2180 trace_find_command (char *args, int from_tty)
2181 { /* This should only be called with a numeric argument. */
2184 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2185 error (_("May not look at trace frames while trace is running."));
2187 if (args == 0 || *args == 0)
2188 { /* TFIND with no args means find NEXT trace frame. */
2189 if (traceframe_number == -1)
2190 frameno = 0; /* "next" is first one. */
2192 frameno = traceframe_number + 1;
2194 else if (0 == strcmp (args, "-"))
2196 if (traceframe_number == -1)
2197 error (_("not debugging trace buffer"));
2198 else if (from_tty && traceframe_number == 0)
2199 error (_("already at start of trace buffer"));
2201 frameno = traceframe_number - 1;
2203 /* A hack to work around eval's need for fp to have been collected. */
2204 else if (0 == strcmp (args, "-1"))
2207 frameno = parse_and_eval_long (args);
2210 error (_("invalid input (%d is less than zero)"), frameno);
2212 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2217 trace_find_end_command (char *args, int from_tty)
2219 trace_find_command ("-1", from_tty);
2224 trace_find_none_command (char *args, int from_tty)
2226 trace_find_command ("-1", from_tty);
2231 trace_find_start_command (char *args, int from_tty)
2233 trace_find_command ("0", from_tty);
2236 /* tfind pc command */
2238 trace_find_pc_command (char *args, int from_tty)
2242 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2243 error (_("May not look at trace frames while trace is running."));
2245 if (args == 0 || *args == 0)
2246 pc = regcache_read_pc (get_current_regcache ());
2248 pc = parse_and_eval_address (args);
2250 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2253 /* tfind tracepoint command */
2255 trace_find_tracepoint_command (char *args, int from_tty)
2258 struct tracepoint *tp;
2260 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2261 error (_("May not look at trace frames while trace is running."));
2263 if (args == 0 || *args == 0)
2265 if (tracepoint_number == -1)
2266 error (_("No current tracepoint -- please supply an argument."));
2268 tdp = tracepoint_number; /* Default is current TDP. */
2271 tdp = parse_and_eval_long (args);
2273 /* If we have the tracepoint on hand, use the number that the
2274 target knows about (which may be different if we disconnected
2275 and reconnected). */
2276 tp = get_tracepoint (tdp);
2278 tdp = tp->number_on_target;
2280 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2283 /* TFIND LINE command:
2285 This command will take a sourceline for argument, just like BREAK
2286 or TRACE (ie. anything that "decode_line_1" can handle).
2288 With no argument, this command will find the next trace frame
2289 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2292 trace_find_line_command (char *args, int from_tty)
2294 static CORE_ADDR start_pc, end_pc;
2295 struct symtabs_and_lines sals;
2296 struct symtab_and_line sal;
2297 struct cleanup *old_chain;
2299 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2300 error (_("May not look at trace frames while trace is running."));
2302 if (args == 0 || *args == 0)
2304 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2306 sals.sals = (struct symtab_and_line *)
2307 xmalloc (sizeof (struct symtab_and_line));
2312 sals = decode_line_spec (args, 1);
2316 old_chain = make_cleanup (xfree, sals.sals);
2317 if (sal.symtab == 0)
2318 error (_("No line number information available."));
2320 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2322 if (start_pc == end_pc)
2324 printf_filtered ("Line %d of \"%s\"",
2325 sal.line, sal.symtab->filename);
2327 printf_filtered (" is at address ");
2328 print_address (get_current_arch (), start_pc, gdb_stdout);
2330 printf_filtered (" but contains no code.\n");
2331 sal = find_pc_line (start_pc, 0);
2333 && find_line_pc_range (sal, &start_pc, &end_pc)
2334 && start_pc != end_pc)
2335 printf_filtered ("Attempting to find line %d instead.\n",
2338 error (_("Cannot find a good line."));
2342 /* Is there any case in which we get here, and have an address
2343 which the user would want to see? If we have debugging
2344 symbols and no line numbers? */
2345 error (_("Line number %d is out of range for \"%s\"."),
2346 sal.line, sal.symtab->filename);
2348 /* Find within range of stated line. */
2350 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2352 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2353 do_cleanups (old_chain);
2356 /* tfind range command */
2358 trace_find_range_command (char *args, int from_tty)
2360 static CORE_ADDR start, stop;
2363 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2364 error (_("May not look at trace frames while trace is running."));
2366 if (args == 0 || *args == 0)
2367 { /* XXX FIXME: what should default behavior be? */
2368 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2372 if (0 != (tmp = strchr (args, ',')))
2374 *tmp++ = '\0'; /* Terminate start address. */
2375 while (isspace ((int) *tmp))
2377 start = parse_and_eval_address (args);
2378 stop = parse_and_eval_address (tmp);
2381 { /* No explicit end address? */
2382 start = parse_and_eval_address (args);
2383 stop = start + 1; /* ??? */
2386 tfind_1 (tfind_range, 0, start, stop, from_tty);
2389 /* tfind outside command */
2391 trace_find_outside_command (char *args, int from_tty)
2393 CORE_ADDR start, stop;
2396 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2397 error (_("May not look at trace frames while trace is running."));
2399 if (args == 0 || *args == 0)
2400 { /* XXX FIXME: what should default behavior be? */
2401 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2405 if (0 != (tmp = strchr (args, ',')))
2407 *tmp++ = '\0'; /* Terminate start address. */
2408 while (isspace ((int) *tmp))
2410 start = parse_and_eval_address (args);
2411 stop = parse_and_eval_address (tmp);
2414 { /* No explicit end address? */
2415 start = parse_and_eval_address (args);
2416 stop = start + 1; /* ??? */
2419 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2422 /* info scope command: list the locals for a scope. */
2424 scope_info (char *args, int from_tty)
2426 struct symtabs_and_lines sals;
2428 struct minimal_symbol *msym;
2429 struct block *block;
2430 char *symname, *save_args = args;
2431 struct dict_iterator iter;
2433 struct gdbarch *gdbarch;
2436 if (args == 0 || *args == 0)
2437 error (_("requires an argument (function, "
2438 "line or *addr) to define a scope"));
2440 sals = decode_line_1 (&args, 1, NULL, 0, NULL);
2441 if (sals.nelts == 0)
2442 return; /* Presumably decode_line_1 has already warned. */
2444 /* Resolve line numbers to PC. */
2445 resolve_sal_pc (&sals.sals[0]);
2446 block = block_for_pc (sals.sals[0].pc);
2450 QUIT; /* Allow user to bail out with ^C. */
2451 ALL_BLOCK_SYMBOLS (block, iter, sym)
2453 QUIT; /* Allow user to bail out with ^C. */
2455 printf_filtered ("Scope for %s:\n", save_args);
2458 symname = SYMBOL_PRINT_NAME (sym);
2459 if (symname == NULL || *symname == '\0')
2460 continue; /* Probably botched, certainly useless. */
2462 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2464 printf_filtered ("Symbol %s is ", symname);
2465 switch (SYMBOL_CLASS (sym))
2468 case LOC_UNDEF: /* Messed up symbol? */
2469 printf_filtered ("a bogus symbol, class %d.\n",
2470 SYMBOL_CLASS (sym));
2471 count--; /* Don't count this one. */
2474 printf_filtered ("a constant with value %ld (0x%lx)",
2475 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2477 case LOC_CONST_BYTES:
2478 printf_filtered ("constant bytes: ");
2479 if (SYMBOL_TYPE (sym))
2480 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2481 fprintf_filtered (gdb_stdout, " %02x",
2482 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2485 printf_filtered ("in static storage at address ");
2486 printf_filtered ("%s", paddress (gdbarch,
2487 SYMBOL_VALUE_ADDRESS (sym)));
2490 /* GDBARCH is the architecture associated with the objfile
2491 the symbol is defined in; the target architecture may be
2492 different, and may provide additional registers. However,
2493 we do not know the target architecture at this point.
2494 We assume the objfile architecture will contain all the
2495 standard registers that occur in debug info in that
2497 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2500 if (SYMBOL_IS_ARGUMENT (sym))
2501 printf_filtered ("an argument in register $%s",
2502 gdbarch_register_name (gdbarch, regno));
2504 printf_filtered ("a local variable in register $%s",
2505 gdbarch_register_name (gdbarch, regno));
2508 printf_filtered ("an argument at stack/frame offset %ld",
2509 SYMBOL_VALUE (sym));
2512 printf_filtered ("a local variable at frame offset %ld",
2513 SYMBOL_VALUE (sym));
2516 printf_filtered ("a reference argument at offset %ld",
2517 SYMBOL_VALUE (sym));
2519 case LOC_REGPARM_ADDR:
2520 /* Note comment at LOC_REGISTER. */
2521 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2523 printf_filtered ("the address of an argument, in register $%s",
2524 gdbarch_register_name (gdbarch, regno));
2527 printf_filtered ("a typedef.\n");
2530 printf_filtered ("a label at address ");
2531 printf_filtered ("%s", paddress (gdbarch,
2532 SYMBOL_VALUE_ADDRESS (sym)));
2535 printf_filtered ("a function at address ");
2536 printf_filtered ("%s",
2537 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2539 case LOC_UNRESOLVED:
2540 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2543 printf_filtered ("Unresolved Static");
2546 printf_filtered ("static storage at address ");
2547 printf_filtered ("%s",
2548 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2551 case LOC_OPTIMIZED_OUT:
2552 printf_filtered ("optimized out.\n");
2555 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2556 BLOCK_START (block),
2560 if (SYMBOL_TYPE (sym))
2561 printf_filtered (", length %d.\n",
2562 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2564 if (BLOCK_FUNCTION (block))
2567 block = BLOCK_SUPERBLOCK (block);
2570 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2574 /* worker function (cleanup) */
2576 replace_comma (void *data)
2583 /* Helper for trace_dump_command. Dump the action list starting at
2584 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2585 actions of the body of a while-stepping action. STEPPING_FRAME is
2586 set if the current traceframe was determined to be a while-stepping
2590 trace_dump_actions (struct command_line *action,
2591 int stepping_actions, int stepping_frame,
2594 char *action_exp, *next_comma;
2596 for (; action != NULL; action = action->next)
2598 struct cmd_list_element *cmd;
2600 QUIT; /* Allow user to bail out with ^C. */
2601 action_exp = action->line;
2602 while (isspace ((int) *action_exp))
2605 /* The collection actions to be done while stepping are
2606 bracketed by the commands "while-stepping" and "end". */
2608 if (*action_exp == '#') /* comment line */
2611 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2613 error (_("Bad action list item: %s"), action_exp);
2615 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2619 for (i = 0; i < action->body_count; ++i)
2620 trace_dump_actions (action->body_list[i],
2621 1, stepping_frame, from_tty);
2623 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2625 /* Display the collected data.
2626 For the trap frame, display only what was collected at
2627 the trap. Likewise for stepping frames, display only
2628 what was collected while stepping. This means that the
2629 two boolean variables, STEPPING_FRAME and
2630 STEPPING_ACTIONS should be equal. */
2631 if (stepping_frame == stepping_actions)
2633 if (*action_exp == '/')
2634 action_exp = decode_agent_options (action_exp);
2637 { /* Repeat over a comma-separated list. */
2638 QUIT; /* Allow user to bail out with ^C. */
2639 if (*action_exp == ',')
2641 while (isspace ((int) *action_exp))
2644 next_comma = strchr (action_exp, ',');
2646 if (0 == strncasecmp (action_exp, "$reg", 4))
2647 registers_info (NULL, from_tty);
2648 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2650 else if (0 == strncasecmp (action_exp, "$loc", 4))
2651 locals_info (NULL, from_tty);
2652 else if (0 == strncasecmp (action_exp, "$arg", 4))
2653 args_info (NULL, from_tty);
2658 make_cleanup (replace_comma, next_comma);
2661 printf_filtered ("%s = ", action_exp);
2662 output_command (action_exp, from_tty);
2663 printf_filtered ("\n");
2667 action_exp = next_comma;
2669 while (action_exp && *action_exp == ',');
2675 /* The tdump command. */
2678 trace_dump_command (char *args, int from_tty)
2680 struct regcache *regcache;
2681 struct tracepoint *t;
2682 int stepping_frame = 0;
2683 struct bp_location *loc;
2684 char *line, *default_collect_line = NULL;
2685 struct command_line *actions, *default_collect_action = NULL;
2686 struct cleanup *old_chain = NULL;
2688 if (tracepoint_number == -1)
2690 warning (_("No current trace frame."));
2694 t = get_tracepoint (tracepoint_number);
2697 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2700 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2701 tracepoint_number, traceframe_number);
2703 /* The current frame is a trap frame if the frame PC is equal
2704 to the tracepoint PC. If not, then the current frame was
2705 collected during single-stepping. */
2707 regcache = get_current_regcache ();
2709 /* If the traceframe's address matches any of the tracepoint's
2710 locations, assume it is a direct hit rather than a while-stepping
2711 frame. (FIXME this is not reliable, should record each frame's
2714 for (loc = t->base.loc; loc; loc = loc->next)
2715 if (loc->address == regcache_read_pc (regcache))
2718 actions = breakpoint_commands (&t->base);
2720 /* If there is a default-collect list, make up a collect command,
2721 prepend to the tracepoint's commands, and pass the whole mess to
2722 the trace dump scanner. We need to validate because
2723 default-collect might have been junked since the trace run. */
2724 if (*default_collect)
2726 default_collect_line = xstrprintf ("collect %s", default_collect);
2727 old_chain = make_cleanup (xfree, default_collect_line);
2728 line = default_collect_line;
2729 validate_actionline (&line, &t->base);
2730 default_collect_action = xmalloc (sizeof (struct command_line));
2731 make_cleanup (xfree, default_collect_action);
2732 default_collect_action->next = actions;
2733 default_collect_action->line = line;
2734 actions = default_collect_action;
2737 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2739 if (*default_collect)
2740 do_cleanups (old_chain);
2743 /* Encode a piece of a tracepoint's source-level definition in a form
2744 that is suitable for both protocol and saving in files. */
2745 /* This version does not do multiple encodes for long strings; it should
2746 return an offset to the next piece to encode. FIXME */
2749 encode_source_string (int tpnum, ULONGEST addr,
2750 char *srctype, char *src, char *buf, int buf_size)
2752 if (80 + strlen (srctype) > buf_size)
2753 error (_("Buffer too small for source encoding"));
2754 sprintf (buf, "%x:%s:%s:%x:%x:",
2755 tpnum, phex_nz (addr, sizeof (addr)),
2756 srctype, 0, (int) strlen (src));
2757 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2758 error (_("Source string too long for buffer"));
2759 bin2hex (src, buf + strlen (buf), 0);
2763 extern int trace_regblock_size;
2765 /* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2766 non-zero, the save is performed on the target, otherwise GDB obtains all
2767 trace data and saves it locally. */
2770 trace_save (const char *filename, int target_does_save)
2772 struct cleanup *cleanup;
2774 struct trace_status *ts = current_trace_status ();
2777 struct uploaded_tp *uploaded_tps = NULL, *utp;
2778 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2782 ULONGEST offset = 0;
2783 #define MAX_TRACE_UPLOAD 2000
2784 gdb_byte buf[MAX_TRACE_UPLOAD];
2787 /* If the target is to save the data to a file on its own, then just
2788 send the command and be done with it. */
2789 if (target_does_save)
2791 err = target_save_trace_data (filename);
2793 error (_("Target failed to save trace data to '%s'."),
2798 /* Get the trace status first before opening the file, so if the
2799 target is losing, we can get out without touching files. */
2800 status = target_get_trace_status (ts);
2802 pathname = tilde_expand (filename);
2803 cleanup = make_cleanup (xfree, pathname);
2805 fp = fopen (pathname, "wb");
2807 error (_("Unable to open file '%s' for saving trace data (%s)"),
2808 filename, safe_strerror (errno));
2809 make_cleanup_fclose (fp);
2811 /* Write a file header, with a high-bit-set char to indicate a
2812 binary file, plus a hint as what this file is, and a version
2813 number in case of future needs. */
2814 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
2816 perror_with_name (pathname);
2818 /* Write descriptive info. */
2820 /* Write out the size of a register block. */
2821 fprintf (fp, "R %x\n", trace_regblock_size);
2823 /* Write out status of the tracing run (aka "tstatus" info). */
2824 fprintf (fp, "status %c;%s",
2825 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
2826 if (ts->stop_reason == tracepoint_error)
2828 char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
2830 bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
2831 fprintf (fp, ":%s", buf);
2833 fprintf (fp, ":%x", ts->stopping_tracepoint);
2834 if (ts->traceframe_count >= 0)
2835 fprintf (fp, ";tframes:%x", ts->traceframe_count);
2836 if (ts->traceframes_created >= 0)
2837 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2838 if (ts->buffer_free >= 0)
2839 fprintf (fp, ";tfree:%x", ts->buffer_free);
2840 if (ts->buffer_size >= 0)
2841 fprintf (fp, ";tsize:%x", ts->buffer_size);
2842 if (ts->disconnected_tracing)
2843 fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
2844 if (ts->circular_buffer)
2845 fprintf (fp, ";circular:%x", ts->circular_buffer);
2848 /* Note that we want to upload tracepoints and save those, rather
2849 than simply writing out the local ones, because the user may have
2850 changed tracepoints in GDB in preparation for a future tracing
2851 run, or maybe just mass-deleted all types of breakpoints as part
2852 of cleaning up. So as not to contaminate the session, leave the
2853 data in its uploaded form, don't make into real tracepoints. */
2855 /* Get trace state variables first, they may be checked when parsing
2856 uploaded commands. */
2858 target_upload_trace_state_variables (&uploaded_tsvs);
2860 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2866 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2867 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2870 fprintf (fp, "tsv %x:%s:%x:%s\n",
2871 utsv->number, phex_nz (utsv->initial_value, 8),
2872 utsv->builtin, buf);
2878 free_uploaded_tsvs (&uploaded_tsvs);
2880 target_upload_tracepoints (&uploaded_tps);
2882 for (utp = uploaded_tps; utp; utp = utp->next)
2884 fprintf (fp, "tp T%x:%s:%c:%x:%x",
2885 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2886 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2887 if (utp->type == bp_fast_tracepoint)
2888 fprintf (fp, ":F%x", utp->orig_size);
2890 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2893 for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
2894 fprintf (fp, "tp A%x:%s:%s\n",
2895 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2896 for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
2897 fprintf (fp, "tp S%x:%s:%s\n",
2898 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2901 encode_source_string (utp->number, utp->addr,
2902 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
2903 fprintf (fp, "tp Z%s\n", buf);
2905 if (utp->cond_string)
2907 encode_source_string (utp->number, utp->addr,
2908 "cond", utp->cond_string,
2909 buf, MAX_TRACE_UPLOAD);
2910 fprintf (fp, "tp Z%s\n", buf);
2912 for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
2914 encode_source_string (utp->number, utp->addr, "cmd", act,
2915 buf, MAX_TRACE_UPLOAD);
2916 fprintf (fp, "tp Z%s\n", buf);
2920 free_uploaded_tps (&uploaded_tps);
2922 /* Mark the end of the definition section. */
2925 /* Get and write the trace data proper. We ask for big blocks, in
2926 the hopes of efficiency, but will take less if the target has
2927 packet size limitations or some such. */
2930 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2932 error (_("Failure to get requested trace buffer data"));
2933 /* No more data is forthcoming, we're done. */
2936 written = fwrite (buf, gotten, 1, fp);
2938 perror_with_name (pathname);
2942 /* Mark the end of trace data. (We know that gotten is 0 at this point.) */
2943 written = fwrite (&gotten, 4, 1, fp);
2945 perror_with_name (pathname);
2947 do_cleanups (cleanup);
2951 trace_save_command (char *args, int from_tty)
2953 int target_does_save = 0;
2955 char *filename = NULL;
2956 struct cleanup *back_to;
2959 error_no_arg (_("file in which to save trace data"));
2961 argv = gdb_buildargv (args);
2962 back_to = make_cleanup_freeargv (argv);
2964 for (; *argv; ++argv)
2966 if (strcmp (*argv, "-r") == 0)
2967 target_does_save = 1;
2968 else if (**argv == '-')
2969 error (_("unknown option `%s'"), *argv);
2975 error_no_arg (_("file in which to save trace data"));
2977 trace_save (filename, target_does_save);
2980 printf_filtered (_("Trace data saved to file '%s'.\n"), filename);
2982 do_cleanups (back_to);
2985 /* Tell the target what to do with an ongoing tracing run if GDB
2986 disconnects for some reason. */
2989 send_disconnected_tracing_value (int value)
2991 target_set_disconnected_tracing (value);
2995 set_disconnected_tracing (char *args, int from_tty,
2996 struct cmd_list_element *c)
2998 send_disconnected_tracing_value (disconnected_tracing);
3002 set_circular_trace_buffer (char *args, int from_tty,
3003 struct cmd_list_element *c)
3005 target_set_circular_trace_buffer (circular_trace_buffer);
3008 /* Convert the memory pointed to by mem into hex, placing result in buf.
3009 * Return a pointer to the last char put in buf (null)
3010 * "stolen" from sparc-stub.c
3013 static const char hexchars[] = "0123456789abcdef";
3016 mem2hex (gdb_byte *mem, char *buf, int count)
3024 *buf++ = hexchars[ch >> 4];
3025 *buf++ = hexchars[ch & 0xf];
3034 get_traceframe_number (void)
3036 return traceframe_number;
3039 /* Make the traceframe NUM be the current trace frame. Does nothing
3040 if NUM is already current. */
3043 set_current_traceframe (int num)
3047 if (traceframe_number == num)
3049 /* Nothing to do. */
3053 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3056 warning (_("could not change traceframe"));
3058 traceframe_number = newnum;
3060 /* Changing the traceframe changes our view of registers and of the
3062 registers_changed ();
3064 clear_traceframe_info ();
3067 /* Make the traceframe NUM be the current trace frame, and do nothing
3071 set_traceframe_number (int num)
3073 traceframe_number = num;
3076 /* A cleanup used when switching away and back from tfind mode. */
3078 struct current_traceframe_cleanup
3080 /* The traceframe we were inspecting. */
3081 int traceframe_number;
3085 do_restore_current_traceframe_cleanup (void *arg)
3087 struct current_traceframe_cleanup *old = arg;
3089 set_current_traceframe (old->traceframe_number);
3093 restore_current_traceframe_cleanup_dtor (void *arg)
3095 struct current_traceframe_cleanup *old = arg;
3101 make_cleanup_restore_current_traceframe (void)
3103 struct current_traceframe_cleanup *old;
3105 old = xmalloc (sizeof (struct current_traceframe_cleanup));
3106 old->traceframe_number = traceframe_number;
3108 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3109 restore_current_traceframe_cleanup_dtor);
3113 make_cleanup_restore_traceframe_number (void)
3115 return make_cleanup_restore_integer (&traceframe_number);
3118 /* Given a number and address, return an uploaded tracepoint with that
3119 number, creating if necessary. */
3121 struct uploaded_tp *
3122 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3124 struct uploaded_tp *utp;
3126 for (utp = *utpp; utp; utp = utp->next)
3127 if (utp->number == num && utp->addr == addr)
3129 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3130 memset (utp, 0, sizeof (struct uploaded_tp));
3133 utp->actions = NULL;
3134 utp->step_actions = NULL;
3135 utp->cmd_strings = NULL;
3142 free_uploaded_tps (struct uploaded_tp **utpp)
3144 struct uploaded_tp *next_one;
3148 next_one = (*utpp)->next;
3154 /* Given a number and address, return an uploaded tracepoint with that
3155 number, creating if necessary. */
3157 struct uploaded_tsv *
3158 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3160 struct uploaded_tsv *utsv;
3162 for (utsv = *utsvp; utsv; utsv = utsv->next)
3163 if (utsv->number == num)
3165 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3166 memset (utsv, 0, sizeof (struct uploaded_tsv));
3168 utsv->next = *utsvp;
3174 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3176 struct uploaded_tsv *next_one;
3180 next_one = (*utsvp)->next;
3186 /* FIXME this function is heuristic and will miss the cases where the
3187 conditional is semantically identical but differs in whitespace,
3188 such as "x == 0" vs "x==0". */
3191 cond_string_is_same (char *str1, char *str2)
3193 if (str1 == NULL || str2 == NULL)
3194 return (str1 == str2);
3196 return (strcmp (str1, str2) == 0);
3199 /* Look for an existing tracepoint that seems similar enough to the
3200 uploaded one. Enablement isn't compared, because the user can
3201 toggle that freely, and may have done so in anticipation of the
3205 find_matching_tracepoint (struct uploaded_tp *utp)
3207 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3209 struct breakpoint *b;
3210 struct bp_location *loc;
3212 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3214 struct tracepoint *t = (struct tracepoint *) b;
3216 if (b->type == utp->type
3217 && t->step_count == utp->step
3218 && t->pass_count == utp->pass
3219 && cond_string_is_same (t->base.cond_string, utp->cond_string)
3220 /* FIXME also test actions. */
3223 /* Scan the locations for an address match. */
3224 for (loc = b->loc; loc; loc = loc->next)
3226 if (loc->address == utp->addr)
3234 /* Given a list of tracepoints uploaded from a target, attempt to
3235 match them up with existing tracepoints, and create new ones if not
3239 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3241 struct uploaded_tp *utp;
3242 struct tracepoint *t;
3244 /* Look for GDB tracepoints that match up with our uploaded versions. */
3245 for (utp = *uploaded_tps; utp; utp = utp->next)
3247 t = find_matching_tracepoint (utp);
3249 printf_filtered (_("Assuming tracepoint %d is same "
3250 "as target's tracepoint %d at %s.\n"),
3251 t->base.number, utp->number,
3252 paddress (get_current_arch (), utp->addr));
3255 t = create_tracepoint_from_upload (utp);
3257 printf_filtered (_("Created tracepoint %d for "
3258 "target's tracepoint %d at %s.\n"),
3259 t->base.number, utp->number,
3260 paddress (get_current_arch (), utp->addr));
3262 printf_filtered (_("Failed to create tracepoint for target's "
3263 "tracepoint %d at %s, skipping it.\n"),
3265 paddress (get_current_arch (), utp->addr));
3267 /* Whether found or created, record the number used by the
3268 target, to help with mapping target tracepoints back to their
3269 counterparts here. */
3271 t->number_on_target = utp->number;
3274 free_uploaded_tps (uploaded_tps);
3277 /* Trace state variables don't have much to identify them beyond their
3278 name, so just use that to detect matches. */
3280 struct trace_state_variable *
3281 find_matching_tsv (struct uploaded_tsv *utsv)
3286 return find_trace_state_variable (utsv->name);
3289 struct trace_state_variable *
3290 create_tsv_from_upload (struct uploaded_tsv *utsv)
3292 const char *namebase;
3295 struct trace_state_variable *tsv;
3299 namebase = utsv->name;
3300 sprintf (buf, "%s", namebase);
3305 sprintf (buf, "%s_%d", namebase, try_num++);
3308 /* Fish for a name that is not in use. */
3309 /* (should check against all internal vars?) */
3310 while (find_trace_state_variable (buf))
3311 sprintf (buf, "%s_%d", namebase, try_num++);
3313 /* We have an available name, create the variable. */
3314 tsv = create_trace_state_variable (buf);
3315 tsv->initial_value = utsv->initial_value;
3316 tsv->builtin = utsv->builtin;
3321 /* Given a list of uploaded trace state variables, try to match them
3322 up with existing variables, or create additional ones. */
3325 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3328 struct uploaded_tsv *utsv;
3329 struct trace_state_variable *tsv;
3332 /* Most likely some numbers will have to be reassigned as part of
3333 the merge, so clear them all in anticipation. */
3334 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3337 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3339 tsv = find_matching_tsv (utsv);
3343 printf_filtered (_("Assuming trace state variable $%s "
3344 "is same as target's variable %d.\n"),
3345 tsv->name, utsv->number);
3349 tsv = create_tsv_from_upload (utsv);
3351 printf_filtered (_("Created trace state variable "
3352 "$%s for target's variable %d.\n"),
3353 tsv->name, utsv->number);
3355 /* Give precedence to numberings that come from the target. */
3357 tsv->number = utsv->number;
3360 /* Renumber everything that didn't get a target-assigned number. */
3362 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3363 if (tsv->number > highest)
3364 highest = tsv->number;
3367 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3368 if (tsv->number == 0)
3369 tsv->number = highest++;
3371 free_uploaded_tsvs (uploaded_tsvs);
3374 /* target tfile command */
3376 struct target_ops tfile_ops;
3378 /* Fill in tfile_ops with its defined operations and properties. */
3380 #define TRACE_HEADER_SIZE 8
3382 char *trace_filename;
3384 off_t trace_frames_offset;
3386 int cur_traceframe_number;
3388 int trace_regblock_size;
3390 static void tfile_interp_line (char *line,
3391 struct uploaded_tp **utpp,
3392 struct uploaded_tsv **utsvp);
3394 /* Read SIZE bytes into READBUF from the trace frame, starting at
3395 TRACE_FD's current position. Note that this call `read'
3396 underneath, hence it advances the file's seek position. Throws an
3397 error if the `read' syscall fails, or less than SIZE bytes are
3401 tfile_read (gdb_byte *readbuf, int size)
3405 gotten = read (trace_fd, readbuf, size);
3407 perror_with_name (trace_filename);
3408 else if (gotten < size)
3409 error (_("Premature end of file while reading trace file"));
3413 tfile_open (char *filename, int from_tty)
3415 volatile struct gdb_exception ex;
3417 struct cleanup *old_chain;
3420 char header[TRACE_HEADER_SIZE];
3421 char linebuf[1000]; /* Should be max remote packet size or so. */
3424 struct trace_status *ts;
3425 struct uploaded_tp *uploaded_tps = NULL;
3426 struct uploaded_tsv *uploaded_tsvs = NULL;
3428 target_preopen (from_tty);
3430 error (_("No trace file specified."));
3432 filename = tilde_expand (filename);
3433 if (!IS_ABSOLUTE_PATH(filename))
3435 temp = concat (current_directory, "/", filename, (char *) NULL);
3440 old_chain = make_cleanup (xfree, filename);
3442 flags = O_BINARY | O_LARGEFILE;
3444 scratch_chan = open (filename, flags, 0);
3445 if (scratch_chan < 0)
3446 perror_with_name (filename);
3448 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3450 discard_cleanups (old_chain); /* Don't free filename any more. */
3451 unpush_target (&tfile_ops);
3453 trace_filename = xstrdup (filename);
3454 trace_fd = scratch_chan;
3457 /* Read the file header and test for validity. */
3458 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
3460 bytes += TRACE_HEADER_SIZE;
3461 if (!(header[0] == 0x7f
3462 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3463 error (_("File is not a valid trace file."));
3465 push_target (&tfile_ops);
3467 trace_regblock_size = 0;
3468 ts = current_trace_status ();
3469 /* We know we're working with a file. */
3471 /* Set defaults in case there is no status line. */
3472 ts->running_known = 0;
3473 ts->stop_reason = trace_stop_reason_unknown;
3474 ts->traceframe_count = -1;
3475 ts->buffer_free = 0;
3476 ts->disconnected_tracing = 0;
3477 ts->circular_buffer = 0;
3479 cur_traceframe_number = -1;
3481 TRY_CATCH (ex, RETURN_MASK_ALL)
3483 /* Read through a section of newline-terminated lines that
3484 define things like tracepoints. */
3488 tfile_read (&byte, 1);
3493 /* Empty line marks end of the definition section. */
3498 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3501 linebuf[i++] = byte;
3503 error (_("Excessively long lines in trace file"));
3506 /* Record the starting offset of the binary trace data. */
3507 trace_frames_offset = bytes;
3509 /* If we don't have a blocksize, we can't interpret the
3511 if (trace_regblock_size == 0)
3512 error (_("No register block size recorded in trace file"));
3516 /* Pop the partially set up target. */
3518 throw_exception (ex);
3521 inferior_appeared (current_inferior (), TFILE_PID);
3522 inferior_ptid = pid_to_ptid (TFILE_PID);
3523 add_thread_silent (inferior_ptid);
3525 if (ts->traceframe_count <= 0)
3526 warning (_("No traceframes present in this file."));
3528 /* Add the file's tracepoints and variables into the current mix. */
3530 /* Get trace state variables first, they may be checked when parsing
3531 uploaded commands. */
3532 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3534 merge_uploaded_tracepoints (&uploaded_tps);
3536 post_create_inferior (&tfile_ops, from_tty);
3539 /* Interpret the given line from the definitions part of the trace
3543 tfile_interp_line (char *line,
3544 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3548 if (strncmp (p, "R ", strlen ("R ")) == 0)
3551 trace_regblock_size = strtol (p, &p, 16);
3553 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3555 p += strlen ("status ");
3556 parse_trace_status (p, current_trace_status ());
3558 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3560 p += strlen ("tp ");
3561 parse_tracepoint_definition (p, utpp);
3563 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3565 p += strlen ("tsv ");
3566 parse_tsv_definition (p, utsvp);
3569 warning (_("Ignoring trace file definition \"%s\""), line);
3572 /* Parse the part of trace status syntax that is shared between
3573 the remote protocol and the trace file reader. */
3576 parse_trace_status (char *line, struct trace_status *ts)
3578 char *p = line, *p1, *p2, *p_temp;
3581 ts->running_known = 1;
3582 ts->running = (*p++ == '1');
3583 ts->stop_reason = trace_stop_reason_unknown;
3584 xfree (ts->error_desc);
3585 ts->error_desc = NULL;
3586 ts->traceframe_count = -1;
3587 ts->traceframes_created = -1;
3588 ts->buffer_free = -1;
3589 ts->buffer_size = -1;
3590 ts->disconnected_tracing = 0;
3591 ts->circular_buffer = 0;
3595 p1 = strchr (p, ':');
3597 error (_("Malformed trace status, at %s\n\
3598 Status line: '%s'\n"), p, line);
3599 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3601 p = unpack_varlen_hex (++p1, &val);
3602 ts->stop_reason = trace_buffer_full;
3604 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3606 p = unpack_varlen_hex (++p1, &val);
3607 ts->stop_reason = trace_never_run;
3609 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3612 p = unpack_varlen_hex (++p1, &val);
3613 ts->stop_reason = tracepoint_passcount;
3614 ts->stopping_tracepoint = val;
3616 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3618 p = unpack_varlen_hex (++p1, &val);
3619 ts->stop_reason = tstop_command;
3621 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3623 p = unpack_varlen_hex (++p1, &val);
3624 ts->stop_reason = trace_disconnected;
3626 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3628 p2 = strchr (++p1, ':');
3633 ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3634 end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
3635 ts->error_desc[end] = '\0';
3638 ts->error_desc = xstrdup ("");
3640 p = unpack_varlen_hex (++p2, &val);
3641 ts->stopping_tracepoint = val;
3642 ts->stop_reason = tracepoint_error;
3644 else if (strncmp (p, "tframes", p1 - p) == 0)
3646 p = unpack_varlen_hex (++p1, &val);
3647 ts->traceframe_count = val;
3649 else if (strncmp (p, "tcreated", p1 - p) == 0)
3651 p = unpack_varlen_hex (++p1, &val);
3652 ts->traceframes_created = val;
3654 else if (strncmp (p, "tfree", p1 - p) == 0)
3656 p = unpack_varlen_hex (++p1, &val);
3657 ts->buffer_free = val;
3659 else if (strncmp (p, "tsize", p1 - p) == 0)
3661 p = unpack_varlen_hex (++p1, &val);
3662 ts->buffer_size = val;
3664 else if (strncmp (p, "disconn", p1 - p) == 0)
3666 p = unpack_varlen_hex (++p1, &val);
3667 ts->disconnected_tracing = val;
3669 else if (strncmp (p, "circular", p1 - p) == 0)
3671 p = unpack_varlen_hex (++p1, &val);
3672 ts->circular_buffer = val;
3676 /* Silently skip unknown optional info. */
3677 p_temp = strchr (p1 + 1, ';');
3681 /* Must be at the end. */
3687 /* Given a line of text defining a part of a tracepoint, parse it into
3688 an "uploaded tracepoint". */
3691 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3695 ULONGEST num, addr, step, pass, orig_size, xlen, start;
3698 char *cond, *srctype, *buf;
3699 struct uploaded_tp *utp = NULL;
3702 /* Both tracepoint and action definitions start with the same number
3703 and address sequence. */
3705 p = unpack_varlen_hex (p, &num);
3706 p++; /* skip a colon */
3707 p = unpack_varlen_hex (p, &addr);
3708 p++; /* skip a colon */
3711 enabled = (*p++ == 'E');
3712 p++; /* skip a colon */
3713 p = unpack_varlen_hex (p, &step);
3714 p++; /* skip a colon */
3715 p = unpack_varlen_hex (p, &pass);
3716 type = bp_tracepoint;
3718 /* Thumb through optional fields. */
3721 p++; /* skip a colon */
3724 type = bp_fast_tracepoint;
3726 p = unpack_varlen_hex (p, &orig_size);
3730 type = bp_static_tracepoint;
3736 p = unpack_varlen_hex (p, &xlen);
3737 p++; /* skip a comma */
3738 cond = (char *) xmalloc (2 * xlen + 1);
3739 strncpy (cond, p, 2 * xlen);
3740 cond[2 * xlen] = '\0';
3744 warning (_("Unrecognized char '%c' in tracepoint "
3745 "definition, skipping rest"), *p);
3747 utp = get_uploaded_tp (num, addr, utpp);
3749 utp->enabled = enabled;
3754 else if (piece == 'A')
3756 utp = get_uploaded_tp (num, addr, utpp);
3757 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3759 else if (piece == 'S')
3761 utp = get_uploaded_tp (num, addr, utpp);
3762 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3764 else if (piece == 'Z')
3766 /* Parse a chunk of source form definition. */
3767 utp = get_uploaded_tp (num, addr, utpp);
3769 p = strchr (p, ':');
3770 p++; /* skip a colon */
3771 p = unpack_varlen_hex (p, &start);
3772 p++; /* skip a colon */
3773 p = unpack_varlen_hex (p, &xlen);
3774 p++; /* skip a colon */
3776 buf = alloca (strlen (line));
3778 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3781 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
3782 utp->at_string = xstrdup (buf);
3783 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
3784 utp->cond_string = xstrdup (buf);
3785 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
3786 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3790 /* Don't error out, the target might be sending us optional
3791 info that we don't care about. */
3792 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3796 /* Convert a textual description of a trace state variable into an
3800 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3803 ULONGEST num, initval, builtin;
3805 struct uploaded_tsv *utsv = NULL;
3807 buf = alloca (strlen (line));
3810 p = unpack_varlen_hex (p, &num);
3811 p++; /* skip a colon */
3812 p = unpack_varlen_hex (p, &initval);
3813 p++; /* skip a colon */
3814 p = unpack_varlen_hex (p, &builtin);
3815 p++; /* skip a colon */
3816 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3819 utsv = get_uploaded_tsv (num, utsvp);
3820 utsv->initial_value = initval;
3821 utsv->builtin = builtin;
3822 utsv->name = xstrdup (buf);
3825 /* Close the trace file and generally clean up. */
3828 tfile_close (int quitting)
3835 pid = ptid_get_pid (inferior_ptid);
3836 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
3837 exit_inferior_silent (pid);
3841 xfree (trace_filename);
3842 trace_filename = NULL;
3846 tfile_files_info (struct target_ops *t)
3848 /* (it would be useful to mention the name of the file). */
3849 printf_filtered ("Looking at a trace file.\n");
3852 /* The trace status for a file is that tracing can never be run. */
3855 tfile_get_trace_status (struct trace_status *ts)
3857 /* Other bits of trace status were collected as part of opening the
3858 trace files, so nothing to do here. */
3863 /* Given the position of a traceframe in the file, figure out what
3864 address the frame was collected at. This would normally be the
3865 value of a collected PC register, but if not available, we
3869 tfile_get_traceframe_address (off_t tframe_offset)
3873 struct tracepoint *tp;
3874 off_t saved_offset = cur_offset;
3876 /* FIXME dig pc out of collected registers. */
3878 /* Fall back to using tracepoint address. */
3879 lseek (trace_fd, tframe_offset, SEEK_SET);
3880 tfile_read ((gdb_byte *) &tpnum, 2);
3881 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3885 tp = get_tracepoint_by_number_on_target (tpnum);
3886 /* FIXME this is a poor heuristic if multiple locations. */
3887 if (tp && tp->base.loc)
3888 addr = tp->base.loc->address;
3890 /* Restore our seek position. */
3891 cur_offset = saved_offset;
3892 lseek (trace_fd, cur_offset, SEEK_SET);
3896 /* Make tfile's selected traceframe match GDB's selected
3900 set_tfile_traceframe (void)
3904 if (cur_traceframe_number == get_traceframe_number ())
3907 /* Avoid recursion, tfile_trace_find calls us again. */
3908 cur_traceframe_number = get_traceframe_number ();
3910 newnum = target_trace_find (tfind_number,
3911 get_traceframe_number (), 0, 0, NULL);
3913 /* Should not happen. If it does, all bets are off. */
3914 if (newnum != get_traceframe_number ())
3915 warning (_("could not set tfile's traceframe"));
3918 /* Given a type of search and some parameters, scan the collection of
3919 traceframes in the file looking for a match. When found, return
3920 both the traceframe and tracepoint number, otherwise -1 for
3924 tfile_trace_find (enum trace_find_type type, int num,
3925 ULONGEST addr1, ULONGEST addr2, int *tpp)
3928 int tfnum = 0, found = 0;
3929 unsigned int data_size;
3930 struct tracepoint *tp;
3931 off_t offset, tframe_offset;
3934 /* Lookups other than by absolute frame number depend on the current
3935 trace selected, so make sure it is correct on the tfile end
3937 if (type != tfind_number)
3938 set_tfile_traceframe ();
3946 lseek (trace_fd, trace_frames_offset, SEEK_SET);
3947 offset = trace_frames_offset;
3950 tframe_offset = offset;
3951 tfile_read ((gdb_byte *) &tpnum, 2);
3952 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3958 tfile_read ((gdb_byte *) &data_size, 4);
3959 data_size = (unsigned int) extract_unsigned_integer
3960 ((gdb_byte *) &data_size, 4,
3961 gdbarch_byte_order (target_gdbarch));
3970 tfaddr = tfile_get_traceframe_address (tframe_offset);
3971 if (tfaddr == addr1)
3975 tp = get_tracepoint (num);
3976 if (tp && tpnum == tp->number_on_target)
3980 tfaddr = tfile_get_traceframe_address (tframe_offset);
3981 if (addr1 <= tfaddr && tfaddr <= addr2)
3985 tfaddr = tfile_get_traceframe_address (tframe_offset);
3986 if (!(addr1 <= tfaddr && tfaddr <= addr2))
3990 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
3996 cur_offset = offset;
3997 cur_data_size = data_size;
3998 cur_traceframe_number = tfnum;
4001 /* Skip past the traceframe's data. */
4002 lseek (trace_fd, data_size, SEEK_CUR);
4003 offset += data_size;
4004 /* Update our own count of traceframes. */
4007 /* Did not find what we were looking for. */
4013 /* Prototype of the callback passed to tframe_walk_blocks. */
4014 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4016 /* Callback for traceframe_walk_blocks, used to find a given block
4017 type in a traceframe. */
4020 match_blocktype (char blocktype, void *data)
4022 char *wantedp = data;
4024 if (*wantedp == blocktype)
4030 /* Walk over all traceframe block starting at POS offset from
4031 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4032 unmodified. If CALLBACK returns true, this returns the position in
4033 the traceframe where the block is found, relative to the start of
4034 the traceframe (cur_offset). Returns -1 if no callback call
4035 returned true, indicating that all blocks have been walked. */
4038 traceframe_walk_blocks (walk_blocks_callback_func callback,
4039 int pos, void *data)
4041 /* Iterate through a traceframe's blocks, looking for a block of the
4044 lseek (trace_fd, cur_offset + pos, SEEK_SET);
4045 while (pos < cur_data_size)
4047 unsigned short mlen;
4050 tfile_read (&block_type, 1);
4054 if ((*callback) (block_type, data))
4060 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4061 pos += trace_regblock_size;
4064 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4065 tfile_read ((gdb_byte *) &mlen, 2);
4066 mlen = (unsigned short)
4067 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4070 lseek (trace_fd, mlen, SEEK_CUR);
4071 pos += (8 + 2 + mlen);
4074 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4078 error (_("Unknown block type '%c' (0x%x) in trace frame"),
4079 block_type, block_type);
4087 /* Convenience wrapper around traceframe_walk_blocks. Looks for the
4088 position offset of a block of type TYPE_WANTED in the current trace
4089 frame, starting at POS. Returns -1 if no such block was found. */
4092 traceframe_find_block_type (char type_wanted, int pos)
4094 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4097 /* Look for a block of saved registers in the traceframe, and get the
4098 requested register from it. */
4101 tfile_fetch_registers (struct target_ops *ops,
4102 struct regcache *regcache, int regno)
4104 struct gdbarch *gdbarch = get_regcache_arch (regcache);
4106 int pos, offset, regn, regsize, pc_regno;
4107 unsigned short mlen;
4110 /* An uninitialized reg size says we're not going to be
4111 successful at getting register blocks. */
4112 if (!trace_regblock_size)
4115 set_tfile_traceframe ();
4117 regs = alloca (trace_regblock_size);
4119 if (traceframe_find_block_type ('R', 0) >= 0)
4121 tfile_read (regs, trace_regblock_size);
4123 /* Assume the block is laid out in GDB register number order,
4124 each register with the size that it has in GDB. */
4126 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4128 regsize = register_size (gdbarch, regn);
4129 /* Make sure we stay within block bounds. */
4130 if (offset + regsize >= trace_regblock_size)
4132 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4136 regcache_raw_supply (regcache, regno, regs + offset);
4139 else if (regno == -1)
4141 regcache_raw_supply (regcache, regn, regs + offset);
4149 /* We get here if no register data has been found. Mark registers
4151 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4152 regcache_raw_supply (regcache, regn, NULL);
4154 /* We can often usefully guess that the PC is going to be the same
4155 as the address of the tracepoint. */
4156 pc_regno = gdbarch_pc_regnum (gdbarch);
4157 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4159 struct tracepoint *tp = get_tracepoint (tracepoint_number);
4161 if (tp && tp->base.loc)
4163 /* But don't try to guess if tracepoint is multi-location... */
4164 if (tp->base.loc->next)
4166 warning (_("Tracepoint %d has multiple "
4167 "locations, cannot infer $pc"),
4171 /* ... or does while-stepping. */
4172 if (tp->step_count > 0)
4174 warning (_("Tracepoint %d does while-stepping, "
4175 "cannot infer $pc"),
4180 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4181 gdbarch_byte_order (gdbarch),
4182 tp->base.loc->address);
4183 regcache_raw_supply (regcache, pc_regno, regs);
4189 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4190 const char *annex, gdb_byte *readbuf,
4191 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4193 /* We're only doing regular memory for now. */
4194 if (object != TARGET_OBJECT_MEMORY)
4197 if (readbuf == NULL)
4198 error (_("tfile_xfer_partial: trace file is read-only"));
4200 set_tfile_traceframe ();
4202 if (traceframe_number != -1)
4206 /* Iterate through the traceframe's blocks, looking for
4208 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
4210 ULONGEST maddr, amt;
4211 unsigned short mlen;
4212 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
4214 tfile_read ((gdb_byte *) &maddr, 8);
4215 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4217 tfile_read ((gdb_byte *) &mlen, 2);
4218 mlen = (unsigned short)
4219 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4221 /* If the block includes the first part of the desired
4222 range, return as much it has; GDB will re-request the
4223 remainder, which might be in a different block of this
4225 if (maddr <= offset && offset < (maddr + mlen))
4227 amt = (maddr + mlen) - offset;
4231 tfile_read (readbuf, amt);
4235 /* Skip over this block. */
4236 pos += (8 + 2 + mlen);
4240 /* It's unduly pedantic to refuse to look at the executable for
4241 read-only pieces; so do the equivalent of readonly regions aka
4243 /* FIXME account for relocation at some point. */
4250 for (s = exec_bfd->sections; s; s = s->next)
4252 if ((s->flags & SEC_LOAD) == 0
4253 || (s->flags & SEC_READONLY) == 0)
4257 size = bfd_get_section_size (s);
4258 if (vma <= offset && offset < (vma + size))
4262 amt = (vma + size) - offset;
4266 amt = bfd_get_section_contents (exec_bfd, s,
4267 readbuf, offset - vma, amt);
4273 /* Indicate failure to find the requested memory block. */
4277 /* Iterate through the blocks of a trace frame, looking for a 'V'
4278 block with a matching tsv number. */
4281 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4285 set_tfile_traceframe ();
4288 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
4292 tfile_read ((gdb_byte *) &vnum, 4);
4293 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
4298 tfile_read ((gdb_byte *) val, 8);
4299 *val = extract_signed_integer ((gdb_byte *) val, 8,
4307 /* Didn't find anything. */
4312 tfile_has_all_memory (struct target_ops *ops)
4318 tfile_has_memory (struct target_ops *ops)
4324 tfile_has_stack (struct target_ops *ops)
4326 return traceframe_number != -1;
4330 tfile_has_registers (struct target_ops *ops)
4332 return traceframe_number != -1;
4336 tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4341 /* Callback for traceframe_walk_blocks. Builds a traceframe_info
4342 object for the tfile target's current traceframe. */
4345 build_traceframe_info (char blocktype, void *data)
4347 struct traceframe_info *info = data;
4353 struct mem_range *r;
4355 unsigned short mlen;
4357 tfile_read ((gdb_byte *) &maddr, 8);
4358 tfile_read ((gdb_byte *) &mlen, 2);
4360 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4373 warning (_("Unhandled trace block type (%d) '%c ' "
4374 "while building trace frame info."),
4375 blocktype, blocktype);
4382 static struct traceframe_info *
4383 tfile_traceframe_info (void)
4385 struct traceframe_info *info = XCNEW (struct traceframe_info);
4387 traceframe_walk_blocks (build_traceframe_info, 0, info);
4392 init_tfile_ops (void)
4394 tfile_ops.to_shortname = "tfile";
4395 tfile_ops.to_longname = "Local trace dump file";
4397 = "Use a trace file as a target. Specify the filename of the trace file.";
4398 tfile_ops.to_open = tfile_open;
4399 tfile_ops.to_close = tfile_close;
4400 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4401 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4402 tfile_ops.to_files_info = tfile_files_info;
4403 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4404 tfile_ops.to_trace_find = tfile_trace_find;
4405 tfile_ops.to_get_trace_state_variable_value
4406 = tfile_get_trace_state_variable_value;
4407 tfile_ops.to_stratum = process_stratum;
4408 tfile_ops.to_has_all_memory = tfile_has_all_memory;
4409 tfile_ops.to_has_memory = tfile_has_memory;
4410 tfile_ops.to_has_stack = tfile_has_stack;
4411 tfile_ops.to_has_registers = tfile_has_registers;
4412 tfile_ops.to_traceframe_info = tfile_traceframe_info;
4413 tfile_ops.to_thread_alive = tfile_thread_alive;
4414 tfile_ops.to_magic = OPS_MAGIC;
4417 /* Given a line of text defining a static tracepoint marker, parse it
4418 into a "static tracepoint marker" object. Throws an error is
4419 parsing fails. If PP is non-null, it points to one past the end of
4420 the parsed marker definition. */
4423 parse_static_tracepoint_marker_definition (char *line, char **pp,
4424 struct static_tracepoint_marker *marker)
4431 p = unpack_varlen_hex (p, &addr);
4432 p++; /* skip a colon */
4434 marker->gdbarch = target_gdbarch;
4435 marker->address = (CORE_ADDR) addr;
4437 endp = strchr (p, ':');
4439 error (_("bad marker definition: %s"), line);
4441 marker->str_id = xmalloc (endp - p + 1);
4442 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4443 marker->str_id[end] = '\0';
4446 p++; /* skip a colon */
4448 marker->extra = xmalloc (strlen (p) + 1);
4449 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4450 marker->extra[end] = '\0';
4456 /* Release a static tracepoint marker's contents. Note that the
4457 object itself isn't released here. There objects are usually on
4461 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4463 xfree (marker->str_id);
4464 marker->str_id = NULL;
4467 /* Print MARKER to gdb_stdout. */
4470 print_one_static_tracepoint_marker (int count,
4471 struct static_tracepoint_marker *marker)
4473 struct command_line *l;
4476 char wrap_indent[80];
4477 char extra_field_indent[80];
4478 struct ui_out *uiout = current_uiout;
4479 struct ui_stream *stb = ui_out_stream_new (uiout);
4480 struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4481 struct cleanup *bkpt_chain;
4482 VEC(breakpoint_p) *tracepoints;
4484 struct symtab_and_line sal;
4488 sal.pc = marker->address;
4490 tracepoints = static_tracepoints_here (marker->address);
4492 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4494 /* A counter field to help readability. This is not a stable
4496 ui_out_field_int (uiout, "count", count);
4498 ui_out_field_string (uiout, "marker-id", marker->str_id);
4500 ui_out_field_fmt (uiout, "enabled", "%c",
4501 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4502 ui_out_spaces (uiout, 2);
4504 strcpy (wrap_indent, " ");
4506 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4507 strcat (wrap_indent, " ");
4509 strcat (wrap_indent, " ");
4511 strcpy (extra_field_indent, " ");
4513 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4515 sal = find_pc_line (marker->address, 0);
4516 sym = find_pc_sect_function (marker->address, NULL);
4519 ui_out_text (uiout, "in ");
4520 ui_out_field_string (uiout, "func",
4521 SYMBOL_PRINT_NAME (sym));
4522 ui_out_wrap_hint (uiout, wrap_indent);
4523 ui_out_text (uiout, " at ");
4526 ui_out_field_skip (uiout, "func");
4528 if (sal.symtab != NULL)
4530 ui_out_field_string (uiout, "file", sal.symtab->filename);
4531 ui_out_text (uiout, ":");
4533 if (ui_out_is_mi_like_p (uiout))
4535 char *fullname = symtab_to_fullname (sal.symtab);
4538 ui_out_field_string (uiout, "fullname", fullname);
4541 ui_out_field_skip (uiout, "fullname");
4543 ui_out_field_int (uiout, "line", sal.line);
4547 ui_out_field_skip (uiout, "fullname");
4548 ui_out_field_skip (uiout, "line");
4551 ui_out_text (uiout, "\n");
4552 ui_out_text (uiout, extra_field_indent);
4553 ui_out_text (uiout, _("Data: \""));
4554 ui_out_field_string (uiout, "extra-data", marker->extra);
4555 ui_out_text (uiout, "\"\n");
4557 if (!VEC_empty (breakpoint_p, tracepoints))
4559 struct cleanup *cleanup_chain;
4561 struct breakpoint *b;
4563 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4566 ui_out_text (uiout, extra_field_indent);
4567 ui_out_text (uiout, _("Probed by static tracepoints: "));
4568 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4571 ui_out_text (uiout, ", ");
4572 ui_out_text (uiout, "#");
4573 ui_out_field_int (uiout, "tracepoint-id", b->number);
4576 do_cleanups (cleanup_chain);
4578 if (ui_out_is_mi_like_p (uiout))
4579 ui_out_field_int (uiout, "number-of-tracepoints",
4580 VEC_length(breakpoint_p, tracepoints));
4582 ui_out_text (uiout, "\n");
4584 VEC_free (breakpoint_p, tracepoints);
4586 do_cleanups (bkpt_chain);
4587 do_cleanups (old_chain);
4591 info_static_tracepoint_markers_command (char *arg, int from_tty)
4593 VEC(static_tracepoint_marker_p) *markers;
4594 struct cleanup *old_chain;
4595 struct static_tracepoint_marker *marker;
4596 struct ui_out *uiout = current_uiout;
4600 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4601 "StaticTracepointMarkersTable");
4603 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4605 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4607 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4608 if (gdbarch_addr_bit (target_gdbarch) <= 32)
4609 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4611 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4612 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4614 ui_out_table_body (uiout);
4616 markers = target_static_tracepoint_markers_by_strid (NULL);
4617 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4620 VEC_iterate (static_tracepoint_marker_p,
4621 markers, i, marker);
4624 print_one_static_tracepoint_marker (i + 1, marker);
4625 release_static_tracepoint_marker (marker);
4628 do_cleanups (old_chain);
4631 /* The $_sdata convenience variable is a bit special. We don't know
4632 for sure type of the value until we actually have a chance to fetch
4633 the data --- the size of the object depends on what has been
4634 collected. We solve this by making $_sdata be an internalvar that
4635 creates a new value on access. */
4637 /* Return a new value with the correct type for the sdata object of
4638 the current trace frame. Return a void value if there's no object
4641 static struct value *
4642 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4647 /* We need to read the whole object before we know its size. */
4648 size = target_read_alloc (¤t_target,
4649 TARGET_OBJECT_STATIC_TRACE_DATA,
4656 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4658 v = allocate_value (type);
4659 memcpy (value_contents_raw (v), buf, size);
4664 return allocate_value (builtin_type (gdbarch)->builtin_void);
4667 #if !defined(HAVE_LIBEXPAT)
4669 struct traceframe_info *
4670 parse_traceframe_info (const char *tframe_info)
4672 static int have_warned;
4677 warning (_("Can not parse XML trace frame info; XML support "
4678 "was disabled at compile time"));
4684 #else /* HAVE_LIBEXPAT */
4686 #include "xml-support.h"
4688 /* Handle the start of a <memory> element. */
4691 traceframe_info_start_memory (struct gdb_xml_parser *parser,
4692 const struct gdb_xml_element *element,
4693 void *user_data, VEC(gdb_xml_value_s) *attributes)
4695 struct traceframe_info *info = user_data;
4696 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4697 ULONGEST *start_p, *length_p;
4699 start_p = xml_find_attribute (attributes, "start")->value;
4700 length_p = xml_find_attribute (attributes, "length")->value;
4702 r->start = *start_p;
4703 r->length = *length_p;
4706 /* Discard the constructed trace frame info (if an error occurs). */
4709 free_result (void *p)
4711 struct traceframe_info *result = p;
4713 free_traceframe_info (result);
4716 /* The allowed elements and attributes for an XML memory map. */
4718 static const struct gdb_xml_attribute memory_attributes[] = {
4719 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4720 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4721 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4724 static const struct gdb_xml_element traceframe_info_children[] = {
4725 { "memory", memory_attributes, NULL,
4726 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4727 traceframe_info_start_memory, NULL },
4728 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4731 static const struct gdb_xml_element traceframe_info_elements[] = {
4732 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4734 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4737 /* Parse a traceframe-info XML document. */
4739 struct traceframe_info *
4740 parse_traceframe_info (const char *tframe_info)
4742 struct traceframe_info *result;
4743 struct cleanup *back_to;
4745 result = XCNEW (struct traceframe_info);
4746 back_to = make_cleanup (free_result, result);
4748 if (gdb_xml_parse_quick (_("trace frame info"),
4749 "traceframe-info.dtd", traceframe_info_elements,
4750 tframe_info, result) == 0)
4752 /* Parsed successfully, keep the result. */
4753 discard_cleanups (back_to);
4758 do_cleanups (back_to);
4762 #endif /* HAVE_LIBEXPAT */
4764 /* Returns the traceframe_info object for the current traceframe.
4765 This is where we avoid re-fetching the object from the target if we
4766 already have it cached. */
4768 struct traceframe_info *
4769 get_traceframe_info (void)
4771 if (traceframe_info == NULL)
4772 traceframe_info = target_traceframe_info ();
4774 return traceframe_info;
4777 /* If the target supports the query, return in RESULT the set of
4778 collected memory in the current traceframe, found within the LEN
4779 bytes range starting at MEMADDR. Returns true if the target
4780 supports the query, otherwise returns false, and RESULT is left
4784 traceframe_available_memory (VEC(mem_range_s) **result,
4785 CORE_ADDR memaddr, ULONGEST len)
4787 struct traceframe_info *info = get_traceframe_info ();
4791 struct mem_range *r;
4796 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4797 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4799 ULONGEST lo1, hi1, lo2, hi2;
4800 struct mem_range *nr;
4803 hi1 = memaddr + len;
4806 hi2 = r->start + r->length;
4808 nr = VEC_safe_push (mem_range_s, *result, NULL);
4810 nr->start = max (lo1, lo2);
4811 nr->length = min (hi1, hi2) - nr->start;
4814 normalize_mem_ranges (*result);
4821 /* module initialization */
4823 _initialize_tracepoint (void)
4825 struct cmd_list_element *c;
4827 /* Explicitly create without lookup, since that tries to create a
4828 value with a void typed value, and when we get here, gdbarch
4829 isn't initialized yet. At this point, we're quite sure there
4830 isn't another convenience variable of the same name. */
4831 create_internalvar_type_lazy ("_sdata", sdata_make_value);
4833 traceframe_number = -1;
4834 tracepoint_number = -1;
4836 if (tracepoint_list.list == NULL)
4838 tracepoint_list.listsize = 128;
4839 tracepoint_list.list = xmalloc
4840 (tracepoint_list.listsize * sizeof (struct memrange));
4842 if (tracepoint_list.aexpr_list == NULL)
4844 tracepoint_list.aexpr_listsize = 128;
4845 tracepoint_list.aexpr_list = xmalloc
4846 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
4849 if (stepping_list.list == NULL)
4851 stepping_list.listsize = 128;
4852 stepping_list.list = xmalloc
4853 (stepping_list.listsize * sizeof (struct memrange));
4856 if (stepping_list.aexpr_list == NULL)
4858 stepping_list.aexpr_listsize = 128;
4859 stepping_list.aexpr_list = xmalloc
4860 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
4863 add_info ("scope", scope_info,
4864 _("List the variables local to a scope"));
4866 add_cmd ("tracepoints", class_trace, NULL,
4867 _("Tracing of program execution without stopping the program."),
4870 add_com ("tdump", class_trace, trace_dump_command,
4871 _("Print everything collected at the current tracepoint."));
4873 add_com ("tsave", class_trace, trace_save_command, _("\
4874 Save the trace data to a file.\n\
4875 Use the '-r' option to direct the target to save directly to the file,\n\
4876 using its own filesystem."));
4878 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4879 Define a trace state variable.\n\
4880 Argument is a $-prefixed name, optionally followed\n\
4881 by '=' and an expression that sets the initial value\n\
4882 at the start of tracing."));
4883 set_cmd_completer (c, expression_completer);
4885 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4886 Delete one or more trace state variables.\n\
4887 Arguments are the names of the variables to delete.\n\
4888 If no arguments are supplied, delete all variables."), &deletelist);
4889 /* FIXME add a trace variable completer. */
4891 add_info ("tvariables", tvariables_info, _("\
4892 Status of trace state variables and their values.\n\
4895 add_info ("static-tracepoint-markers",
4896 info_static_tracepoint_markers_command, _("\
4897 List target static tracepoints markers.\n\
4900 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
4901 Select a trace frame;\n\
4902 No argument means forward by one frame; '-' means backward by one frame."),
4903 &tfindlist, "tfind ", 1, &cmdlist);
4905 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
4906 Select a trace frame whose PC is outside the given range (exclusive).\n\
4907 Usage: tfind outside addr1, addr2"),
4910 add_cmd ("range", class_trace, trace_find_range_command, _("\
4911 Select a trace frame whose PC is in the given range (inclusive).\n\
4912 Usage: tfind range addr1,addr2"),
4915 add_cmd ("line", class_trace, trace_find_line_command, _("\
4916 Select a trace frame by source line.\n\
4917 Argument can be a line number (with optional source file),\n\
4918 a function name, or '*' followed by an address.\n\
4919 Default argument is 'the next source line that was traced'."),
4922 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
4923 Select a trace frame by tracepoint number.\n\
4924 Default is the tracepoint for the current trace frame."),
4927 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
4928 Select a trace frame by PC.\n\
4929 Default is the current PC, or the PC of the current trace frame."),
4932 add_cmd ("end", class_trace, trace_find_end_command, _("\
4933 Synonym for 'none'.\n\
4934 De-select any trace frame and resume 'live' debugging."),
4937 add_cmd ("none", class_trace, trace_find_none_command,
4938 _("De-select any trace frame and resume 'live' debugging."),
4941 add_cmd ("start", class_trace, trace_find_start_command,
4942 _("Select the first trace frame in the trace buffer."),
4945 add_com ("tstatus", class_trace, trace_status_command,
4946 _("Display the status of the current trace data collection."));
4948 add_com ("tstop", class_trace, trace_stop_command,
4949 _("Stop trace data collection."));
4951 add_com ("tstart", class_trace, trace_start_command,
4952 _("Start trace data collection."));
4954 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4955 Ends a list of commands or actions.\n\
4956 Several GDB commands allow you to enter a list of commands or actions.\n\
4957 Entering \"end\" on a line by itself is the normal way to terminate\n\
4959 Note: the \"end\" command cannot be used at the gdb prompt."));
4961 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4962 Specify single-stepping behavior at a tracepoint.\n\
4963 Argument is number of instructions to trace in single-step mode\n\
4964 following the tracepoint. This command is normally followed by\n\
4965 one or more \"collect\" commands, to specify what to collect\n\
4966 while single-stepping.\n\n\
4967 Note: this command can only be used in a tracepoint \"actions\" list."));
4969 add_com_alias ("ws", "while-stepping", class_alias, 0);
4970 add_com_alias ("stepping", "while-stepping", class_alias, 0);
4972 add_com ("collect", class_trace, collect_pseudocommand, _("\
4973 Specify one or more data items to be collected at a tracepoint.\n\
4974 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4975 collect all data (variables, registers) referenced by that expression.\n\
4976 Also accepts the following special arguments:\n\
4977 $regs -- all registers.\n\
4978 $args -- all function arguments.\n\
4979 $locals -- all variables local to the block/function scope.\n\
4980 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4981 Note: this command can only be used in a tracepoint \"actions\" list."));
4983 add_com ("teval", class_trace, teval_pseudocommand, _("\
4984 Specify one or more expressions to be evaluated at a tracepoint.\n\
4985 Accepts a comma-separated list of (one or more) expressions.\n\
4986 The result of each evaluation will be discarded.\n\
4987 Note: this command can only be used in a tracepoint \"actions\" list."));
4989 add_com ("actions", class_trace, trace_actions_command, _("\
4990 Specify the actions to be taken at a tracepoint.\n\
4991 Tracepoint actions may include collecting of specified data,\n\
4992 single-stepping, or enabling/disabling other tracepoints,\n\
4993 depending on target's capabilities."));
4995 default_collect = xstrdup ("");
4996 add_setshow_string_cmd ("default-collect", class_trace,
4997 &default_collect, _("\
4998 Set the list of expressions to collect by default"), _("\
4999 Show the list of expressions to collect by default"), NULL,
5001 &setlist, &showlist);
5003 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5004 &disconnected_tracing, _("\
5005 Set whether tracing continues after GDB disconnects."), _("\
5006 Show whether tracing continues after GDB disconnects."), _("\
5007 Use this to continue a tracing run even if GDB disconnects\n\
5008 or detaches from the target. You can reconnect later and look at\n\
5009 trace data collected in the meantime."),
5010 set_disconnected_tracing,
5015 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5016 &circular_trace_buffer, _("\
5017 Set target's use of circular trace buffer."), _("\
5018 Show target's use of circular trace buffer."), _("\
5019 Use this to make the trace buffer into a circular buffer,\n\
5020 which will discard traceframes (oldest first) instead of filling\n\
5021 up and stopping the trace run."),
5022 set_circular_trace_buffer,
5029 add_target (&tfile_ops);