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"
55 /* readline include files */
56 #include "readline/readline.h"
57 #include "readline/history.h"
59 /* readline defines this. */
70 extern int hex2bin (const char *hex, gdb_byte *bin, int count);
71 extern int bin2hex (const gdb_byte *bin, char *hex, int count);
73 /* Maximum length of an agent aexpression.
74 This accounts for the fact that packets are limited to 400 bytes
75 (which includes everything -- including the checksum), and assumes
76 the worst case of maximum length for each of the pieces of a
79 NOTE: expressions get mem2hex'ed otherwise this would be twice as
80 large. (400 - 31)/2 == 184 */
81 #define MAX_AGENT_EXPR_LEN 184
83 /* A hook used to notify the UI of tracepoint operations. */
85 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
86 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
88 extern void (*deprecated_readline_begin_hook) (char *, ...);
89 extern char *(*deprecated_readline_hook) (char *);
90 extern void (*deprecated_readline_end_hook) (void);
92 /* GDB commands implemented in other modules:
95 extern void output_command (char *, int);
100 This module defines the following debugger commands:
101 trace : set a tracepoint on a function, line, or address.
102 info trace : list all debugger-defined tracepoints.
103 delete trace : delete one or more tracepoints.
104 enable trace : enable one or more tracepoints.
105 disable trace : disable one or more tracepoints.
106 actions : specify actions to be taken at a tracepoint.
107 passcount : specify a pass count for a tracepoint.
108 tstart : start a trace experiment.
109 tstop : stop a trace experiment.
110 tstatus : query the status of a trace experiment.
111 tfind : find a trace frame in the trace buffer.
112 tdump : print everything collected at the current tracepoint.
113 save-tracepoints : write tracepoint setup into a file.
115 This module defines the following user-visible debugger variables:
116 $trace_frame : sequence number of trace frame currently being debugged.
117 $trace_line : source line of trace frame currently being debugged.
118 $trace_file : source file of trace frame currently being debugged.
119 $tracepoint : tracepoint number of trace frame currently being debugged.
123 /* ======= Important global variables: ======= */
125 /* The list of all trace state variables. We don't retain pointers to
126 any of these for any reason - API is by name or number only - so it
127 works to have a vector of objects. */
129 typedef struct trace_state_variable tsv_s;
132 /* An object describing the contents of a traceframe. */
134 struct traceframe_info
136 /* Collected memory. */
137 VEC(mem_range_s) *memory;
140 static VEC(tsv_s) *tvariables;
142 /* The next integer to assign to a variable. */
144 static int next_tsv_number = 1;
146 /* Number of last traceframe collected. */
147 static int traceframe_number;
149 /* Tracepoint for last traceframe collected. */
150 static int tracepoint_number;
152 /* Symbol for function for last traceframe collected. */
153 static struct symbol *traceframe_fun;
155 /* Symtab and line for last traceframe collected. */
156 static struct symtab_and_line traceframe_sal;
158 /* The traceframe info of the current traceframe. NULL if we haven't
159 yet attempted to fetch it, or if the target does not support
160 fetching this object, or if we're not inspecting a traceframe
162 static struct traceframe_info *traceframe_info;
164 /* Tracing command lists. */
165 static struct cmd_list_element *tfindlist;
167 /* List of expressions to collect by default at each tracepoint hit. */
168 char *default_collect = "";
170 static int disconnected_tracing;
172 /* This variable controls whether we ask the target for a linear or
173 circular trace buffer. */
175 static int circular_trace_buffer;
177 /* ======= Important command functions: ======= */
178 static void trace_actions_command (char *, int);
179 static void trace_start_command (char *, int);
180 static void trace_stop_command (char *, int);
181 static void trace_status_command (char *, int);
182 static void trace_find_command (char *, int);
183 static void trace_find_pc_command (char *, int);
184 static void trace_find_tracepoint_command (char *, int);
185 static void trace_find_line_command (char *, int);
186 static void trace_find_range_command (char *, int);
187 static void trace_find_outside_command (char *, int);
188 static void trace_dump_command (char *, int);
190 /* support routines */
192 struct collection_list;
193 static void add_aexpr (struct collection_list *, struct agent_expr *);
194 static char *mem2hex (gdb_byte *, char *, int);
195 static void add_register (struct collection_list *collection,
198 extern void send_disconnected_tracing_value (int value);
200 static void free_uploaded_tps (struct uploaded_tp **utpp);
201 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
204 extern void _initialize_tracepoint (void);
206 static struct trace_status trace_status;
208 char *stop_reason_names[] = {
218 struct trace_status *
219 current_trace_status (void)
221 return &trace_status;
227 free_traceframe_info (struct traceframe_info *info)
231 VEC_free (mem_range_s, info->memory);
237 /* Free and and clear the traceframe info cache of the current
241 clear_traceframe_info (void)
243 free_traceframe_info (traceframe_info);
244 traceframe_info = NULL;
247 /* Set traceframe number to NUM. */
249 set_traceframe_num (int num)
251 traceframe_number = num;
252 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
255 /* Set tracepoint number to NUM. */
257 set_tracepoint_num (int num)
259 tracepoint_number = num;
260 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
263 /* Set externally visible debug variables for querying/printing
264 the traceframe context (line, function, file). */
267 set_traceframe_context (struct frame_info *trace_frame)
271 if (trace_frame == NULL) /* Cease debugging any trace buffers. */
274 traceframe_sal.pc = traceframe_sal.line = 0;
275 traceframe_sal.symtab = NULL;
276 clear_internalvar (lookup_internalvar ("trace_func"));
277 clear_internalvar (lookup_internalvar ("trace_file"));
278 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
282 /* Save as globals for internal use. */
283 trace_pc = get_frame_pc (trace_frame);
284 traceframe_sal = find_pc_line (trace_pc, 0);
285 traceframe_fun = find_pc_function (trace_pc);
287 /* Save linenumber as "$trace_line", a debugger variable visible to
289 set_internalvar_integer (lookup_internalvar ("trace_line"),
290 traceframe_sal.line);
292 /* Save func name as "$trace_func", a debugger variable visible to
294 if (traceframe_fun == NULL
295 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
296 clear_internalvar (lookup_internalvar ("trace_func"));
298 set_internalvar_string (lookup_internalvar ("trace_func"),
299 SYMBOL_LINKAGE_NAME (traceframe_fun));
301 /* Save file name as "$trace_file", a debugger variable visible to
303 if (traceframe_sal.symtab == NULL
304 || traceframe_sal.symtab->filename == NULL)
305 clear_internalvar (lookup_internalvar ("trace_file"));
307 set_internalvar_string (lookup_internalvar ("trace_file"),
308 traceframe_sal.symtab->filename);
311 /* Create a new trace state variable with the given name. */
313 struct trace_state_variable *
314 create_trace_state_variable (const char *name)
316 struct trace_state_variable tsv;
318 memset (&tsv, 0, sizeof (tsv));
319 tsv.name = xstrdup (name);
320 tsv.number = next_tsv_number++;
321 return VEC_safe_push (tsv_s, tvariables, &tsv);
324 /* Look for a trace state variable of the given name. */
326 struct trace_state_variable *
327 find_trace_state_variable (const char *name)
329 struct trace_state_variable *tsv;
332 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
333 if (strcmp (name, tsv->name) == 0)
340 delete_trace_state_variable (const char *name)
342 struct trace_state_variable *tsv;
345 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
346 if (strcmp (name, tsv->name) == 0)
348 xfree ((void *)tsv->name);
349 VEC_unordered_remove (tsv_s, tvariables, ix);
353 warning (_("No trace variable named \"$%s\", not deleting"), name);
356 /* The 'tvariable' command collects a name and optional expression to
357 evaluate into an initial value. */
360 trace_variable_command (char *args, int from_tty)
362 struct expression *expr;
363 struct cleanup *old_chain;
364 struct internalvar *intvar = NULL;
366 struct trace_state_variable *tsv;
369 error_no_arg (_("trace state variable name"));
371 /* All the possible valid arguments are expressions. */
372 expr = parse_expression (args);
373 old_chain = make_cleanup (free_current_contents, &expr);
375 if (expr->nelts == 0)
376 error (_("No expression?"));
378 /* Only allow two syntaxes; "$name" and "$name=value". */
379 if (expr->elts[0].opcode == OP_INTERNALVAR)
381 intvar = expr->elts[1].internalvar;
383 else if (expr->elts[0].opcode == BINOP_ASSIGN
384 && expr->elts[1].opcode == OP_INTERNALVAR)
386 intvar = expr->elts[2].internalvar;
387 initval = value_as_long (evaluate_subexpression_type (expr, 4));
390 error (_("Syntax must be $NAME [ = EXPR ]"));
393 error (_("No name given"));
395 if (strlen (internalvar_name (intvar)) <= 0)
396 error (_("Must supply a non-empty variable name"));
398 /* If the variable already exists, just change its initial value. */
399 tsv = find_trace_state_variable (internalvar_name (intvar));
402 tsv->initial_value = initval;
403 printf_filtered (_("Trace state variable $%s "
404 "now has initial value %s.\n"),
405 tsv->name, plongest (tsv->initial_value));
406 do_cleanups (old_chain);
410 /* Create a new variable. */
411 tsv = create_trace_state_variable (internalvar_name (intvar));
412 tsv->initial_value = initval;
414 printf_filtered (_("Trace state variable $%s "
415 "created, with initial value %s.\n"),
416 tsv->name, plongest (tsv->initial_value));
418 do_cleanups (old_chain);
422 delete_trace_variable_command (char *args, int from_tty)
426 struct cleanup *back_to;
430 if (query (_("Delete all trace state variables? ")))
431 VEC_free (tsv_s, tvariables);
436 argv = gdb_buildargv (args);
437 back_to = make_cleanup_freeargv (argv);
439 for (ix = 0; argv[ix] != NULL; ix++)
441 if (*argv[ix] == '$')
442 delete_trace_state_variable (argv[ix] + 1);
444 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
447 do_cleanups (back_to);
453 tvariables_info_1 (void)
455 struct trace_state_variable *tsv;
458 struct cleanup *back_to;
460 if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
462 printf_filtered (_("No trace state variables.\n"));
466 /* Try to acquire values from the target. */
467 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
468 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
471 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
472 count, "trace-variables");
473 ui_out_table_header (uiout, 15, ui_left, "name", "Name");
474 ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
475 ui_out_table_header (uiout, 11, ui_left, "current", "Current");
477 ui_out_table_body (uiout);
479 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
481 struct cleanup *back_to2;
485 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
487 name = concat ("$", tsv->name, (char *) NULL);
488 make_cleanup (xfree, name);
489 ui_out_field_string (uiout, "name", name);
490 ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
492 if (tsv->value_known)
493 c = plongest (tsv->value);
494 else if (ui_out_is_mi_like_p (uiout))
495 /* For MI, we prefer not to use magic string constants, but rather
496 omit the field completely. The difference between unknown and
497 undefined does not seem important enough to represent. */
499 else if (current_trace_status ()->running || traceframe_number >= 0)
500 /* The value is/was defined, but we don't have it. */
503 /* It is not meaningful to ask about the value. */
506 ui_out_field_string (uiout, "current", c);
507 ui_out_text (uiout, "\n");
509 do_cleanups (back_to2);
512 do_cleanups (back_to);
515 /* List all the trace state variables. */
518 tvariables_info (char *args, int from_tty)
520 tvariables_info_1 ();
523 /* Stash definitions of tsvs into the given file. */
526 save_trace_state_variables (struct ui_file *fp)
528 struct trace_state_variable *tsv;
531 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
533 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
534 if (tsv->initial_value)
535 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
536 fprintf_unfiltered (fp, "\n");
540 /* ACTIONS functions: */
542 /* The three functions:
543 collect_pseudocommand,
544 while_stepping_pseudocommand, and
545 end_actions_pseudocommand
546 are placeholders for "commands" that are actually ONLY to be used
547 within a tracepoint action list. If the actual function is ever called,
548 it means that somebody issued the "command" at the top level,
549 which is always an error. */
552 end_actions_pseudocommand (char *args, int from_tty)
554 error (_("This command cannot be used at the top level."));
558 while_stepping_pseudocommand (char *args, int from_tty)
560 error (_("This command can only be used in a tracepoint actions list."));
564 collect_pseudocommand (char *args, int from_tty)
566 error (_("This command can only be used in a tracepoint actions list."));
570 teval_pseudocommand (char *args, int from_tty)
572 error (_("This command can only be used in a tracepoint actions list."));
575 /* Enter a list of actions for a tracepoint. */
577 trace_actions_command (char *args, int from_tty)
579 struct breakpoint *t;
580 struct command_line *l;
582 t = get_tracepoint_by_number (&args, NULL, 1);
586 xstrprintf ("Enter actions for tracepoint %d, one per line.",
588 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
590 l = read_command_lines (tmpbuf, from_tty, 1,
591 check_tracepoint_command, t);
592 do_cleanups (cleanups);
593 breakpoint_set_commands (t, l);
595 /* else just return */
598 /* Report the results of checking the agent expression, as errors or
602 report_agent_reqs_errors (struct agent_expr *aexpr)
604 /* All of the "flaws" are serious bytecode generation issues that
605 should never occur. */
606 if (aexpr->flaw != agent_flaw_none)
607 internal_error (__FILE__, __LINE__, _("expression is malformed"));
609 /* If analysis shows a stack underflow, GDB must have done something
610 badly wrong in its bytecode generation. */
611 if (aexpr->min_height < 0)
612 internal_error (__FILE__, __LINE__,
613 _("expression has min height < 0"));
615 /* Issue this error if the stack is predicted to get too deep. The
616 limit is rather arbitrary; a better scheme might be for the
617 target to report how much stack it will have available. The
618 depth roughly corresponds to parenthesization, so a limit of 20
619 amounts to 20 levels of expression nesting, which is actually
620 a pretty big hairy expression. */
621 if (aexpr->max_height > 20)
622 error (_("Expression is too complicated."));
625 /* worker function */
627 validate_actionline (char **line, struct breakpoint *t)
629 struct cmd_list_element *c;
630 struct expression *exp = NULL;
631 struct cleanup *old_chain = NULL;
633 struct bp_location *loc;
634 struct agent_expr *aexpr;
636 /* If EOF is typed, *line is NULL. */
640 for (p = *line; isspace ((int) *p);)
643 /* Symbol lookup etc. */
644 if (*p == '\0') /* empty line: just prompt for another line. */
647 if (*p == '#') /* comment line */
650 c = lookup_cmd (&p, cmdlist, "", -1, 1);
652 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
654 if (cmd_cfunc_eq (c, collect_pseudocommand))
657 { /* Repeat over a comma-separated list. */
658 QUIT; /* Allow user to bail out with ^C. */
659 while (isspace ((int) *p))
662 if (*p == '$') /* Look for special pseudo-symbols. */
664 if (0 == strncasecmp ("reg", p + 1, 3)
665 || 0 == strncasecmp ("arg", p + 1, 3)
666 || 0 == strncasecmp ("loc", p + 1, 3)
667 || 0 == strncasecmp ("_sdata", p + 1, 6))
672 /* else fall thru, treat p as an expression and parse it! */
675 for (loc = t->loc; loc; loc = loc->next)
678 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
679 old_chain = make_cleanup (free_current_contents, &exp);
681 if (exp->elts[0].opcode == OP_VAR_VALUE)
683 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
685 error (_("constant `%s' (value %ld) "
686 "will not be collected."),
687 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
688 SYMBOL_VALUE (exp->elts[2].symbol));
690 else if (SYMBOL_CLASS (exp->elts[2].symbol)
691 == LOC_OPTIMIZED_OUT)
693 error (_("`%s' is optimized away "
694 "and cannot be collected."),
695 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
699 /* We have something to collect, make sure that the expr to
700 bytecode translator can handle it and that it's not too
702 aexpr = gen_trace_for_expr (loc->address, exp);
703 make_cleanup_free_agent_expr (aexpr);
705 if (aexpr->len > MAX_AGENT_EXPR_LEN)
706 error (_("Expression is too complicated."));
710 report_agent_reqs_errors (aexpr);
712 do_cleanups (old_chain);
715 while (p && *p++ == ',');
718 else if (cmd_cfunc_eq (c, teval_pseudocommand))
721 { /* Repeat over a comma-separated list. */
722 QUIT; /* Allow user to bail out with ^C. */
723 while (isspace ((int) *p))
727 for (loc = t->loc; loc; loc = loc->next)
730 /* Only expressions are allowed for this action. */
731 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
732 old_chain = make_cleanup (free_current_contents, &exp);
734 /* We have something to evaluate, make sure that the expr to
735 bytecode translator can handle it and that it's not too
737 aexpr = gen_eval_for_expr (loc->address, exp);
738 make_cleanup_free_agent_expr (aexpr);
740 if (aexpr->len > MAX_AGENT_EXPR_LEN)
741 error (_("Expression is too complicated."));
744 report_agent_reqs_errors (aexpr);
746 do_cleanups (old_chain);
749 while (p && *p++ == ',');
752 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
754 char *steparg; /* In case warning is necessary. */
756 while (isspace ((int) *p))
760 if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
761 error (_("while-stepping step count `%s' is malformed."), *line);
764 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
768 error (_("`%s' is not a supported tracepoint action."), *line);
772 memrange_absolute = -1
777 int type; /* memrange_absolute for absolute memory range,
778 else basereg number. */
779 bfd_signed_vma start;
783 struct collection_list
785 unsigned char regs_mask[32]; /* room for up to 256 regs */
788 struct memrange *list;
789 long aexpr_listsize; /* size of array pointed to by expr_list elt */
791 struct agent_expr **aexpr_list;
793 /* True is the user requested a collection of "$_sdata", "static
797 tracepoint_list, stepping_list;
799 /* MEMRANGE functions: */
801 static int memrange_cmp (const void *, const void *);
803 /* Compare memranges for qsort. */
805 memrange_cmp (const void *va, const void *vb)
807 const struct memrange *a = va, *b = vb;
809 if (a->type < b->type)
811 if (a->type > b->type)
813 if (a->type == memrange_absolute)
815 if ((bfd_vma) a->start < (bfd_vma) b->start)
817 if ((bfd_vma) a->start > (bfd_vma) b->start)
822 if (a->start < b->start)
824 if (a->start > b->start)
830 /* Sort the memrange list using qsort, and merge adjacent memranges. */
832 memrange_sortmerge (struct collection_list *memranges)
836 qsort (memranges->list, memranges->next_memrange,
837 sizeof (struct memrange), memrange_cmp);
838 if (memranges->next_memrange > 0)
840 for (a = 0, b = 1; b < memranges->next_memrange; b++)
842 /* If memrange b overlaps or is adjacent to memrange a,
844 if (memranges->list[a].type == memranges->list[b].type
845 && memranges->list[b].start <= memranges->list[a].end)
847 if (memranges->list[b].end > memranges->list[a].end)
848 memranges->list[a].end = memranges->list[b].end;
849 continue; /* next b, same a */
853 memcpy (&memranges->list[a], &memranges->list[b],
854 sizeof (struct memrange));
856 memranges->next_memrange = a + 1;
860 /* Add a register to a collection list. */
862 add_register (struct collection_list *collection, unsigned int regno)
865 printf_filtered ("collect register %d\n", regno);
866 if (regno >= (8 * sizeof (collection->regs_mask)))
867 error (_("Internal: register number %d too large for tracepoint"),
869 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
872 /* Add a memrange to a collection list. */
874 add_memrange (struct collection_list *memranges,
875 int type, bfd_signed_vma base,
880 printf_filtered ("(%d,", type);
882 printf_filtered (",%ld)\n", len);
885 /* type: memrange_absolute == memory, other n == basereg */
886 memranges->list[memranges->next_memrange].type = type;
887 /* base: addr if memory, offset if reg relative. */
888 memranges->list[memranges->next_memrange].start = base;
889 /* len: we actually save end (base + len) for convenience */
890 memranges->list[memranges->next_memrange].end = base + len;
891 memranges->next_memrange++;
892 if (memranges->next_memrange >= memranges->listsize)
894 memranges->listsize *= 2;
895 memranges->list = xrealloc (memranges->list,
896 memranges->listsize);
899 if (type != memrange_absolute) /* Better collect the base register! */
900 add_register (memranges, type);
903 /* Add a symbol to a collection list. */
905 collect_symbol (struct collection_list *collect,
907 struct gdbarch *gdbarch,
908 long frame_regno, long frame_offset,
913 bfd_signed_vma offset;
914 int treat_as_expr = 0;
916 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
917 switch (SYMBOL_CLASS (sym))
920 printf_filtered ("%s: don't know symbol class %d\n",
921 SYMBOL_PRINT_NAME (sym),
925 printf_filtered ("constant %s (value %ld) will not be collected.\n",
926 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
929 offset = SYMBOL_VALUE_ADDRESS (sym);
934 sprintf_vma (tmp, offset);
935 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
936 SYMBOL_PRINT_NAME (sym), len,
939 /* A struct may be a C++ class with static fields, go to general
940 expression handling. */
941 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
944 add_memrange (collect, memrange_absolute, offset, len);
947 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
949 printf_filtered ("LOC_REG[parm] %s: ",
950 SYMBOL_PRINT_NAME (sym));
951 add_register (collect, reg);
952 /* Check for doubles stored in two registers. */
953 /* FIXME: how about larger types stored in 3 or more regs? */
954 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
955 len > register_size (gdbarch, reg))
956 add_register (collect, reg + 1);
959 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
960 printf_filtered (" (will not collect %s)\n",
961 SYMBOL_PRINT_NAME (sym));
965 offset = frame_offset + SYMBOL_VALUE (sym);
968 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
969 SYMBOL_PRINT_NAME (sym), len);
971 printf_filtered (" from frame ptr reg %d\n", reg);
973 add_memrange (collect, reg, offset, len);
975 case LOC_REGPARM_ADDR:
976 reg = SYMBOL_VALUE (sym);
980 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
981 SYMBOL_PRINT_NAME (sym), len);
983 printf_filtered (" from reg %d\n", reg);
985 add_memrange (collect, reg, offset, len);
989 offset = frame_offset + SYMBOL_VALUE (sym);
992 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
993 SYMBOL_PRINT_NAME (sym), len);
995 printf_filtered (" from frame ptr reg %d\n", reg);
997 add_memrange (collect, reg, offset, len);
1000 case LOC_UNRESOLVED:
1004 case LOC_OPTIMIZED_OUT:
1005 printf_filtered ("%s has been optimized out of existence.\n",
1006 SYMBOL_PRINT_NAME (sym));
1014 /* Expressions are the most general case. */
1017 struct agent_expr *aexpr;
1018 struct cleanup *old_chain1 = NULL;
1020 aexpr = gen_trace_for_var (scope, gdbarch, sym);
1022 /* It can happen that the symbol is recorded as a computed
1023 location, but it's been optimized away and doesn't actually
1024 have a location expression. */
1027 printf_filtered ("%s has been optimized out of existence.\n",
1028 SYMBOL_PRINT_NAME (sym));
1032 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1036 report_agent_reqs_errors (aexpr);
1038 discard_cleanups (old_chain1);
1039 add_aexpr (collect, aexpr);
1041 /* Take care of the registers. */
1042 if (aexpr->reg_mask_len > 0)
1046 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1048 QUIT; /* Allow user to bail out with ^C. */
1049 if (aexpr->reg_mask[ndx1] != 0)
1051 /* Assume chars have 8 bits. */
1052 for (ndx2 = 0; ndx2 < 8; ndx2++)
1053 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1054 /* It's used -- record it. */
1055 add_register (collect, ndx1 * 8 + ndx2);
1062 /* Data to be passed around in the calls to the locals and args
1065 struct add_local_symbols_data
1067 struct collection_list *collect;
1068 struct gdbarch *gdbarch;
1075 /* The callback for the locals and args iterators. */
1078 do_collect_symbol (const char *print_name,
1082 struct add_local_symbols_data *p = cb_data;
1084 collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1085 p->frame_offset, p->pc);
1089 /* Add all locals (or args) symbols to collection list. */
1091 add_local_symbols (struct collection_list *collect,
1092 struct gdbarch *gdbarch, CORE_ADDR pc,
1093 long frame_regno, long frame_offset, int type)
1095 struct block *block;
1096 struct add_local_symbols_data cb_data;
1098 cb_data.collect = collect;
1099 cb_data.gdbarch = gdbarch;
1101 cb_data.frame_regno = frame_regno;
1102 cb_data.frame_offset = frame_offset;
1107 block = block_for_pc (pc);
1110 warning (_("Can't collect locals; "
1111 "no symbol table info available.\n"));
1115 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1116 if (cb_data.count == 0)
1117 warning (_("No locals found in scope."));
1121 pc = get_pc_function_start (pc);
1122 block = block_for_pc (pc);
1125 warning (_("Can't collect args; no symbol table info available."));
1129 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1130 if (cb_data.count == 0)
1131 warning (_("No args found in scope."));
1136 add_static_trace_data (struct collection_list *collection)
1139 printf_filtered ("collect static trace data\n");
1140 collection->strace_data = 1;
1143 /* worker function */
1145 clear_collection_list (struct collection_list *list)
1149 list->next_memrange = 0;
1150 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1152 free_agent_expr (list->aexpr_list[ndx]);
1153 list->aexpr_list[ndx] = NULL;
1155 list->next_aexpr_elt = 0;
1156 memset (list->regs_mask, 0, sizeof (list->regs_mask));
1157 list->strace_data = 0;
1160 /* Reduce a collection list to string form (for gdb protocol). */
1162 stringify_collection_list (struct collection_list *list, char *string)
1164 char temp_buf[2048];
1168 char *(*str_list)[];
1172 count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
1173 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1175 if (list->strace_data)
1178 printf_filtered ("\nCollecting static trace data\n");
1181 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1185 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1186 if (list->regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1188 if (list->regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1191 printf_filtered ("\nCollecting registers (mask): 0x");
1196 QUIT; /* Allow user to bail out with ^C. */
1198 printf_filtered ("%02X", list->regs_mask[i]);
1199 sprintf (end, "%02X", list->regs_mask[i]);
1202 (*str_list)[ndx] = xstrdup (temp_buf);
1206 printf_filtered ("\n");
1207 if (list->next_memrange > 0 && info_verbose)
1208 printf_filtered ("Collecting memranges: \n");
1209 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1211 QUIT; /* Allow user to bail out with ^C. */
1212 sprintf_vma (tmp2, list->list[i].start);
1215 printf_filtered ("(%d, %s, %ld)\n",
1218 (long) (list->list[i].end - list->list[i].start));
1220 if (count + 27 > MAX_AGENT_EXPR_LEN)
1222 (*str_list)[ndx] = savestring (temp_buf, count);
1229 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1231 /* The "%X" conversion specifier expects an unsigned argument,
1232 so passing -1 (memrange_absolute) to it directly gives you
1233 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1235 if (list->list[i].type == memrange_absolute)
1236 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1238 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1241 count += strlen (end);
1242 end = temp_buf + count;
1245 for (i = 0; i < list->next_aexpr_elt; i++)
1247 QUIT; /* Allow user to bail out with ^C. */
1248 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1250 (*str_list)[ndx] = savestring (temp_buf, count);
1255 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1256 end += 10; /* 'X' + 8 hex digits + ',' */
1259 end = mem2hex (list->aexpr_list[i]->buf,
1260 end, list->aexpr_list[i]->len);
1261 count += 2 * list->aexpr_list[i]->len;
1266 (*str_list)[ndx] = savestring (temp_buf, count);
1271 (*str_list)[ndx] = NULL;
1284 encode_actions_1 (struct command_line *action,
1285 struct breakpoint *t,
1286 struct bp_location *tloc,
1288 LONGEST frame_offset,
1289 struct collection_list *collect,
1290 struct collection_list *stepping_list)
1293 struct expression *exp = NULL;
1295 struct value *tempval;
1296 struct cmd_list_element *cmd;
1297 struct agent_expr *aexpr;
1299 for (; action; action = action->next)
1301 QUIT; /* Allow user to bail out with ^C. */
1302 action_exp = action->line;
1303 while (isspace ((int) *action_exp))
1306 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1308 error (_("Bad action list item: %s"), action_exp);
1310 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1313 { /* Repeat over a comma-separated list. */
1314 QUIT; /* Allow user to bail out with ^C. */
1315 while (isspace ((int) *action_exp))
1318 if (0 == strncasecmp ("$reg", action_exp, 4))
1320 for (i = 0; i < gdbarch_num_regs (t->gdbarch); i++)
1321 add_register (collect, i);
1322 action_exp = strchr (action_exp, ','); /* more? */
1324 else if (0 == strncasecmp ("$arg", action_exp, 4))
1326 add_local_symbols (collect,
1332 action_exp = strchr (action_exp, ','); /* more? */
1334 else if (0 == strncasecmp ("$loc", action_exp, 4))
1336 add_local_symbols (collect,
1342 action_exp = strchr (action_exp, ','); /* more? */
1344 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1346 add_static_trace_data (collect);
1347 action_exp = strchr (action_exp, ','); /* more? */
1351 unsigned long addr, len;
1352 struct cleanup *old_chain = NULL;
1353 struct cleanup *old_chain1 = NULL;
1355 exp = parse_exp_1 (&action_exp,
1356 block_for_pc (tloc->address), 1);
1357 old_chain = make_cleanup (free_current_contents, &exp);
1359 switch (exp->elts[0].opcode)
1363 const char *name = &exp->elts[2].string;
1365 i = user_reg_map_name_to_regnum (t->gdbarch,
1366 name, strlen (name));
1368 internal_error (__FILE__, __LINE__,
1369 _("Register $%s not available"),
1372 printf_filtered ("OP_REGISTER: ");
1373 add_register (collect, i);
1378 /* Safe because we know it's a simple expression. */
1379 tempval = evaluate_expression (exp);
1380 addr = value_address (tempval);
1381 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
1382 add_memrange (collect, memrange_absolute, addr, len);
1386 collect_symbol (collect,
1387 exp->elts[2].symbol,
1394 default: /* Full-fledged expression. */
1395 aexpr = gen_trace_for_expr (tloc->address, exp);
1397 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1401 report_agent_reqs_errors (aexpr);
1403 discard_cleanups (old_chain1);
1404 add_aexpr (collect, aexpr);
1406 /* Take care of the registers. */
1407 if (aexpr->reg_mask_len > 0)
1412 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1414 QUIT; /* Allow user to bail out with ^C. */
1415 if (aexpr->reg_mask[ndx1] != 0)
1417 /* Assume chars have 8 bits. */
1418 for (ndx2 = 0; ndx2 < 8; ndx2++)
1419 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1420 /* It's used -- record it. */
1421 add_register (collect,
1428 do_cleanups (old_chain);
1431 while (action_exp && *action_exp++ == ',');
1433 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1436 { /* Repeat over a comma-separated list. */
1437 QUIT; /* Allow user to bail out with ^C. */
1438 while (isspace ((int) *action_exp))
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 aexpr = gen_eval_for_expr (tloc->address, exp);
1450 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1453 report_agent_reqs_errors (aexpr);
1455 discard_cleanups (old_chain1);
1456 /* Even though we're not officially collecting, add
1457 to the collect list anyway. */
1458 add_aexpr (collect, aexpr);
1460 do_cleanups (old_chain);
1463 while (action_exp && *action_exp++ == ',');
1465 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1467 /* We check against nested while-stepping when setting
1468 breakpoint action, so no way to run into nested
1470 gdb_assert (stepping_list);
1472 encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
1473 frame_offset, stepping_list, NULL);
1476 error (_("Invalid tracepoint command '%s'"), action->line);
1480 /* Render all actions into gdb protocol. */
1482 encode_actions (struct breakpoint *t, struct bp_location *tloc,
1483 char ***tdp_actions, char ***stepping_actions)
1485 static char tdp_buff[2048], step_buff[2048];
1486 char *default_collect_line = NULL;
1487 struct command_line *actions;
1488 struct command_line *default_collect_action = NULL;
1490 LONGEST frame_offset;
1491 struct cleanup *back_to;
1493 back_to = make_cleanup (null_cleanup, NULL);
1495 clear_collection_list (&tracepoint_list);
1496 clear_collection_list (&stepping_list);
1498 *tdp_actions = NULL;
1499 *stepping_actions = NULL;
1501 gdbarch_virtual_frame_pointer (t->gdbarch,
1502 t->loc->address, &frame_reg, &frame_offset);
1504 actions = breakpoint_commands (t);
1506 /* If there are default expressions to collect, make up a collect
1507 action and prepend to the action list to encode. Note that since
1508 validation is per-tracepoint (local var "xyz" might be valid for
1509 one tracepoint and not another, etc), we make up the action on
1510 the fly, and don't cache it. */
1511 if (*default_collect)
1515 default_collect_line = xstrprintf ("collect %s", default_collect);
1516 make_cleanup (xfree, default_collect_line);
1518 line = default_collect_line;
1519 validate_actionline (&line, t);
1521 default_collect_action = xmalloc (sizeof (struct command_line));
1522 make_cleanup (xfree, default_collect_action);
1523 default_collect_action->next = actions;
1524 default_collect_action->line = line;
1525 actions = default_collect_action;
1527 encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1528 &tracepoint_list, &stepping_list);
1530 memrange_sortmerge (&tracepoint_list);
1531 memrange_sortmerge (&stepping_list);
1533 *tdp_actions = stringify_collection_list (&tracepoint_list,
1535 *stepping_actions = stringify_collection_list (&stepping_list,
1538 do_cleanups (back_to);
1542 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1544 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1546 collect->aexpr_list =
1547 xrealloc (collect->aexpr_list,
1548 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1549 collect->aexpr_listsize *= 2;
1551 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1552 collect->next_aexpr_elt++;
1557 start_tracing (void)
1559 VEC(breakpoint_p) *tp_vec = NULL;
1561 struct breakpoint *t;
1562 struct trace_state_variable *tsv;
1563 int any_enabled = 0, num_to_download = 0;
1565 tp_vec = all_tracepoints ();
1567 /* No point in tracing without any tracepoints... */
1568 if (VEC_length (breakpoint_p, tp_vec) == 0)
1570 VEC_free (breakpoint_p, tp_vec);
1571 error (_("No tracepoints defined, not starting trace"));
1574 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1576 if (t->enable_state == bp_enabled)
1579 if ((t->type == bp_fast_tracepoint
1580 ? may_insert_fast_tracepoints
1581 : may_insert_tracepoints))
1584 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1585 (t->type == bp_fast_tracepoint ? "fast " : ""), t->number);
1588 /* No point in tracing with only disabled tracepoints. */
1591 VEC_free (breakpoint_p, tp_vec);
1592 error (_("No tracepoints enabled, not starting trace"));
1595 if (num_to_download <= 0)
1597 VEC_free (breakpoint_p, tp_vec);
1598 error (_("No tracepoints that may be downloaded, not starting trace"));
1601 target_trace_init ();
1603 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1605 if ((t->type == bp_fast_tracepoint
1606 ? !may_insert_fast_tracepoints
1607 : !may_insert_tracepoints))
1610 t->number_on_target = 0;
1611 target_download_tracepoint (t);
1612 t->number_on_target = t->number;
1614 VEC_free (breakpoint_p, tp_vec);
1616 /* Send down all the trace state variables too. */
1617 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1619 target_download_trace_state_variable (tsv);
1622 /* Tell target to treat text-like sections as transparent. */
1623 target_trace_set_readonly_regions ();
1624 /* Set some mode flags. */
1625 target_set_disconnected_tracing (disconnected_tracing);
1626 target_set_circular_trace_buffer (circular_trace_buffer);
1628 /* Now insert traps and begin collecting data. */
1629 target_trace_start ();
1631 /* Reset our local state. */
1632 set_traceframe_num (-1);
1633 set_tracepoint_num (-1);
1634 set_traceframe_context (NULL);
1635 current_trace_status()->running = 1;
1636 clear_traceframe_info ();
1641 Tell target to clear any previous trace experiment.
1642 Walk the list of tracepoints, and send them (and their actions)
1643 to the target. If no errors,
1644 Tell target to start a new trace experiment. */
1647 trace_start_command (char *args, int from_tty)
1649 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1651 if (current_trace_status ()->running)
1654 && !query (_("A trace is running already. Start a new run? ")))
1655 error (_("New trace run not started."));
1663 trace_stop_command (char *args, int from_tty)
1665 if (!current_trace_status ()->running)
1666 error (_("Trace is not running."));
1674 target_trace_stop ();
1675 /* Should change in response to reply? */
1676 current_trace_status ()->running = 0;
1679 /* tstatus command */
1681 trace_status_command (char *args, int from_tty)
1683 struct trace_status *ts = current_trace_status ();
1686 status = target_get_trace_status (ts);
1691 printf_filtered (_("Using a trace file.\n"));
1694 printf_filtered (_("Trace can not be run on this target.\n"));
1699 if (!ts->running_known)
1701 printf_filtered (_("Run/stop status is unknown.\n"));
1703 else if (ts->running)
1705 printf_filtered (_("Trace is running on the target.\n"));
1709 switch (ts->stop_reason)
1711 case trace_never_run:
1712 printf_filtered (_("No trace has been run on the target.\n"));
1715 printf_filtered (_("Trace stopped by a tstop command.\n"));
1717 case trace_buffer_full:
1718 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1720 case trace_disconnected:
1721 printf_filtered (_("Trace stopped because of disconnection.\n"));
1723 case tracepoint_passcount:
1724 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1725 ts->stopping_tracepoint);
1727 case tracepoint_error:
1728 if (ts->stopping_tracepoint)
1729 printf_filtered (_("Trace stopped by an "
1730 "error (%s, tracepoint %d).\n"),
1731 ts->error_desc, ts->stopping_tracepoint);
1733 printf_filtered (_("Trace stopped by an error (%s).\n"),
1736 case trace_stop_reason_unknown:
1737 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1740 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1746 if (ts->traceframes_created >= 0
1747 && ts->traceframe_count != ts->traceframes_created)
1749 printf_filtered (_("Buffer contains %d trace "
1750 "frames (of %d created total).\n"),
1751 ts->traceframe_count, ts->traceframes_created);
1753 else if (ts->traceframe_count >= 0)
1755 printf_filtered (_("Collected %d trace frames.\n"),
1756 ts->traceframe_count);
1759 if (ts->buffer_free >= 0)
1761 if (ts->buffer_size >= 0)
1763 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1764 ts->buffer_free, ts->buffer_size);
1765 if (ts->buffer_size > 0)
1766 printf_filtered (_(" (%d%% full)"),
1767 ((int) ((((long long) (ts->buffer_size
1768 - ts->buffer_free)) * 100)
1769 / ts->buffer_size)));
1770 printf_filtered (_(".\n"));
1773 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1777 if (ts->disconnected_tracing)
1778 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1780 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1782 if (ts->circular_buffer)
1783 printf_filtered (_("Trace buffer is circular.\n"));
1785 /* Now report on what we're doing with tfind. */
1786 if (traceframe_number >= 0)
1787 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1788 traceframe_number, tracepoint_number);
1790 printf_filtered (_("Not looking at any trace frame.\n"));
1793 /* Report the trace status to uiout, in a way suitable for MI, and not
1794 suitable for CLI. If ON_STOP is true, suppress a few fields that
1795 are not meaningful in the -trace-stop response.
1797 The implementation is essentially parallel to trace_status_command, but
1798 merging them will result in unreadable code. */
1800 trace_status_mi (int on_stop)
1802 struct trace_status *ts = current_trace_status ();
1805 status = target_get_trace_status (ts);
1807 if (status == -1 && !ts->from_file)
1809 ui_out_field_string (uiout, "supported", "0");
1814 ui_out_field_string (uiout, "supported", "file");
1816 ui_out_field_string (uiout, "supported", "1");
1818 gdb_assert (ts->running_known);
1822 ui_out_field_string (uiout, "running", "1");
1824 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1825 Given that the frontend gets the status either on -trace-stop, or from
1826 -trace-status after re-connection, it does not seem like this
1827 information is necessary for anything. It is not necessary for either
1828 figuring the vital state of the target nor for navigation of trace
1829 frames. If the frontend wants to show the current state is some
1830 configure dialog, it can request the value when such dialog is
1831 invoked by the user. */
1835 char *stop_reason = NULL;
1836 int stopping_tracepoint = -1;
1839 ui_out_field_string (uiout, "running", "0");
1841 if (ts->stop_reason != trace_stop_reason_unknown)
1843 switch (ts->stop_reason)
1846 stop_reason = "request";
1848 case trace_buffer_full:
1849 stop_reason = "overflow";
1851 case trace_disconnected:
1852 stop_reason = "disconnection";
1854 case tracepoint_passcount:
1855 stop_reason = "passcount";
1856 stopping_tracepoint = ts->stopping_tracepoint;
1858 case tracepoint_error:
1859 stop_reason = "error";
1860 stopping_tracepoint = ts->stopping_tracepoint;
1866 ui_out_field_string (uiout, "stop-reason", stop_reason);
1867 if (stopping_tracepoint != -1)
1868 ui_out_field_int (uiout, "stopping-tracepoint",
1869 stopping_tracepoint);
1870 if (ts->stop_reason == tracepoint_error)
1871 ui_out_field_string (uiout, "error-description",
1877 if (ts->traceframe_count != -1)
1878 ui_out_field_int (uiout, "frames", ts->traceframe_count);
1879 if (ts->traceframes_created != -1)
1880 ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
1881 if (ts->buffer_size != -1)
1882 ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
1883 if (ts->buffer_free != -1)
1884 ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
1886 ui_out_field_int (uiout, "disconnected", ts->disconnected_tracing);
1887 ui_out_field_int (uiout, "circular", ts->circular_buffer);
1890 /* This function handles the details of what to do about an ongoing
1891 tracing run if the user has asked to detach or otherwise disconnect
1894 disconnect_tracing (int from_tty)
1896 /* It can happen that the target that was tracing went away on its
1897 own, and we didn't notice. Get a status update, and if the
1898 current target doesn't even do tracing, then assume it's not
1900 if (target_get_trace_status (current_trace_status ()) < 0)
1901 current_trace_status ()->running = 0;
1903 /* If running interactively, give the user the option to cancel and
1904 then decide what to do differently with the run. Scripts are
1905 just going to disconnect and let the target deal with it,
1906 according to how it's been instructed previously via
1907 disconnected-tracing. */
1908 if (current_trace_status ()->running && from_tty)
1910 if (current_trace_status ()->disconnected_tracing)
1912 if (!query (_("Trace is running and will "
1913 "continue after detach; detach anyway? ")))
1914 error (_("Not confirmed."));
1918 if (!query (_("Trace is running but will "
1919 "stop on detach; detach anyway? ")))
1920 error (_("Not confirmed."));
1924 /* Also we want to be out of tfind mode, otherwise things can get
1925 confusing upon reconnection. Just use these calls instead of
1926 full tfind_1 behavior because we're in the middle of detaching,
1927 and there's no point to updating current stack frame etc. */
1928 set_current_traceframe (-1);
1929 set_traceframe_context (NULL);
1932 /* Worker function for the various flavors of the tfind command. */
1934 tfind_1 (enum trace_find_type type, int num,
1935 ULONGEST addr1, ULONGEST addr2,
1938 int target_frameno = -1, target_tracept = -1;
1939 struct frame_id old_frame_id = null_frame_id;
1940 struct breakpoint *tp;
1942 /* Only try to get the current stack frame if we have a chance of
1943 succeeding. In particular, if we're trying to get a first trace
1944 frame while all threads are running, it's not going to succeed,
1945 so leave it with a default value and let the frame comparison
1946 below (correctly) decide to print out the source location of the
1948 if (!(type == tfind_number && num == -1)
1949 && (has_stack_frames () || traceframe_number >= 0))
1950 old_frame_id = get_frame_id (get_current_frame ());
1952 target_frameno = target_trace_find (type, num, addr1, addr2,
1955 if (type == tfind_number
1957 && target_frameno == -1)
1959 /* We told the target to get out of tfind mode, and it did. */
1961 else if (target_frameno == -1)
1963 /* A request for a non-existent trace frame has failed.
1964 Our response will be different, depending on FROM_TTY:
1966 If FROM_TTY is true, meaning that this command was
1967 typed interactively by the user, then give an error
1968 and DO NOT change the state of traceframe_number etc.
1970 However if FROM_TTY is false, meaning that we're either
1971 in a script, a loop, or a user-defined command, then
1972 DON'T give an error, but DO change the state of
1973 traceframe_number etc. to invalid.
1975 The rationalle is that if you typed the command, you
1976 might just have committed a typo or something, and you'd
1977 like to NOT lose your current debugging state. However
1978 if you're in a user-defined command or especially in a
1979 loop, then you need a way to detect that the command
1980 failed WITHOUT aborting. This allows you to write
1981 scripts that search thru the trace buffer until the end,
1982 and then continue on to do something else. */
1985 error (_("Target failed to find requested trace frame."));
1989 printf_filtered ("End of trace buffer.\n");
1990 #if 0 /* dubious now? */
1991 /* The following will not recurse, since it's
1993 trace_find_command ("-1", from_tty);
1998 tp = get_tracepoint_by_number_on_target (target_tracept);
2000 reinit_frame_cache ();
2001 registers_changed ();
2002 target_dcache_invalidate ();
2003 set_traceframe_num (target_frameno);
2004 clear_traceframe_info ();
2005 set_tracepoint_num (tp ? tp->number : target_tracept);
2006 if (target_frameno == -1)
2007 set_traceframe_context (NULL);
2009 set_traceframe_context (get_current_frame ());
2011 if (traceframe_number >= 0)
2013 /* Use different branches for MI and CLI to make CLI messages
2015 if (ui_out_is_mi_like_p (uiout))
2017 ui_out_field_string (uiout, "found", "1");
2018 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2019 ui_out_field_int (uiout, "traceframe", traceframe_number);
2023 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2024 traceframe_number, tracepoint_number);
2029 if (ui_out_is_mi_like_p (uiout))
2030 ui_out_field_string (uiout, "found", "0");
2031 else if (type == tfind_number && num == -1)
2032 printf_unfiltered (_("No longer looking at any trace frame\n"));
2033 else /* This case may never occur, check. */
2034 printf_unfiltered (_("No trace frame found\n"));
2037 /* If we're in nonstop mode and getting out of looking at trace
2038 frames, there won't be any current frame to go back to and
2041 && (has_stack_frames () || traceframe_number >= 0))
2043 enum print_what print_what;
2045 /* NOTE: in imitation of the step command, try to determine
2046 whether we have made a transition from one function to
2047 another. If so, we'll print the "stack frame" (ie. the new
2048 function and it's arguments) -- otherwise we'll just show the
2051 if (frame_id_eq (old_frame_id,
2052 get_frame_id (get_current_frame ())))
2053 print_what = SRC_LINE;
2055 print_what = SRC_AND_LOC;
2057 print_stack_frame (get_selected_frame (NULL), 1, print_what);
2062 /* trace_find_command takes a trace frame number n,
2063 sends "QTFrame:<n>" to the target,
2064 and accepts a reply that may contain several optional pieces
2065 of information: a frame number, a tracepoint number, and an
2066 indication of whether this is a trap frame or a stepping frame.
2068 The minimal response is just "OK" (which indicates that the
2069 target does not give us a frame number or a tracepoint number).
2070 Instead of that, the target may send us a string containing
2072 F<hexnum> (gives the selected frame number)
2073 T<hexnum> (gives the selected tracepoint number)
2078 trace_find_command (char *args, int from_tty)
2079 { /* This should only be called with a numeric argument. */
2082 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2083 error (_("May not look at trace frames while trace is running."));
2085 if (args == 0 || *args == 0)
2086 { /* TFIND with no args means find NEXT trace frame. */
2087 if (traceframe_number == -1)
2088 frameno = 0; /* "next" is first one. */
2090 frameno = traceframe_number + 1;
2092 else if (0 == strcmp (args, "-"))
2094 if (traceframe_number == -1)
2095 error (_("not debugging trace buffer"));
2096 else if (from_tty && traceframe_number == 0)
2097 error (_("already at start of trace buffer"));
2099 frameno = traceframe_number - 1;
2101 /* A hack to work around eval's need for fp to have been collected. */
2102 else if (0 == strcmp (args, "-1"))
2105 frameno = parse_and_eval_long (args);
2108 error (_("invalid input (%d is less than zero)"), frameno);
2110 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2115 trace_find_end_command (char *args, int from_tty)
2117 trace_find_command ("-1", from_tty);
2122 trace_find_none_command (char *args, int from_tty)
2124 trace_find_command ("-1", from_tty);
2129 trace_find_start_command (char *args, int from_tty)
2131 trace_find_command ("0", from_tty);
2134 /* tfind pc command */
2136 trace_find_pc_command (char *args, int from_tty)
2140 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2141 error (_("May not look at trace frames while trace is running."));
2143 if (args == 0 || *args == 0)
2144 pc = regcache_read_pc (get_current_regcache ());
2146 pc = parse_and_eval_address (args);
2148 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2151 /* tfind tracepoint command */
2153 trace_find_tracepoint_command (char *args, int from_tty)
2156 struct breakpoint *tp;
2158 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2159 error (_("May not look at trace frames while trace is running."));
2161 if (args == 0 || *args == 0)
2163 if (tracepoint_number == -1)
2164 error (_("No current tracepoint -- please supply an argument."));
2166 tdp = tracepoint_number; /* Default is current TDP. */
2169 tdp = parse_and_eval_long (args);
2171 /* If we have the tracepoint on hand, use the number that the
2172 target knows about (which may be different if we disconnected
2173 and reconnected). */
2174 tp = get_tracepoint (tdp);
2176 tdp = tp->number_on_target;
2178 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2181 /* TFIND LINE command:
2183 This command will take a sourceline for argument, just like BREAK
2184 or TRACE (ie. anything that "decode_line_1" can handle).
2186 With no argument, this command will find the next trace frame
2187 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2190 trace_find_line_command (char *args, int from_tty)
2192 static CORE_ADDR start_pc, end_pc;
2193 struct symtabs_and_lines sals;
2194 struct symtab_and_line sal;
2195 struct cleanup *old_chain;
2197 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2198 error (_("May not look at trace frames while trace is running."));
2200 if (args == 0 || *args == 0)
2202 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2204 sals.sals = (struct symtab_and_line *)
2205 xmalloc (sizeof (struct symtab_and_line));
2210 sals = decode_line_spec (args, 1);
2214 old_chain = make_cleanup (xfree, sals.sals);
2215 if (sal.symtab == 0)
2216 error (_("No line number information available."));
2218 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2220 if (start_pc == end_pc)
2222 printf_filtered ("Line %d of \"%s\"",
2223 sal.line, sal.symtab->filename);
2225 printf_filtered (" is at address ");
2226 print_address (get_current_arch (), start_pc, gdb_stdout);
2228 printf_filtered (" but contains no code.\n");
2229 sal = find_pc_line (start_pc, 0);
2231 && find_line_pc_range (sal, &start_pc, &end_pc)
2232 && start_pc != end_pc)
2233 printf_filtered ("Attempting to find line %d instead.\n",
2236 error (_("Cannot find a good line."));
2240 /* Is there any case in which we get here, and have an address
2241 which the user would want to see? If we have debugging
2242 symbols and no line numbers? */
2243 error (_("Line number %d is out of range for \"%s\"."),
2244 sal.line, sal.symtab->filename);
2246 /* Find within range of stated line. */
2248 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2250 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2251 do_cleanups (old_chain);
2254 /* tfind range command */
2256 trace_find_range_command (char *args, int from_tty)
2258 static CORE_ADDR start, stop;
2261 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2262 error (_("May not look at trace frames while trace is running."));
2264 if (args == 0 || *args == 0)
2265 { /* XXX FIXME: what should default behavior be? */
2266 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2270 if (0 != (tmp = strchr (args, ',')))
2272 *tmp++ = '\0'; /* Terminate start address. */
2273 while (isspace ((int) *tmp))
2275 start = parse_and_eval_address (args);
2276 stop = parse_and_eval_address (tmp);
2279 { /* No explicit end address? */
2280 start = parse_and_eval_address (args);
2281 stop = start + 1; /* ??? */
2284 tfind_1 (tfind_range, 0, start, stop, from_tty);
2287 /* tfind outside command */
2289 trace_find_outside_command (char *args, int from_tty)
2291 CORE_ADDR start, stop;
2294 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2295 error (_("May not look at trace frames while trace is running."));
2297 if (args == 0 || *args == 0)
2298 { /* XXX FIXME: what should default behavior be? */
2299 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2303 if (0 != (tmp = strchr (args, ',')))
2305 *tmp++ = '\0'; /* Terminate start address. */
2306 while (isspace ((int) *tmp))
2308 start = parse_and_eval_address (args);
2309 stop = parse_and_eval_address (tmp);
2312 { /* No explicit end address? */
2313 start = parse_and_eval_address (args);
2314 stop = start + 1; /* ??? */
2317 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2320 /* info scope command: list the locals for a scope. */
2322 scope_info (char *args, int from_tty)
2324 struct symtabs_and_lines sals;
2326 struct minimal_symbol *msym;
2327 struct block *block;
2328 char *symname, *save_args = args;
2329 struct dict_iterator iter;
2331 struct gdbarch *gdbarch;
2334 if (args == 0 || *args == 0)
2335 error (_("requires an argument (function, "
2336 "line or *addr) to define a scope"));
2338 sals = decode_line_1 (&args, 1, NULL, 0, NULL, NULL);
2339 if (sals.nelts == 0)
2340 return; /* Presumably decode_line_1 has already warned. */
2342 /* Resolve line numbers to PC. */
2343 resolve_sal_pc (&sals.sals[0]);
2344 block = block_for_pc (sals.sals[0].pc);
2348 QUIT; /* Allow user to bail out with ^C. */
2349 ALL_BLOCK_SYMBOLS (block, iter, sym)
2351 QUIT; /* Allow user to bail out with ^C. */
2353 printf_filtered ("Scope for %s:\n", save_args);
2356 symname = SYMBOL_PRINT_NAME (sym);
2357 if (symname == NULL || *symname == '\0')
2358 continue; /* Probably botched, certainly useless. */
2360 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2362 printf_filtered ("Symbol %s is ", symname);
2363 switch (SYMBOL_CLASS (sym))
2366 case LOC_UNDEF: /* Messed up symbol? */
2367 printf_filtered ("a bogus symbol, class %d.\n",
2368 SYMBOL_CLASS (sym));
2369 count--; /* Don't count this one. */
2372 printf_filtered ("a constant with value %ld (0x%lx)",
2373 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2375 case LOC_CONST_BYTES:
2376 printf_filtered ("constant bytes: ");
2377 if (SYMBOL_TYPE (sym))
2378 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2379 fprintf_filtered (gdb_stdout, " %02x",
2380 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2383 printf_filtered ("in static storage at address ");
2384 printf_filtered ("%s", paddress (gdbarch,
2385 SYMBOL_VALUE_ADDRESS (sym)));
2388 /* GDBARCH is the architecture associated with the objfile
2389 the symbol is defined in; the target architecture may be
2390 different, and may provide additional registers. However,
2391 we do not know the target architecture at this point.
2392 We assume the objfile architecture will contain all the
2393 standard registers that occur in debug info in that
2395 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2398 if (SYMBOL_IS_ARGUMENT (sym))
2399 printf_filtered ("an argument in register $%s",
2400 gdbarch_register_name (gdbarch, regno));
2402 printf_filtered ("a local variable in register $%s",
2403 gdbarch_register_name (gdbarch, regno));
2406 printf_filtered ("an argument at stack/frame offset %ld",
2407 SYMBOL_VALUE (sym));
2410 printf_filtered ("a local variable at frame offset %ld",
2411 SYMBOL_VALUE (sym));
2414 printf_filtered ("a reference argument at offset %ld",
2415 SYMBOL_VALUE (sym));
2417 case LOC_REGPARM_ADDR:
2418 /* Note comment at LOC_REGISTER. */
2419 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2421 printf_filtered ("the address of an argument, in register $%s",
2422 gdbarch_register_name (gdbarch, regno));
2425 printf_filtered ("a typedef.\n");
2428 printf_filtered ("a label at address ");
2429 printf_filtered ("%s", paddress (gdbarch,
2430 SYMBOL_VALUE_ADDRESS (sym)));
2433 printf_filtered ("a function at address ");
2434 printf_filtered ("%s",
2435 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2437 case LOC_UNRESOLVED:
2438 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2441 printf_filtered ("Unresolved Static");
2444 printf_filtered ("static storage at address ");
2445 printf_filtered ("%s",
2446 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2449 case LOC_OPTIMIZED_OUT:
2450 printf_filtered ("optimized out.\n");
2453 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2454 BLOCK_START (block),
2458 if (SYMBOL_TYPE (sym))
2459 printf_filtered (", length %d.\n",
2460 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2462 if (BLOCK_FUNCTION (block))
2465 block = BLOCK_SUPERBLOCK (block);
2468 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2472 /* worker function (cleanup) */
2474 replace_comma (void *data)
2481 /* Helper for trace_dump_command. Dump the action list starting at
2482 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2483 actions of the body of a while-stepping action. STEPPING_FRAME is
2484 set if the current traceframe was determined to be a while-stepping
2488 trace_dump_actions (struct command_line *action,
2489 int stepping_actions, int stepping_frame,
2492 char *action_exp, *next_comma;
2494 for (; action != NULL; action = action->next)
2496 struct cmd_list_element *cmd;
2498 QUIT; /* Allow user to bail out with ^C. */
2499 action_exp = action->line;
2500 while (isspace ((int) *action_exp))
2503 /* The collection actions to be done while stepping are
2504 bracketed by the commands "while-stepping" and "end". */
2506 if (*action_exp == '#') /* comment line */
2509 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2511 error (_("Bad action list item: %s"), action_exp);
2513 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2517 for (i = 0; i < action->body_count; ++i)
2518 trace_dump_actions (action->body_list[i],
2519 1, stepping_frame, from_tty);
2521 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2523 /* Display the collected data.
2524 For the trap frame, display only what was collected at
2525 the trap. Likewise for stepping frames, display only
2526 what was collected while stepping. This means that the
2527 two boolean variables, STEPPING_FRAME and
2528 STEPPING_ACTIONS should be equal. */
2529 if (stepping_frame == stepping_actions)
2532 { /* Repeat over a comma-separated list. */
2533 QUIT; /* Allow user to bail out with ^C. */
2534 if (*action_exp == ',')
2536 while (isspace ((int) *action_exp))
2539 next_comma = strchr (action_exp, ',');
2541 if (0 == strncasecmp (action_exp, "$reg", 4))
2542 registers_info (NULL, from_tty);
2543 else if (0 == strncasecmp (action_exp, "$loc", 4))
2544 locals_info (NULL, from_tty);
2545 else if (0 == strncasecmp (action_exp, "$arg", 4))
2546 args_info (NULL, from_tty);
2551 make_cleanup (replace_comma, next_comma);
2554 printf_filtered ("%s = ", action_exp);
2555 output_command (action_exp, from_tty);
2556 printf_filtered ("\n");
2560 action_exp = next_comma;
2562 while (action_exp && *action_exp == ',');
2568 /* The tdump command. */
2571 trace_dump_command (char *args, int from_tty)
2573 struct regcache *regcache;
2574 struct breakpoint *t;
2575 int stepping_frame = 0;
2576 struct bp_location *loc;
2577 char *line, *default_collect_line = NULL;
2578 struct command_line *actions, *default_collect_action = NULL;
2579 struct cleanup *old_chain = NULL;
2581 if (tracepoint_number == -1)
2583 warning (_("No current trace frame."));
2587 t = get_tracepoint (tracepoint_number);
2590 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2593 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2594 tracepoint_number, traceframe_number);
2596 /* The current frame is a trap frame if the frame PC is equal
2597 to the tracepoint PC. If not, then the current frame was
2598 collected during single-stepping. */
2600 regcache = get_current_regcache ();
2602 /* If the traceframe's address matches any of the tracepoint's
2603 locations, assume it is a direct hit rather than a while-stepping
2604 frame. (FIXME this is not reliable, should record each frame's
2607 for (loc = t->loc; loc; loc = loc->next)
2608 if (loc->address == regcache_read_pc (regcache))
2611 actions = breakpoint_commands (t);
2613 /* If there is a default-collect list, make up a collect command,
2614 prepend to the tracepoint's commands, and pass the whole mess to
2615 the trace dump scanner. We need to validate because
2616 default-collect might have been junked since the trace run. */
2617 if (*default_collect)
2619 default_collect_line = xstrprintf ("collect %s", default_collect);
2620 old_chain = make_cleanup (xfree, default_collect_line);
2621 line = default_collect_line;
2622 validate_actionline (&line, t);
2623 default_collect_action = xmalloc (sizeof (struct command_line));
2624 make_cleanup (xfree, default_collect_action);
2625 default_collect_action->next = actions;
2626 default_collect_action->line = line;
2627 actions = default_collect_action;
2630 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2632 if (*default_collect)
2633 do_cleanups (old_chain);
2636 /* Encode a piece of a tracepoint's source-level definition in a form
2637 that is suitable for both protocol and saving in files. */
2638 /* This version does not do multiple encodes for long strings; it should
2639 return an offset to the next piece to encode. FIXME */
2642 encode_source_string (int tpnum, ULONGEST addr,
2643 char *srctype, char *src, char *buf, int buf_size)
2645 if (80 + strlen (srctype) > buf_size)
2646 error (_("Buffer too small for source encoding"));
2647 sprintf (buf, "%x:%s:%s:%x:%x:",
2648 tpnum, phex_nz (addr, sizeof (addr)),
2649 srctype, 0, (int) strlen (src));
2650 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2651 error (_("Source string too long for buffer"));
2652 bin2hex (src, buf + strlen (buf), 0);
2656 extern int trace_regblock_size;
2658 /* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2659 non-zero, the save is performed on the target, otherwise GDB obtains all
2660 trace data and saves it locally. */
2663 trace_save (const char *filename, int target_does_save)
2665 struct cleanup *cleanup;
2667 struct trace_status *ts = current_trace_status ();
2670 struct uploaded_tp *uploaded_tps = NULL, *utp;
2671 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2675 ULONGEST offset = 0;
2676 #define MAX_TRACE_UPLOAD 2000
2677 gdb_byte buf[MAX_TRACE_UPLOAD];
2680 /* If the target is to save the data to a file on its own, then just
2681 send the command and be done with it. */
2682 if (target_does_save)
2684 err = target_save_trace_data (filename);
2686 error (_("Target failed to save trace data to '%s'."),
2691 /* Get the trace status first before opening the file, so if the
2692 target is losing, we can get out without touching files. */
2693 status = target_get_trace_status (ts);
2695 pathname = tilde_expand (filename);
2696 cleanup = make_cleanup (xfree, pathname);
2698 fp = fopen (pathname, "wb");
2700 error (_("Unable to open file '%s' for saving trace data (%s)"),
2701 filename, safe_strerror (errno));
2702 make_cleanup_fclose (fp);
2704 /* Write a file header, with a high-bit-set char to indicate a
2705 binary file, plus a hint as what this file is, and a version
2706 number in case of future needs. */
2707 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
2709 perror_with_name (pathname);
2711 /* Write descriptive info. */
2713 /* Write out the size of a register block. */
2714 fprintf (fp, "R %x\n", trace_regblock_size);
2716 /* Write out status of the tracing run (aka "tstatus" info). */
2717 fprintf (fp, "status %c;%s",
2718 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
2719 if (ts->stop_reason == tracepoint_error)
2721 char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
2723 bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
2724 fprintf (fp, ":%s", buf);
2726 fprintf (fp, ":%x", ts->stopping_tracepoint);
2727 if (ts->traceframe_count >= 0)
2728 fprintf (fp, ";tframes:%x", ts->traceframe_count);
2729 if (ts->traceframes_created >= 0)
2730 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2731 if (ts->buffer_free >= 0)
2732 fprintf (fp, ";tfree:%x", ts->buffer_free);
2733 if (ts->buffer_size >= 0)
2734 fprintf (fp, ";tsize:%x", ts->buffer_size);
2735 if (ts->disconnected_tracing)
2736 fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
2737 if (ts->circular_buffer)
2738 fprintf (fp, ";circular:%x", ts->circular_buffer);
2741 /* Note that we want to upload tracepoints and save those, rather
2742 than simply writing out the local ones, because the user may have
2743 changed tracepoints in GDB in preparation for a future tracing
2744 run, or maybe just mass-deleted all types of breakpoints as part
2745 of cleaning up. So as not to contaminate the session, leave the
2746 data in its uploaded form, don't make into real tracepoints. */
2748 /* Get trace state variables first, they may be checked when parsing
2749 uploaded commands. */
2751 target_upload_trace_state_variables (&uploaded_tsvs);
2753 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2759 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2760 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2763 fprintf (fp, "tsv %x:%s:%x:%s\n",
2764 utsv->number, phex_nz (utsv->initial_value, 8),
2765 utsv->builtin, buf);
2771 free_uploaded_tsvs (&uploaded_tsvs);
2773 target_upload_tracepoints (&uploaded_tps);
2775 for (utp = uploaded_tps; utp; utp = utp->next)
2777 fprintf (fp, "tp T%x:%s:%c:%x:%x",
2778 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2779 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2780 if (utp->type == bp_fast_tracepoint)
2781 fprintf (fp, ":F%x", utp->orig_size);
2783 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2786 for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
2787 fprintf (fp, "tp A%x:%s:%s\n",
2788 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2789 for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
2790 fprintf (fp, "tp S%x:%s:%s\n",
2791 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2794 encode_source_string (utp->number, utp->addr,
2795 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
2796 fprintf (fp, "tp Z%s\n", buf);
2798 if (utp->cond_string)
2800 encode_source_string (utp->number, utp->addr,
2801 "cond", utp->cond_string,
2802 buf, MAX_TRACE_UPLOAD);
2803 fprintf (fp, "tp Z%s\n", buf);
2805 for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
2807 encode_source_string (utp->number, utp->addr, "cmd", act,
2808 buf, MAX_TRACE_UPLOAD);
2809 fprintf (fp, "tp Z%s\n", buf);
2813 free_uploaded_tps (&uploaded_tps);
2815 /* Mark the end of the definition section. */
2818 /* Get and write the trace data proper. We ask for big blocks, in
2819 the hopes of efficiency, but will take less if the target has
2820 packet size limitations or some such. */
2823 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2825 error (_("Failure to get requested trace buffer data"));
2826 /* No more data is forthcoming, we're done. */
2829 written = fwrite (buf, gotten, 1, fp);
2831 perror_with_name (pathname);
2835 /* Mark the end of trace data. (We know that gotten is 0 at this point.) */
2836 written = fwrite (&gotten, 4, 1, fp);
2838 perror_with_name (pathname);
2840 do_cleanups (cleanup);
2844 trace_save_command (char *args, int from_tty)
2846 int target_does_save = 0;
2848 char *filename = NULL;
2849 struct cleanup *back_to;
2852 error_no_arg (_("file in which to save trace data"));
2854 argv = gdb_buildargv (args);
2855 back_to = make_cleanup_freeargv (argv);
2857 for (; *argv; ++argv)
2859 if (strcmp (*argv, "-r") == 0)
2860 target_does_save = 1;
2861 else if (**argv == '-')
2862 error (_("unknown option `%s'"), *argv);
2868 error_no_arg (_("file in which to save trace data"));
2870 trace_save (filename, target_does_save);
2873 printf_filtered (_("Trace data saved to file '%s'.\n"), args);
2875 do_cleanups (back_to);
2878 /* Tell the target what to do with an ongoing tracing run if GDB
2879 disconnects for some reason. */
2882 send_disconnected_tracing_value (int value)
2884 target_set_disconnected_tracing (value);
2888 set_disconnected_tracing (char *args, int from_tty,
2889 struct cmd_list_element *c)
2891 send_disconnected_tracing_value (disconnected_tracing);
2895 set_circular_trace_buffer (char *args, int from_tty,
2896 struct cmd_list_element *c)
2898 target_set_circular_trace_buffer (circular_trace_buffer);
2901 /* Convert the memory pointed to by mem into hex, placing result in buf.
2902 * Return a pointer to the last char put in buf (null)
2903 * "stolen" from sparc-stub.c
2906 static const char hexchars[] = "0123456789abcdef";
2909 mem2hex (gdb_byte *mem, char *buf, int count)
2917 *buf++ = hexchars[ch >> 4];
2918 *buf++ = hexchars[ch & 0xf];
2927 get_traceframe_number (void)
2929 return traceframe_number;
2932 /* Make the traceframe NUM be the current trace frame. Does nothing
2933 if NUM is already current. */
2936 set_current_traceframe (int num)
2940 if (traceframe_number == num)
2942 /* Nothing to do. */
2946 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
2949 warning (_("could not change traceframe"));
2951 traceframe_number = newnum;
2953 /* Changing the traceframe changes our view of registers and of the
2955 registers_changed ();
2957 clear_traceframe_info ();
2960 /* Make the traceframe NUM be the current trace frame, and do nothing
2964 set_traceframe_number (int num)
2966 traceframe_number = num;
2969 /* A cleanup used when switching away and back from tfind mode. */
2971 struct current_traceframe_cleanup
2973 /* The traceframe we were inspecting. */
2974 int traceframe_number;
2978 do_restore_current_traceframe_cleanup (void *arg)
2980 struct current_traceframe_cleanup *old = arg;
2982 set_current_traceframe (old->traceframe_number);
2986 restore_current_traceframe_cleanup_dtor (void *arg)
2988 struct current_traceframe_cleanup *old = arg;
2994 make_cleanup_restore_current_traceframe (void)
2996 struct current_traceframe_cleanup *old;
2998 old = xmalloc (sizeof (struct current_traceframe_cleanup));
2999 old->traceframe_number = traceframe_number;
3001 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3002 restore_current_traceframe_cleanup_dtor);
3006 make_cleanup_restore_traceframe_number (void)
3008 return make_cleanup_restore_integer (&traceframe_number);
3011 /* Given a number and address, return an uploaded tracepoint with that
3012 number, creating if necessary. */
3014 struct uploaded_tp *
3015 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3017 struct uploaded_tp *utp;
3019 for (utp = *utpp; utp; utp = utp->next)
3020 if (utp->number == num && utp->addr == addr)
3022 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3023 memset (utp, 0, sizeof (struct uploaded_tp));
3026 utp->actions = NULL;
3027 utp->step_actions = NULL;
3028 utp->cmd_strings = NULL;
3035 free_uploaded_tps (struct uploaded_tp **utpp)
3037 struct uploaded_tp *next_one;
3041 next_one = (*utpp)->next;
3047 /* Given a number and address, return an uploaded tracepoint with that
3048 number, creating if necessary. */
3050 struct uploaded_tsv *
3051 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3053 struct uploaded_tsv *utsv;
3055 for (utsv = *utsvp; utsv; utsv = utsv->next)
3056 if (utsv->number == num)
3058 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3059 memset (utsv, 0, sizeof (struct uploaded_tsv));
3061 utsv->next = *utsvp;
3067 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3069 struct uploaded_tsv *next_one;
3073 next_one = (*utsvp)->next;
3079 /* Look for an existing tracepoint that seems similar enough to the
3080 uploaded one. Enablement isn't compared, because the user can
3081 toggle that freely, and may have done so in anticipation of the
3085 find_matching_tracepoint (struct uploaded_tp *utp)
3087 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3089 struct breakpoint *t;
3090 struct bp_location *loc;
3092 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
3094 if (t->type == utp->type
3095 && t->step_count == utp->step
3096 && t->pass_count == utp->pass
3097 /* FIXME also test conditionals and actions. */
3100 /* Scan the locations for an address match. */
3101 for (loc = t->loc; loc; loc = loc->next)
3103 if (loc->address == utp->addr)
3111 /* Given a list of tracepoints uploaded from a target, attempt to
3112 match them up with existing tracepoints, and create new ones if not
3116 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3118 struct uploaded_tp *utp;
3119 struct breakpoint *t;
3121 /* Look for GDB tracepoints that match up with our uploaded versions. */
3122 for (utp = *uploaded_tps; utp; utp = utp->next)
3124 t = find_matching_tracepoint (utp);
3126 printf_filtered (_("Assuming tracepoint %d is same "
3127 "as target's tracepoint %d at %s.\n"),
3128 t->number, utp->number,
3129 paddress (get_current_arch (), utp->addr));
3132 t = create_tracepoint_from_upload (utp);
3134 printf_filtered (_("Created tracepoint %d for "
3135 "target's tracepoint %d at %s.\n"),
3136 t->number, utp->number,
3137 paddress (get_current_arch (), utp->addr));
3139 printf_filtered (_("Failed to create tracepoint for target's "
3140 "tracepoint %d at %s, skipping it.\n"),
3142 paddress (get_current_arch (), utp->addr));
3144 /* Whether found or created, record the number used by the
3145 target, to help with mapping target tracepoints back to their
3146 counterparts here. */
3148 t->number_on_target = utp->number;
3151 free_uploaded_tps (uploaded_tps);
3154 /* Trace state variables don't have much to identify them beyond their
3155 name, so just use that to detect matches. */
3157 struct trace_state_variable *
3158 find_matching_tsv (struct uploaded_tsv *utsv)
3163 return find_trace_state_variable (utsv->name);
3166 struct trace_state_variable *
3167 create_tsv_from_upload (struct uploaded_tsv *utsv)
3169 const char *namebase;
3172 struct trace_state_variable *tsv;
3176 namebase = utsv->name;
3177 sprintf (buf, "%s", namebase);
3182 sprintf (buf, "%s_%d", namebase, try_num++);
3185 /* Fish for a name that is not in use. */
3186 /* (should check against all internal vars?) */
3187 while (find_trace_state_variable (buf))
3188 sprintf (buf, "%s_%d", namebase, try_num++);
3190 /* We have an available name, create the variable. */
3191 tsv = create_trace_state_variable (buf);
3192 tsv->initial_value = utsv->initial_value;
3193 tsv->builtin = utsv->builtin;
3198 /* Given a list of uploaded trace state variables, try to match them
3199 up with existing variables, or create additional ones. */
3202 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3205 struct uploaded_tsv *utsv;
3206 struct trace_state_variable *tsv;
3209 /* Most likely some numbers will have to be reassigned as part of
3210 the merge, so clear them all in anticipation. */
3211 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3214 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3216 tsv = find_matching_tsv (utsv);
3220 printf_filtered (_("Assuming trace state variable $%s "
3221 "is same as target's variable %d.\n"),
3222 tsv->name, utsv->number);
3226 tsv = create_tsv_from_upload (utsv);
3228 printf_filtered (_("Created trace state variable "
3229 "$%s for target's variable %d.\n"),
3230 tsv->name, utsv->number);
3232 /* Give precedence to numberings that come from the target. */
3234 tsv->number = utsv->number;
3237 /* Renumber everything that didn't get a target-assigned number. */
3239 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3240 if (tsv->number > highest)
3241 highest = tsv->number;
3244 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3245 if (tsv->number == 0)
3246 tsv->number = highest++;
3248 free_uploaded_tsvs (uploaded_tsvs);
3251 /* target tfile command */
3253 struct target_ops tfile_ops;
3255 /* Fill in tfile_ops with its defined operations and properties. */
3257 #define TRACE_HEADER_SIZE 8
3259 char *trace_filename;
3261 off_t trace_frames_offset;
3263 int cur_traceframe_number;
3265 int trace_regblock_size;
3267 static void tfile_interp_line (char *line,
3268 struct uploaded_tp **utpp,
3269 struct uploaded_tsv **utsvp);
3271 /* Read SIZE bytes into READBUF from the trace frame, starting at
3272 TRACE_FD's current position. Note that this call `read'
3273 underneath, hence it advances the file's seek position. Throws an
3274 error if the `read' syscall fails, or less than SIZE bytes are
3278 tfile_read (gdb_byte *readbuf, int size)
3282 gotten = read (trace_fd, readbuf, size);
3284 perror_with_name (trace_filename);
3285 else if (gotten < size)
3286 error (_("Premature end of file while reading trace file"));
3290 tfile_open (char *filename, int from_tty)
3293 struct cleanup *old_chain;
3296 char header[TRACE_HEADER_SIZE];
3297 char linebuf[1000]; /* Should be max remote packet size or so. */
3300 struct trace_status *ts;
3301 struct uploaded_tp *uploaded_tps = NULL;
3302 struct uploaded_tsv *uploaded_tsvs = NULL;
3304 target_preopen (from_tty);
3306 error (_("No trace file specified."));
3308 filename = tilde_expand (filename);
3309 if (!IS_ABSOLUTE_PATH(filename))
3311 temp = concat (current_directory, "/", filename, (char *) NULL);
3316 old_chain = make_cleanup (xfree, filename);
3318 flags = O_BINARY | O_LARGEFILE;
3320 scratch_chan = open (filename, flags, 0);
3321 if (scratch_chan < 0)
3322 perror_with_name (filename);
3324 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3326 discard_cleanups (old_chain); /* Don't free filename any more. */
3327 unpush_target (&tfile_ops);
3329 push_target (&tfile_ops);
3331 trace_filename = xstrdup (filename);
3332 trace_fd = scratch_chan;
3335 /* Read the file header and test for validity. */
3336 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
3338 bytes += TRACE_HEADER_SIZE;
3339 if (!(header[0] == 0x7f
3340 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3341 error (_("File is not a valid trace file."));
3343 trace_regblock_size = 0;
3344 ts = current_trace_status ();
3345 /* We know we're working with a file. */
3347 /* Set defaults in case there is no status line. */
3348 ts->running_known = 0;
3349 ts->stop_reason = trace_stop_reason_unknown;
3350 ts->traceframe_count = -1;
3351 ts->buffer_free = 0;
3352 ts->disconnected_tracing = 0;
3353 ts->circular_buffer = 0;
3355 cur_traceframe_number = -1;
3357 /* Read through a section of newline-terminated lines that
3358 define things like tracepoints. */
3362 tfile_read (&byte, 1);
3367 /* Empty line marks end of the definition section. */
3372 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3375 linebuf[i++] = byte;
3377 error (_("Excessively long lines in trace file"));
3380 /* Add the file's tracepoints and variables into the current mix. */
3382 /* Get trace state variables first, they may be checked when parsing
3383 uploaded commands. */
3384 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3386 merge_uploaded_tracepoints (&uploaded_tps);
3388 /* Record the starting offset of the binary trace data. */
3389 trace_frames_offset = bytes;
3391 /* If we don't have a blocksize, we can't interpret the
3393 if (trace_regblock_size == 0)
3394 error (_("No register block size recorded in trace file"));
3395 if (ts->traceframe_count <= 0)
3397 warning (_("No traceframes present in this file."));
3401 #define TFILE_PID (1)
3402 inferior_appeared (current_inferior (), TFILE_PID);
3403 inferior_ptid = pid_to_ptid (TFILE_PID);
3404 add_thread_silent (inferior_ptid);
3406 post_create_inferior (&tfile_ops, from_tty);
3409 /* FIXME this will get defined in MI patch submission. */
3410 tfind_1 (tfind_number, 0, 0, 0, 0);
3414 /* Interpret the given line from the definitions part of the trace
3418 tfile_interp_line (char *line,
3419 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3423 if (strncmp (p, "R ", strlen ("R ")) == 0)
3426 trace_regblock_size = strtol (p, &p, 16);
3428 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3430 p += strlen ("status ");
3431 parse_trace_status (p, current_trace_status ());
3433 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3435 p += strlen ("tp ");
3436 parse_tracepoint_definition (p, utpp);
3438 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3440 p += strlen ("tsv ");
3441 parse_tsv_definition (p, utsvp);
3444 warning (_("Ignoring trace file definition \"%s\""), line);
3447 /* Parse the part of trace status syntax that is shared between
3448 the remote protocol and the trace file reader. */
3451 parse_trace_status (char *line, struct trace_status *ts)
3453 char *p = line, *p1, *p2, *p_temp;
3456 ts->running_known = 1;
3457 ts->running = (*p++ == '1');
3458 ts->stop_reason = trace_stop_reason_unknown;
3459 xfree (ts->error_desc);
3460 ts->error_desc = NULL;
3461 ts->traceframe_count = -1;
3462 ts->traceframes_created = -1;
3463 ts->buffer_free = -1;
3464 ts->buffer_size = -1;
3465 ts->disconnected_tracing = 0;
3466 ts->circular_buffer = 0;
3470 p1 = strchr (p, ':');
3472 error (_("Malformed trace status, at %s\n\
3473 Status line: '%s'\n"), p, line);
3474 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3476 p = unpack_varlen_hex (++p1, &val);
3477 ts->stop_reason = trace_buffer_full;
3479 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3481 p = unpack_varlen_hex (++p1, &val);
3482 ts->stop_reason = trace_never_run;
3484 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3487 p = unpack_varlen_hex (++p1, &val);
3488 ts->stop_reason = tracepoint_passcount;
3489 ts->stopping_tracepoint = val;
3491 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3493 p = unpack_varlen_hex (++p1, &val);
3494 ts->stop_reason = tstop_command;
3496 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3498 p = unpack_varlen_hex (++p1, &val);
3499 ts->stop_reason = trace_disconnected;
3501 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3503 p2 = strchr (++p1, ':');
3508 ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3509 end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
3510 ts->error_desc[end] = '\0';
3513 ts->error_desc = xstrdup ("");
3515 p = unpack_varlen_hex (++p2, &val);
3516 ts->stopping_tracepoint = val;
3517 ts->stop_reason = tracepoint_error;
3519 else if (strncmp (p, "tframes", p1 - p) == 0)
3521 p = unpack_varlen_hex (++p1, &val);
3522 ts->traceframe_count = val;
3524 else if (strncmp (p, "tcreated", p1 - p) == 0)
3526 p = unpack_varlen_hex (++p1, &val);
3527 ts->traceframes_created = val;
3529 else if (strncmp (p, "tfree", p1 - p) == 0)
3531 p = unpack_varlen_hex (++p1, &val);
3532 ts->buffer_free = val;
3534 else if (strncmp (p, "tsize", p1 - p) == 0)
3536 p = unpack_varlen_hex (++p1, &val);
3537 ts->buffer_size = val;
3539 else if (strncmp (p, "disconn", p1 - p) == 0)
3541 p = unpack_varlen_hex (++p1, &val);
3542 ts->disconnected_tracing = val;
3544 else if (strncmp (p, "circular", p1 - p) == 0)
3546 p = unpack_varlen_hex (++p1, &val);
3547 ts->circular_buffer = val;
3551 /* Silently skip unknown optional info. */
3552 p_temp = strchr (p1 + 1, ';');
3556 /* Must be at the end. */
3562 /* Given a line of text defining a part of a tracepoint, parse it into
3563 an "uploaded tracepoint". */
3566 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3570 ULONGEST num, addr, step, pass, orig_size, xlen, start;
3573 char *cond, *srctype, *buf;
3574 struct uploaded_tp *utp = NULL;
3577 /* Both tracepoint and action definitions start with the same number
3578 and address sequence. */
3580 p = unpack_varlen_hex (p, &num);
3581 p++; /* skip a colon */
3582 p = unpack_varlen_hex (p, &addr);
3583 p++; /* skip a colon */
3586 enabled = (*p++ == 'E');
3587 p++; /* skip a colon */
3588 p = unpack_varlen_hex (p, &step);
3589 p++; /* skip a colon */
3590 p = unpack_varlen_hex (p, &pass);
3591 type = bp_tracepoint;
3593 /* Thumb through optional fields. */
3596 p++; /* skip a colon */
3599 type = bp_fast_tracepoint;
3601 p = unpack_varlen_hex (p, &orig_size);
3605 type = bp_static_tracepoint;
3611 p = unpack_varlen_hex (p, &xlen);
3612 p++; /* skip a comma */
3613 cond = (char *) xmalloc (2 * xlen + 1);
3614 strncpy (cond, p, 2 * xlen);
3615 cond[2 * xlen] = '\0';
3619 warning (_("Unrecognized char '%c' in tracepoint "
3620 "definition, skipping rest"), *p);
3622 utp = get_uploaded_tp (num, addr, utpp);
3624 utp->enabled = enabled;
3629 else if (piece == 'A')
3631 utp = get_uploaded_tp (num, addr, utpp);
3632 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3634 else if (piece == 'S')
3636 utp = get_uploaded_tp (num, addr, utpp);
3637 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3639 else if (piece == 'Z')
3641 /* Parse a chunk of source form definition. */
3642 utp = get_uploaded_tp (num, addr, utpp);
3644 p = strchr (p, ':');
3645 p++; /* skip a colon */
3646 p = unpack_varlen_hex (p, &start);
3647 p++; /* skip a colon */
3648 p = unpack_varlen_hex (p, &xlen);
3649 p++; /* skip a colon */
3651 buf = alloca (strlen (line));
3653 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3656 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
3657 utp->at_string = xstrdup (buf);
3658 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
3659 utp->cond_string = xstrdup (buf);
3660 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
3661 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3665 /* Don't error out, the target might be sending us optional
3666 info that we don't care about. */
3667 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3671 /* Convert a textual description of a trace state variable into an
3675 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3678 ULONGEST num, initval, builtin;
3680 struct uploaded_tsv *utsv = NULL;
3682 buf = alloca (strlen (line));
3685 p = unpack_varlen_hex (p, &num);
3686 p++; /* skip a colon */
3687 p = unpack_varlen_hex (p, &initval);
3688 p++; /* skip a colon */
3689 p = unpack_varlen_hex (p, &builtin);
3690 p++; /* skip a colon */
3691 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3694 utsv = get_uploaded_tsv (num, utsvp);
3695 utsv->initial_value = initval;
3696 utsv->builtin = builtin;
3697 utsv->name = xstrdup (buf);
3700 /* Close the trace file and generally clean up. */
3703 tfile_close (int quitting)
3710 pid = ptid_get_pid (inferior_ptid);
3711 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
3712 exit_inferior_silent (pid);
3717 xfree (trace_filename);
3721 tfile_files_info (struct target_ops *t)
3723 /* (it would be useful to mention the name of the file). */
3724 printf_filtered ("Looking at a trace file.\n");
3727 /* The trace status for a file is that tracing can never be run. */
3730 tfile_get_trace_status (struct trace_status *ts)
3732 /* Other bits of trace status were collected as part of opening the
3733 trace files, so nothing to do here. */
3738 /* Given the position of a traceframe in the file, figure out what
3739 address the frame was collected at. This would normally be the
3740 value of a collected PC register, but if not available, we
3744 tfile_get_traceframe_address (off_t tframe_offset)
3748 struct breakpoint *tp;
3749 off_t saved_offset = cur_offset;
3751 /* FIXME dig pc out of collected registers. */
3753 /* Fall back to using tracepoint address. */
3754 lseek (trace_fd, tframe_offset, SEEK_SET);
3755 tfile_read ((gdb_byte *) &tpnum, 2);
3756 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3760 tp = get_tracepoint_by_number_on_target (tpnum);
3761 /* FIXME this is a poor heuristic if multiple locations. */
3763 addr = tp->loc->address;
3765 /* Restore our seek position. */
3766 cur_offset = saved_offset;
3767 lseek (trace_fd, cur_offset, SEEK_SET);
3771 /* Make tfile's selected traceframe match GDB's selected
3775 set_tfile_traceframe (void)
3779 if (cur_traceframe_number == get_traceframe_number ())
3782 /* Avoid recursion, tfile_trace_find calls us again. */
3783 cur_traceframe_number = get_traceframe_number ();
3785 newnum = target_trace_find (tfind_number,
3786 get_traceframe_number (), 0, 0, NULL);
3788 /* Should not happen. If it does, all bets are off. */
3789 if (newnum != get_traceframe_number ())
3790 warning (_("could not set tfile's traceframe"));
3793 /* Given a type of search and some parameters, scan the collection of
3794 traceframes in the file looking for a match. When found, return
3795 both the traceframe and tracepoint number, otherwise -1 for
3799 tfile_trace_find (enum trace_find_type type, int num,
3800 ULONGEST addr1, ULONGEST addr2, int *tpp)
3803 int tfnum = 0, found = 0;
3804 unsigned int data_size;
3805 struct breakpoint *tp;
3806 off_t offset, tframe_offset;
3809 /* Lookups other than by absolute frame number depend on the current
3810 trace selected, so make sure it is correct on the tfile end
3812 if (type != tfind_number)
3813 set_tfile_traceframe ();
3815 lseek (trace_fd, trace_frames_offset, SEEK_SET);
3816 offset = trace_frames_offset;
3819 tframe_offset = offset;
3820 tfile_read ((gdb_byte *) &tpnum, 2);
3821 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3827 tfile_read ((gdb_byte *) &data_size, 4);
3828 data_size = (unsigned int) extract_unsigned_integer
3829 ((gdb_byte *) &data_size, 4,
3830 gdbarch_byte_order (target_gdbarch));
3839 tfaddr = tfile_get_traceframe_address (tframe_offset);
3840 if (tfaddr == addr1)
3844 tp = get_tracepoint (num);
3845 if (tp && tpnum == tp->number_on_target)
3849 tfaddr = tfile_get_traceframe_address (tframe_offset);
3850 if (addr1 <= tfaddr && tfaddr <= addr2)
3854 tfaddr = tfile_get_traceframe_address (tframe_offset);
3855 if (!(addr1 <= tfaddr && tfaddr <= addr2))
3859 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
3865 cur_offset = offset;
3866 cur_data_size = data_size;
3867 cur_traceframe_number = tfnum;
3870 /* Skip past the traceframe's data. */
3871 lseek (trace_fd, data_size, SEEK_CUR);
3872 offset += data_size;
3873 /* Update our own count of traceframes. */
3876 /* Did not find what we were looking for. */
3882 /* Prototype of the callback passed to tframe_walk_blocks. */
3883 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
3885 /* Callback for traceframe_walk_blocks, used to find a given block
3886 type in a traceframe. */
3889 match_blocktype (char blocktype, void *data)
3891 char *wantedp = data;
3893 if (*wantedp == blocktype)
3899 /* Walk over all traceframe block starting at POS offset from
3900 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
3901 unmodified. If CALLBACK returns true, this returns the position in
3902 the traceframe where the block is found, relative to the start of
3903 the traceframe (cur_offset). Returns -1 if no callback call
3904 returned true, indicating that all blocks have been walked. */
3907 traceframe_walk_blocks (walk_blocks_callback_func callback,
3908 int pos, void *data)
3910 /* Iterate through a traceframe's blocks, looking for a block of the
3913 lseek (trace_fd, cur_offset + pos, SEEK_SET);
3914 while (pos < cur_data_size)
3916 unsigned short mlen;
3919 tfile_read (&block_type, 1);
3923 if ((*callback) (block_type, data))
3929 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
3930 pos += trace_regblock_size;
3933 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
3934 tfile_read ((gdb_byte *) &mlen, 2);
3935 mlen = (unsigned short)
3936 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
3939 lseek (trace_fd, mlen, SEEK_CUR);
3940 pos += (8 + 2 + mlen);
3943 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
3947 error (_("Unknown block type '%c' (0x%x) in trace frame"),
3948 block_type, block_type);
3956 /* Convenience wrapper around traceframe_walk_blocks. Looks for the
3957 position offset of a block of type TYPE_WANTED in the current trace
3958 frame, starting at POS. Returns -1 if no such block was found. */
3961 traceframe_find_block_type (char type_wanted, int pos)
3963 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
3966 /* Look for a block of saved registers in the traceframe, and get the
3967 requested register from it. */
3970 tfile_fetch_registers (struct target_ops *ops,
3971 struct regcache *regcache, int regno)
3973 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3975 int pos, offset, regn, regsize, pc_regno;
3976 unsigned short mlen;
3979 /* An uninitialized reg size says we're not going to be
3980 successful at getting register blocks. */
3981 if (!trace_regblock_size)
3984 set_tfile_traceframe ();
3986 regs = alloca (trace_regblock_size);
3988 if (traceframe_find_block_type ('R', 0) >= 0)
3990 tfile_read (regs, trace_regblock_size);
3992 /* Assume the block is laid out in GDB register number order,
3993 each register with the size that it has in GDB. */
3995 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
3997 regsize = register_size (gdbarch, regn);
3998 /* Make sure we stay within block bounds. */
3999 if (offset + regsize >= trace_regblock_size)
4001 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4005 regcache_raw_supply (regcache, regno, regs + offset);
4008 else if (regno == -1)
4010 regcache_raw_supply (regcache, regn, regs + offset);
4018 /* We get here if no register data has been found. Mark registers
4020 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4021 regcache_raw_supply (regcache, regn, NULL);
4023 /* We can often usefully guess that the PC is going to be the same
4024 as the address of the tracepoint. */
4025 pc_regno = gdbarch_pc_regnum (gdbarch);
4026 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4028 struct breakpoint *tp = get_tracepoint (tracepoint_number);
4032 /* But don't try to guess if tracepoint is multi-location... */
4035 warning (_("Tracepoint %d has multiple "
4036 "locations, cannot infer $pc"),
4040 /* ... or does while-stepping. */
4041 if (tp->step_count > 0)
4043 warning (_("Tracepoint %d does while-stepping, "
4044 "cannot infer $pc"),
4049 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4050 gdbarch_byte_order (gdbarch),
4052 regcache_raw_supply (regcache, pc_regno, regs);
4058 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4059 const char *annex, gdb_byte *readbuf,
4060 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4062 /* We're only doing regular memory for now. */
4063 if (object != TARGET_OBJECT_MEMORY)
4066 if (readbuf == NULL)
4067 error (_("tfile_xfer_partial: trace file is read-only"));
4069 set_tfile_traceframe ();
4071 if (traceframe_number != -1)
4075 /* Iterate through the traceframe's blocks, looking for
4077 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
4079 ULONGEST maddr, amt;
4080 unsigned short mlen;
4081 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
4083 tfile_read ((gdb_byte *) &maddr, 8);
4084 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4086 tfile_read ((gdb_byte *) &mlen, 2);
4087 mlen = (unsigned short)
4088 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4090 /* If the block includes the first part of the desired
4091 range, return as much it has; GDB will re-request the
4092 remainder, which might be in a different block of this
4094 if (maddr <= offset && offset < (maddr + mlen))
4096 amt = (maddr + mlen) - offset;
4100 tfile_read (readbuf, amt);
4104 /* Skip over this block. */
4105 pos += (8 + 2 + mlen);
4109 /* It's unduly pedantic to refuse to look at the executable for
4110 read-only pieces; so do the equivalent of readonly regions aka
4112 /* FIXME account for relocation at some point. */
4119 for (s = exec_bfd->sections; s; s = s->next)
4121 if ((s->flags & SEC_LOAD) == 0
4122 || (s->flags & SEC_READONLY) == 0)
4126 size = bfd_get_section_size (s);
4127 if (vma <= offset && offset < (vma + size))
4131 amt = (vma + size) - offset;
4135 amt = bfd_get_section_contents (exec_bfd, s,
4136 readbuf, offset - vma, amt);
4142 /* Indicate failure to find the requested memory block. */
4146 /* Iterate through the blocks of a trace frame, looking for a 'V'
4147 block with a matching tsv number. */
4150 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4154 set_tfile_traceframe ();
4157 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
4161 tfile_read ((gdb_byte *) &vnum, 4);
4162 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
4167 tfile_read ((gdb_byte *) val, 8);
4168 *val = extract_signed_integer ((gdb_byte *) val, 8,
4176 /* Didn't find anything. */
4181 tfile_has_all_memory (struct target_ops *ops)
4187 tfile_has_memory (struct target_ops *ops)
4193 tfile_has_stack (struct target_ops *ops)
4195 return traceframe_number != -1;
4199 tfile_has_registers (struct target_ops *ops)
4201 return traceframe_number != -1;
4204 /* Callback for traceframe_walk_blocks. Builds a traceframe_info
4205 object for the tfile target's current traceframe. */
4208 build_traceframe_info (char blocktype, void *data)
4210 struct traceframe_info *info = data;
4216 struct mem_range *r;
4218 unsigned short mlen;
4220 tfile_read ((gdb_byte *) &maddr, 8);
4221 tfile_read ((gdb_byte *) &mlen, 2);
4223 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4236 warning (_("Unhandled trace block type (%d) '%c ' "
4237 "while building trace frame info."),
4238 blocktype, blocktype);
4245 static struct traceframe_info *
4246 tfile_traceframe_info (void)
4248 struct traceframe_info *info = XCNEW (struct traceframe_info);
4250 traceframe_walk_blocks (build_traceframe_info, 0, info);
4255 init_tfile_ops (void)
4257 tfile_ops.to_shortname = "tfile";
4258 tfile_ops.to_longname = "Local trace dump file";
4260 = "Use a trace file as a target. Specify the filename of the trace file.";
4261 tfile_ops.to_open = tfile_open;
4262 tfile_ops.to_close = tfile_close;
4263 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4264 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4265 tfile_ops.to_files_info = tfile_files_info;
4266 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4267 tfile_ops.to_trace_find = tfile_trace_find;
4268 tfile_ops.to_get_trace_state_variable_value
4269 = tfile_get_trace_state_variable_value;
4270 tfile_ops.to_stratum = process_stratum;
4271 tfile_ops.to_has_all_memory = tfile_has_all_memory;
4272 tfile_ops.to_has_memory = tfile_has_memory;
4273 tfile_ops.to_has_stack = tfile_has_stack;
4274 tfile_ops.to_has_registers = tfile_has_registers;
4275 tfile_ops.to_traceframe_info = tfile_traceframe_info;
4276 tfile_ops.to_magic = OPS_MAGIC;
4279 /* Given a line of text defining a static tracepoint marker, parse it
4280 into a "static tracepoint marker" object. Throws an error is
4281 parsing fails. If PP is non-null, it points to one past the end of
4282 the parsed marker definition. */
4285 parse_static_tracepoint_marker_definition (char *line, char **pp,
4286 struct static_tracepoint_marker *marker)
4293 p = unpack_varlen_hex (p, &addr);
4294 p++; /* skip a colon */
4296 marker->gdbarch = target_gdbarch;
4297 marker->address = (CORE_ADDR) addr;
4299 endp = strchr (p, ':');
4301 error (_("bad marker definition: %s"), line);
4303 marker->str_id = xmalloc (endp - p + 1);
4304 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4305 marker->str_id[end] = '\0';
4308 p++; /* skip a colon */
4310 marker->extra = xmalloc (strlen (p) + 1);
4311 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4312 marker->extra[end] = '\0';
4318 /* Release a static tracepoint marker's contents. Note that the
4319 object itself isn't released here. There objects are usually on
4323 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4325 xfree (marker->str_id);
4326 marker->str_id = NULL;
4329 /* Print MARKER to gdb_stdout. */
4332 print_one_static_tracepoint_marker (int count,
4333 struct static_tracepoint_marker *marker)
4335 struct command_line *l;
4338 char wrap_indent[80];
4339 char extra_field_indent[80];
4340 struct ui_stream *stb = ui_out_stream_new (uiout);
4341 struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4342 struct cleanup *bkpt_chain;
4343 VEC(breakpoint_p) *tracepoints;
4345 struct symtab_and_line sal;
4349 sal.pc = marker->address;
4351 tracepoints = static_tracepoints_here (marker->address);
4353 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4355 /* A counter field to help readability. This is not a stable
4357 ui_out_field_int (uiout, "count", count);
4359 ui_out_field_string (uiout, "marker-id", marker->str_id);
4361 ui_out_field_fmt (uiout, "enabled", "%c",
4362 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4363 ui_out_spaces (uiout, 2);
4365 strcpy (wrap_indent, " ");
4367 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4368 strcat (wrap_indent, " ");
4370 strcat (wrap_indent, " ");
4372 strcpy (extra_field_indent, " ");
4374 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4376 sal = find_pc_line (marker->address, 0);
4377 sym = find_pc_sect_function (marker->address, NULL);
4380 ui_out_text (uiout, "in ");
4381 ui_out_field_string (uiout, "func",
4382 SYMBOL_PRINT_NAME (sym));
4383 ui_out_wrap_hint (uiout, wrap_indent);
4384 ui_out_text (uiout, " at ");
4387 ui_out_field_skip (uiout, "func");
4389 if (sal.symtab != NULL)
4391 ui_out_field_string (uiout, "file", sal.symtab->filename);
4392 ui_out_text (uiout, ":");
4394 if (ui_out_is_mi_like_p (uiout))
4396 char *fullname = symtab_to_fullname (sal.symtab);
4399 ui_out_field_string (uiout, "fullname", fullname);
4402 ui_out_field_skip (uiout, "fullname");
4404 ui_out_field_int (uiout, "line", sal.line);
4408 ui_out_field_skip (uiout, "fullname");
4409 ui_out_field_skip (uiout, "line");
4412 ui_out_text (uiout, "\n");
4413 ui_out_text (uiout, extra_field_indent);
4414 ui_out_text (uiout, _("Data: \""));
4415 ui_out_field_string (uiout, "extra-data", marker->extra);
4416 ui_out_text (uiout, "\"\n");
4418 if (!VEC_empty (breakpoint_p, tracepoints))
4420 struct cleanup *cleanup_chain;
4422 struct breakpoint *b;
4424 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4427 ui_out_text (uiout, extra_field_indent);
4428 ui_out_text (uiout, _("Probed by static tracepoints: "));
4429 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4432 ui_out_text (uiout, ", ");
4433 ui_out_text (uiout, "#");
4434 ui_out_field_int (uiout, "tracepoint-id", b->number);
4437 do_cleanups (cleanup_chain);
4439 if (ui_out_is_mi_like_p (uiout))
4440 ui_out_field_int (uiout, "number-of-tracepoints",
4441 VEC_length(breakpoint_p, tracepoints));
4443 ui_out_text (uiout, "\n");
4445 VEC_free (breakpoint_p, tracepoints);
4447 do_cleanups (bkpt_chain);
4448 do_cleanups (old_chain);
4452 info_static_tracepoint_markers_command (char *arg, int from_tty)
4454 VEC(static_tracepoint_marker_p) *markers;
4455 struct cleanup *old_chain;
4456 struct static_tracepoint_marker *marker;
4460 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4461 "StaticTracepointMarkersTable");
4463 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4465 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4467 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4468 if (gdbarch_addr_bit (target_gdbarch) <= 32)
4469 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4471 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4472 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4474 ui_out_table_body (uiout);
4476 markers = target_static_tracepoint_markers_by_strid (NULL);
4477 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4480 VEC_iterate (static_tracepoint_marker_p,
4481 markers, i, marker);
4484 print_one_static_tracepoint_marker (i + 1, marker);
4485 release_static_tracepoint_marker (marker);
4488 do_cleanups (old_chain);
4491 /* The $_sdata convenience variable is a bit special. We don't know
4492 for sure type of the value until we actually have a chance to fetch
4493 the data --- the size of the object depends on what has been
4494 collected. We solve this by making $_sdata be an internalvar that
4495 creates a new value on access. */
4497 /* Return a new value with the correct type for the sdata object of
4498 the current trace frame. Return a void value if there's no object
4501 static struct value *
4502 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4507 /* We need to read the whole object before we know its size. */
4508 size = target_read_alloc (¤t_target,
4509 TARGET_OBJECT_STATIC_TRACE_DATA,
4516 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4518 v = allocate_value (type);
4519 memcpy (value_contents_raw (v), buf, size);
4524 return allocate_value (builtin_type (gdbarch)->builtin_void);
4527 #if !defined(HAVE_LIBEXPAT)
4529 struct traceframe_info *
4530 parse_traceframe_info (const char *tframe_info)
4532 static int have_warned;
4537 warning (_("Can not parse XML trace frame info; XML support "
4538 "was disabled at compile time"));
4544 #else /* HAVE_LIBEXPAT */
4546 #include "xml-support.h"
4548 /* Handle the start of a <memory> element. */
4551 traceframe_info_start_memory (struct gdb_xml_parser *parser,
4552 const struct gdb_xml_element *element,
4553 void *user_data, VEC(gdb_xml_value_s) *attributes)
4555 struct traceframe_info *info = user_data;
4556 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4557 ULONGEST *start_p, *length_p;
4559 start_p = xml_find_attribute (attributes, "start")->value;
4560 length_p = xml_find_attribute (attributes, "length")->value;
4562 r->start = *start_p;
4563 r->length = *length_p;
4566 /* Discard the constructed trace frame info (if an error occurs). */
4569 free_result (void *p)
4571 struct traceframe_info *result = p;
4573 free_traceframe_info (result);
4576 /* The allowed elements and attributes for an XML memory map. */
4578 static const struct gdb_xml_attribute memory_attributes[] = {
4579 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4580 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4581 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4584 static const struct gdb_xml_element traceframe_info_children[] = {
4585 { "memory", memory_attributes, NULL,
4586 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4587 traceframe_info_start_memory, NULL },
4588 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4591 static const struct gdb_xml_element traceframe_info_elements[] = {
4592 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4594 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4597 /* Parse a traceframe-info XML document. */
4599 struct traceframe_info *
4600 parse_traceframe_info (const char *tframe_info)
4602 struct traceframe_info *result;
4603 struct cleanup *back_to;
4605 result = XCNEW (struct traceframe_info);
4606 back_to = make_cleanup (free_result, result);
4608 if (gdb_xml_parse_quick (_("trace frame info"),
4609 "traceframe-info.dtd", traceframe_info_elements,
4610 tframe_info, result) == 0)
4612 /* Parsed successfully, keep the result. */
4613 discard_cleanups (back_to);
4618 do_cleanups (back_to);
4622 #endif /* HAVE_LIBEXPAT */
4624 /* Returns the traceframe_info object for the current traceframe.
4625 This is where we avoid re-fetching the object from the target if we
4626 already have it cached. */
4628 struct traceframe_info *
4629 get_traceframe_info (void)
4631 if (traceframe_info == NULL)
4632 traceframe_info = target_traceframe_info ();
4634 return traceframe_info;
4637 /* If the target supports the query, return in RESULT the set of
4638 collected memory in the current traceframe, found within the LEN
4639 bytes range starting at MEMADDR. Returns true if the target
4640 supports the query, otherwise returns false, and RESULT is left
4644 traceframe_available_memory (VEC(mem_range_s) **result,
4645 CORE_ADDR memaddr, ULONGEST len)
4647 struct traceframe_info *info = get_traceframe_info ();
4651 struct mem_range *r;
4656 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4657 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4659 ULONGEST lo1, hi1, lo2, hi2;
4660 struct mem_range *nr;
4663 hi1 = memaddr + len;
4666 hi2 = r->start + r->length;
4668 nr = VEC_safe_push (mem_range_s, *result, NULL);
4670 nr->start = max (lo1, lo2);
4671 nr->length = min (hi1, hi2) - nr->start;
4674 normalize_mem_ranges (*result);
4681 /* module initialization */
4683 _initialize_tracepoint (void)
4685 struct cmd_list_element *c;
4687 /* Explicitly create without lookup, since that tries to create a
4688 value with a void typed value, and when we get here, gdbarch
4689 isn't initialized yet. At this point, we're quite sure there
4690 isn't another convenience variable of the same name. */
4691 create_internalvar_type_lazy ("_sdata", sdata_make_value);
4693 traceframe_number = -1;
4694 tracepoint_number = -1;
4696 if (tracepoint_list.list == NULL)
4698 tracepoint_list.listsize = 128;
4699 tracepoint_list.list = xmalloc
4700 (tracepoint_list.listsize * sizeof (struct memrange));
4702 if (tracepoint_list.aexpr_list == NULL)
4704 tracepoint_list.aexpr_listsize = 128;
4705 tracepoint_list.aexpr_list = xmalloc
4706 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
4709 if (stepping_list.list == NULL)
4711 stepping_list.listsize = 128;
4712 stepping_list.list = xmalloc
4713 (stepping_list.listsize * sizeof (struct memrange));
4716 if (stepping_list.aexpr_list == NULL)
4718 stepping_list.aexpr_listsize = 128;
4719 stepping_list.aexpr_list = xmalloc
4720 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
4723 add_info ("scope", scope_info,
4724 _("List the variables local to a scope"));
4726 add_cmd ("tracepoints", class_trace, NULL,
4727 _("Tracing of program execution without stopping the program."),
4730 add_com ("tdump", class_trace, trace_dump_command,
4731 _("Print everything collected at the current tracepoint."));
4733 add_com ("tsave", class_trace, trace_save_command, _("\
4734 Save the trace data to a file.\n\
4735 Use the '-r' option to direct the target to save directly to the file,\n\
4736 using its own filesystem."));
4738 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4739 Define a trace state variable.\n\
4740 Argument is a $-prefixed name, optionally followed\n\
4741 by '=' and an expression that sets the initial value\n\
4742 at the start of tracing."));
4743 set_cmd_completer (c, expression_completer);
4745 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4746 Delete one or more trace state variables.\n\
4747 Arguments are the names of the variables to delete.\n\
4748 If no arguments are supplied, delete all variables."), &deletelist);
4749 /* FIXME add a trace variable completer. */
4751 add_info ("tvariables", tvariables_info, _("\
4752 Status of trace state variables and their values.\n\
4755 add_info ("static-tracepoint-markers",
4756 info_static_tracepoint_markers_command, _("\
4757 List target static tracepoints markers.\n\
4760 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
4761 Select a trace frame;\n\
4762 No argument means forward by one frame; '-' means backward by one frame."),
4763 &tfindlist, "tfind ", 1, &cmdlist);
4765 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
4766 Select a trace frame whose PC is outside the given range (exclusive).\n\
4767 Usage: tfind outside addr1, addr2"),
4770 add_cmd ("range", class_trace, trace_find_range_command, _("\
4771 Select a trace frame whose PC is in the given range (inclusive).\n\
4772 Usage: tfind range addr1,addr2"),
4775 add_cmd ("line", class_trace, trace_find_line_command, _("\
4776 Select a trace frame by source line.\n\
4777 Argument can be a line number (with optional source file),\n\
4778 a function name, or '*' followed by an address.\n\
4779 Default argument is 'the next source line that was traced'."),
4782 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
4783 Select a trace frame by tracepoint number.\n\
4784 Default is the tracepoint for the current trace frame."),
4787 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
4788 Select a trace frame by PC.\n\
4789 Default is the current PC, or the PC of the current trace frame."),
4792 add_cmd ("end", class_trace, trace_find_end_command, _("\
4793 Synonym for 'none'.\n\
4794 De-select any trace frame and resume 'live' debugging."),
4797 add_cmd ("none", class_trace, trace_find_none_command,
4798 _("De-select any trace frame and resume 'live' debugging."),
4801 add_cmd ("start", class_trace, trace_find_start_command,
4802 _("Select the first trace frame in the trace buffer."),
4805 add_com ("tstatus", class_trace, trace_status_command,
4806 _("Display the status of the current trace data collection."));
4808 add_com ("tstop", class_trace, trace_stop_command,
4809 _("Stop trace data collection."));
4811 add_com ("tstart", class_trace, trace_start_command,
4812 _("Start trace data collection."));
4814 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4815 Ends a list of commands or actions.\n\
4816 Several GDB commands allow you to enter a list of commands or actions.\n\
4817 Entering \"end\" on a line by itself is the normal way to terminate\n\
4819 Note: the \"end\" command cannot be used at the gdb prompt."));
4821 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4822 Specify single-stepping behavior at a tracepoint.\n\
4823 Argument is number of instructions to trace in single-step mode\n\
4824 following the tracepoint. This command is normally followed by\n\
4825 one or more \"collect\" commands, to specify what to collect\n\
4826 while single-stepping.\n\n\
4827 Note: this command can only be used in a tracepoint \"actions\" list."));
4829 add_com_alias ("ws", "while-stepping", class_alias, 0);
4830 add_com_alias ("stepping", "while-stepping", class_alias, 0);
4832 add_com ("collect", class_trace, collect_pseudocommand, _("\
4833 Specify one or more data items to be collected at a tracepoint.\n\
4834 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4835 collect all data (variables, registers) referenced by that expression.\n\
4836 Also accepts the following special arguments:\n\
4837 $regs -- all registers.\n\
4838 $args -- all function arguments.\n\
4839 $locals -- all variables local to the block/function scope.\n\
4840 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4841 Note: this command can only be used in a tracepoint \"actions\" list."));
4843 add_com ("teval", class_trace, teval_pseudocommand, _("\
4844 Specify one or more expressions to be evaluated at a tracepoint.\n\
4845 Accepts a comma-separated list of (one or more) expressions.\n\
4846 The result of each evaluation will be discarded.\n\
4847 Note: this command can only be used in a tracepoint \"actions\" list."));
4849 add_com ("actions", class_trace, trace_actions_command, _("\
4850 Specify the actions to be taken at a tracepoint.\n\
4851 Tracepoint actions may include collecting of specified data,\n\
4852 single-stepping, or enabling/disabling other tracepoints,\n\
4853 depending on target's capabilities."));
4855 default_collect = xstrdup ("");
4856 add_setshow_string_cmd ("default-collect", class_trace,
4857 &default_collect, _("\
4858 Set the list of expressions to collect by default"), _("\
4859 Show the list of expressions to collect by default"), NULL,
4861 &setlist, &showlist);
4863 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4864 &disconnected_tracing, _("\
4865 Set whether tracing continues after GDB disconnects."), _("\
4866 Show whether tracing continues after GDB disconnects."), _("\
4867 Use this to continue a tracing run even if GDB disconnects\n\
4868 or detaches from the target. You can reconnect later and look at\n\
4869 trace data collected in the meantime."),
4870 set_disconnected_tracing,
4875 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4876 &circular_trace_buffer, _("\
4877 Set target's use of circular trace buffer."), _("\
4878 Show target's use of circular trace buffer."), _("\
4879 Use this to make the trace buffer into a circular buffer,\n\
4880 which will discard traceframes (oldest first) instead of filling\n\
4881 up and stopping the trace run."),
4882 set_circular_trace_buffer,
4889 add_target (&tfile_ops);