1 /* Tracing functionality for remote targets in custom GDB protocol
3 Copyright (C) 1997-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "arch-utils.h"
21 #include "event-top.h"
25 #include "expression.h"
26 #include "cli/cli-cmds.h"
29 #include "target-dcache.h"
32 #include "breakpoint.h"
33 #include "tracepoint.h"
36 #include "completer.h"
38 #include "dictionary.h"
39 #include "observable.h"
40 #include "user-regs.h"
44 #include "filenames.h"
45 #include "gdbthread.h"
52 #include "cli/cli-utils.h"
54 #include "gdbsupport/filestuff.h"
55 #include "gdbsupport/rsp-low.h"
56 #include "tracefile.h"
59 #include "cli/cli-style.h"
61 #include "gdbsupport/buildargv.h"
66 /* Maximum length of an agent aexpression.
67 This accounts for the fact that packets are limited to 400 bytes
68 (which includes everything -- including the checksum), and assumes
69 the worst case of maximum length for each of the pieces of a
72 NOTE: expressions get bin2hex'ed otherwise this would be twice as
73 large. (400 - 31)/2 == 184 */
74 #define MAX_AGENT_EXPR_LEN 184
79 This module defines the following debugger commands:
80 trace : set a tracepoint on a function, line, or address.
81 info trace : list all debugger-defined tracepoints.
82 delete trace : delete one or more tracepoints.
83 enable trace : enable one or more tracepoints.
84 disable trace : disable one or more tracepoints.
85 actions : specify actions to be taken at a tracepoint.
86 passcount : specify a pass count for a tracepoint.
87 tstart : start a trace experiment.
88 tstop : stop a trace experiment.
89 tstatus : query the status of a trace experiment.
90 tfind : find a trace frame in the trace buffer.
91 tdump : print everything collected at the current tracepoint.
92 save-tracepoints : write tracepoint setup into a file.
94 This module defines the following user-visible debugger variables:
95 $trace_frame : sequence number of trace frame currently being debugged.
96 $trace_line : source line of trace frame currently being debugged.
97 $trace_file : source file of trace frame currently being debugged.
98 $tracepoint : tracepoint number of trace frame currently being debugged.
102 /* ======= Important global variables: ======= */
104 /* The list of all trace state variables. We don't retain pointers to
105 any of these for any reason - API is by name or number only - so it
106 works to have a vector of objects. */
108 static std::vector
<trace_state_variable
> tvariables
;
110 /* The next integer to assign to a variable. */
112 static int next_tsv_number
= 1;
114 /* Number of last traceframe collected. */
115 static int traceframe_number
;
117 /* Tracepoint for last traceframe collected. */
118 static int tracepoint_number
;
120 /* The traceframe info of the current traceframe. NULL if we haven't
121 yet attempted to fetch it, or if the target does not support
122 fetching this object, or if we're not inspecting a traceframe
124 static traceframe_info_up current_traceframe_info
;
126 /* Tracing command lists. */
127 static struct cmd_list_element
*tfindlist
;
129 /* List of expressions to collect by default at each tracepoint hit. */
130 std::string default_collect
;
132 static bool disconnected_tracing
;
134 /* This variable controls whether we ask the target for a linear or
135 circular trace buffer. */
137 static bool circular_trace_buffer
;
139 /* This variable is the requested trace buffer size, or -1 to indicate
140 that we don't care and leave it up to the target to set a size. */
142 static int trace_buffer_size
= -1;
144 /* Textual notes applying to the current and/or future trace runs. */
146 static std::string trace_user
;
148 /* Textual notes applying to the current and/or future trace runs. */
150 static std::string trace_notes
;
152 /* Textual notes applying to the stopping of a trace. */
154 static std::string trace_stop_notes
;
156 /* support routines */
158 struct collection_list
;
160 static counted_command_line
all_tracepoint_actions (tracepoint
*);
162 static struct trace_status trace_status
;
164 const char *stop_reason_names
[] = {
174 struct trace_status
*
175 current_trace_status (void)
177 return &trace_status
;
180 /* Free and clear the traceframe info cache of the current
184 clear_traceframe_info (void)
186 current_traceframe_info
= NULL
;
189 /* Set traceframe number to NUM. */
191 set_traceframe_num (int num
)
193 traceframe_number
= num
;
194 set_internalvar_integer (lookup_internalvar ("trace_frame"), num
);
197 /* Set tracepoint number to NUM. */
199 set_tracepoint_num (int num
)
201 tracepoint_number
= num
;
202 set_internalvar_integer (lookup_internalvar ("tracepoint"), num
);
205 /* Set externally visible debug variables for querying/printing
206 the traceframe context (line, function, file). */
209 set_traceframe_context (const frame_info_ptr
&trace_frame
)
212 struct symbol
*traceframe_fun
;
213 symtab_and_line traceframe_sal
;
215 /* Save as globals for internal use. */
216 if (trace_frame
!= NULL
217 && get_frame_pc_if_available (trace_frame
, &trace_pc
))
219 traceframe_sal
= find_pc_line (trace_pc
, 0);
220 traceframe_fun
= find_pc_function (trace_pc
);
222 /* Save linenumber as "$trace_line", a debugger variable visible to
224 set_internalvar_integer (lookup_internalvar ("trace_line"),
225 traceframe_sal
.line
);
229 traceframe_fun
= NULL
;
230 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
233 /* Save func name as "$trace_func", a debugger variable visible to
235 if (traceframe_fun
== NULL
236 || traceframe_fun
->linkage_name () == NULL
)
237 clear_internalvar (lookup_internalvar ("trace_func"));
239 set_internalvar_string (lookup_internalvar ("trace_func"),
240 traceframe_fun
->linkage_name ());
242 /* Save file name as "$trace_file", a debugger variable visible to
244 if (traceframe_sal
.symtab
== NULL
)
245 clear_internalvar (lookup_internalvar ("trace_file"));
247 set_internalvar_string (lookup_internalvar ("trace_file"),
248 symtab_to_filename_for_display (traceframe_sal
.symtab
));
251 /* Create a new trace state variable with the given name. */
253 struct trace_state_variable
*
254 create_trace_state_variable (const char *name
)
256 return &tvariables
.emplace_back (name
, next_tsv_number
++);
259 /* Look for a trace state variable of the given name. */
261 struct trace_state_variable
*
262 find_trace_state_variable (const char *name
)
264 for (trace_state_variable
&tsv
: tvariables
)
265 if (tsv
.name
== name
)
271 /* Look for a trace state variable of the given number. Return NULL if
274 struct trace_state_variable
*
275 find_trace_state_variable_by_number (int number
)
277 for (trace_state_variable
&tsv
: tvariables
)
278 if (tsv
.number
== number
)
285 delete_trace_state_variable (const char *name
)
287 for (auto it
= tvariables
.begin (); it
!= tvariables
.end (); it
++)
288 if (it
->name
== name
)
290 interps_notify_tsv_deleted (&*it
);
291 tvariables
.erase (it
);
295 warning (_("No trace variable named \"$%s\", not deleting"), name
);
298 /* Throws an error if NAME is not valid syntax for a trace state
302 validate_trace_state_variable_name (const char *name
)
307 error (_("Must supply a non-empty variable name"));
309 /* All digits in the name is reserved for value history
311 for (p
= name
; isdigit (*p
); p
++)
314 error (_("$%s is not a valid trace state variable name"), name
);
316 for (p
= name
; isalnum (*p
) || *p
== '_'; p
++)
319 error (_("$%s is not a valid trace state variable name"), name
);
322 /* The 'tvariable' command collects a name and optional expression to
323 evaluate into an initial value. */
326 trace_variable_command (const char *args
, int from_tty
)
329 struct trace_state_variable
*tsv
;
330 const char *name_start
, *p
;
333 error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
335 /* Only allow two syntaxes; "$name" and "$name=value". */
336 p
= skip_spaces (args
);
339 error (_("Name of trace variable should start with '$'"));
342 while (isalnum (*p
) || *p
== '_')
344 std::string
name (name_start
, p
- name_start
);
347 if (*p
!= '=' && *p
!= '\0')
348 error (_("Syntax must be $NAME [ = EXPR ]"));
350 validate_trace_state_variable_name (name
.c_str ());
353 initval
= value_as_long (parse_and_eval (++p
));
355 /* If the variable already exists, just change its initial value. */
356 tsv
= find_trace_state_variable (name
.c_str ());
359 if (tsv
->initial_value
!= initval
)
361 tsv
->initial_value
= initval
;
362 interps_notify_tsv_modified (tsv
);
364 gdb_printf (_("Trace state variable $%s "
365 "now has initial value %s.\n"),
366 tsv
->name
.c_str (), plongest (tsv
->initial_value
));
370 /* Create a new variable. */
371 tsv
= create_trace_state_variable (name
.c_str ());
372 tsv
->initial_value
= initval
;
374 interps_notify_tsv_created (tsv
);
376 gdb_printf (_("Trace state variable $%s "
377 "created, with initial value %s.\n"),
378 tsv
->name
.c_str (), plongest (tsv
->initial_value
));
382 delete_trace_variable_command (const char *args
, int from_tty
)
386 if (query (_("Delete all trace state variables? ")))
389 interps_notify_tsv_deleted (nullptr);
393 gdb_argv
argv (args
);
395 for (char *arg
: argv
)
398 delete_trace_state_variable (arg
+ 1);
400 warning (_("Name \"%s\" not prefixed with '$', ignoring"), arg
);
407 tvariables_info_1 (void)
409 struct ui_out
*uiout
= current_uiout
;
411 /* Try to acquire values from the target. */
412 for (trace_state_variable
&tsv
: tvariables
)
414 = target_get_trace_state_variable_value (tsv
.number
, &tsv
.value
);
417 ui_out_emit_table
table_emitter (uiout
, 3, tvariables
.size (),
419 uiout
->table_header (15, ui_left
, "name", "Name");
420 uiout
->table_header (11, ui_left
, "initial", "Initial");
421 uiout
->table_header (11, ui_left
, "current", "Current");
423 uiout
->table_body ();
425 for (const trace_state_variable
&tsv
: tvariables
)
429 ui_out_emit_tuple
tuple_emitter (uiout
, "variable");
431 uiout
->field_string ("name", std::string ("$") + tsv
.name
);
432 uiout
->field_string ("initial", plongest (tsv
.initial_value
));
436 c
= plongest (tsv
.value
);
437 else if (uiout
->is_mi_like_p ())
438 /* For MI, we prefer not to use magic string constants, but rather
439 omit the field completely. The difference between unknown and
440 undefined does not seem important enough to represent. */
442 else if (current_trace_status ()->running
|| traceframe_number
>= 0)
444 /* The value is/was defined, but we don't have it. */
446 style
= metadata_style
.style ();
450 /* It is not meaningful to ask about the value. */
452 style
= metadata_style
.style ();
455 uiout
->field_string ("current", c
, style
);
460 if (tvariables
.empty ())
461 uiout
->text (_("No trace state variables.\n"));
464 /* List all the trace state variables. */
467 info_tvariables_command (const char *args
, int from_tty
)
469 tvariables_info_1 ();
472 /* Stash definitions of tsvs into the given file. */
475 save_trace_state_variables (struct ui_file
*fp
)
477 for (const trace_state_variable
&tsv
: tvariables
)
479 gdb_printf (fp
, "tvariable $%s", tsv
.name
.c_str ());
480 if (tsv
.initial_value
)
481 gdb_printf (fp
, " = %s", plongest (tsv
.initial_value
));
482 gdb_printf (fp
, "\n");
486 /* ACTIONS functions: */
488 /* The three functions:
489 collect_pseudocommand,
490 while_stepping_pseudocommand, and
491 end_actions_pseudocommand
492 are placeholders for "commands" that are actually ONLY to be used
493 within a tracepoint action list. If the actual function is ever called,
494 it means that somebody issued the "command" at the top level,
495 which is always an error. */
498 end_actions_pseudocommand (const char *args
, int from_tty
)
500 error (_("This command cannot be used at the top level."));
504 while_stepping_pseudocommand (const char *args
, int from_tty
)
506 error (_("This command can only be used in a tracepoint actions list."));
510 collect_pseudocommand (const char *args
, int from_tty
)
512 error (_("This command can only be used in a tracepoint actions list."));
516 teval_pseudocommand (const char *args
, int from_tty
)
518 error (_("This command can only be used in a tracepoint actions list."));
521 /* Parse any collection options, such as /s for strings. */
524 decode_agent_options (const char *exp
, int *trace_string
)
526 struct value_print_options opts
;
533 /* Call this to borrow the print elements default for collection
535 get_user_print_options (&opts
);
540 if (target_supports_string_tracing ())
542 /* Allow an optional decimal number giving an explicit maximum
543 string length, defaulting it to the "print characters" value;
544 so "collect/s80 mystr" gets at most 80 bytes of string. */
545 *trace_string
= get_print_max_chars (&opts
);
547 if (*exp
>= '0' && *exp
<= '9')
548 *trace_string
= atoi (exp
);
549 while (*exp
>= '0' && *exp
<= '9')
553 error (_("Target does not support \"/s\" option for string tracing."));
556 error (_("Undefined collection format \"%c\"."), *exp
);
558 exp
= skip_spaces (exp
);
563 /* Enter a list of actions for a tracepoint. */
565 actions_command (const char *args
, int from_tty
)
567 struct tracepoint
*t
;
569 t
= get_tracepoint_by_number (&args
, NULL
);
573 string_printf ("Enter actions for tracepoint %d, one per line.",
576 counted_command_line l
= read_command_lines (tmpbuf
.c_str (),
578 [=] (const char *line
)
580 validate_actionline (line
, t
);
582 breakpoint_set_commands (t
, std::move (l
));
584 /* else just return */
587 /* Report the results of checking the agent expression, as errors or
591 report_agent_reqs_errors (struct agent_expr
*aexpr
)
593 /* All of the "flaws" are serious bytecode generation issues that
594 should never occur. */
595 if (aexpr
->flaw
!= agent_flaw_none
)
596 internal_error (_("expression is malformed"));
598 /* If analysis shows a stack underflow, GDB must have done something
599 badly wrong in its bytecode generation. */
600 if (aexpr
->min_height
< 0)
601 internal_error (_("expression has min height < 0"));
603 /* Issue this error if the stack is predicted to get too deep. The
604 limit is rather arbitrary; a better scheme might be for the
605 target to report how much stack it will have available. The
606 depth roughly corresponds to parenthesization, so a limit of 20
607 amounts to 20 levels of expression nesting, which is actually
608 a pretty big hairy expression. */
609 if (aexpr
->max_height
> 20)
610 error (_("Expression is too complicated."));
613 /* Call ax_reqs on AEXPR and raise an error if something is wrong. */
616 finalize_tracepoint_aexpr (struct agent_expr
*aexpr
)
620 if (aexpr
->buf
.size () > MAX_AGENT_EXPR_LEN
)
621 error (_("Expression is too complicated."));
623 report_agent_reqs_errors (aexpr
);
626 /* worker function */
628 validate_actionline (const char *line
, tracepoint
*t
)
630 struct cmd_list_element
*c
;
634 /* If EOF is typed, *line is NULL. */
638 p
= skip_spaces (line
);
640 /* Symbol lookup etc. */
641 if (*p
== '\0') /* empty line: just prompt for another line. */
644 if (*p
== '#') /* comment line */
647 c
= lookup_cmd (&p
, cmdlist
, "", NULL
, -1, 1);
649 error (_("`%s' is not a tracepoint action, or is ambiguous."), p
);
651 if (cmd_simple_func_eq (c
, collect_pseudocommand
))
653 int trace_string
= 0;
656 p
= decode_agent_options (p
, &trace_string
);
659 { /* Repeat over a comma-separated list. */
660 QUIT
; /* Allow user to bail out with ^C. */
663 if (*p
== '$') /* Look for special pseudo-symbols. */
665 if (0 == strncasecmp ("reg", p
+ 1, 3)
666 || 0 == strncasecmp ("arg", p
+ 1, 3)
667 || 0 == strncasecmp ("loc", p
+ 1, 3)
668 || 0 == strncasecmp ("_ret", p
+ 1, 4)
669 || 0 == strncasecmp ("_sdata", p
+ 1, 6))
674 /* else fall thru, treat p as an expression and parse it! */
677 for (bp_location
&loc
: t
->locations ())
680 expression_up exp
= parse_exp_1 (&p
, loc
.address
,
681 block_for_pc (loc
.address
),
682 PARSER_COMMA_TERMINATES
);
684 if (exp
->first_opcode () == OP_VAR_VALUE
)
687 expr::var_value_operation
*vvop
688 = (gdb::checked_static_cast
<expr::var_value_operation
*>
690 sym
= vvop
->get_symbol ();
692 if (sym
->aclass () == LOC_CONST
)
694 error (_("constant `%s' (value %s) "
695 "will not be collected."),
697 plongest (sym
->value_longest ()));
699 else if (sym
->aclass () == LOC_OPTIMIZED_OUT
)
701 error (_("`%s' is optimized away "
702 "and cannot be collected."),
707 /* We have something to collect, make sure that the expr to
708 bytecode translator can handle it and that it's not too
710 agent_expr_up aexpr
= gen_trace_for_expr (loc
.address
,
714 finalize_tracepoint_aexpr (aexpr
.get ());
717 while (p
&& *p
++ == ',');
720 else if (cmd_simple_func_eq (c
, teval_pseudocommand
))
723 { /* Repeat over a comma-separated list. */
724 QUIT
; /* Allow user to bail out with ^C. */
728 for (bp_location
&loc
: t
->locations ())
732 /* Only expressions are allowed for this action. */
733 expression_up exp
= parse_exp_1 (&p
, loc
.address
,
734 block_for_pc (loc
.address
),
735 PARSER_COMMA_TERMINATES
);
737 /* We have something to evaluate, make sure that the expr to
738 bytecode translator can handle it and that it's not too
740 agent_expr_up aexpr
= gen_eval_for_expr (loc
.address
, exp
.get ());
742 finalize_tracepoint_aexpr (aexpr
.get ());
745 while (p
&& *p
++ == ',');
748 else if (cmd_simple_func_eq (c
, while_stepping_pseudocommand
))
753 t
->step_count
= strtol (p
, &endp
, 0);
754 if (endp
== p
|| t
->step_count
== 0)
755 error (_("while-stepping step count `%s' is malformed."), line
);
759 else if (cmd_simple_func_eq (c
, end_actions_pseudocommand
))
763 error (_("`%s' is not a supported tracepoint action."), line
);
767 memrange_absolute
= -1
770 /* MEMRANGE functions: */
772 /* Compare memranges for std::sort. */
775 memrange_comp (const memrange
&a
, const memrange
&b
)
777 if (a
.type
== b
.type
)
779 if (a
.type
== memrange_absolute
)
780 return (bfd_vma
) a
.start
< (bfd_vma
) b
.start
;
782 return a
.start
< b
.start
;
785 return a
.type
< b
.type
;
788 /* Sort the memrange list using std::sort, and merge adjacent memranges. */
791 memrange_sortmerge (std::vector
<memrange
> &memranges
)
793 if (!memranges
.empty ())
797 std::sort (memranges
.begin (), memranges
.end (), memrange_comp
);
799 for (a
= 0, b
= 1; b
< memranges
.size (); b
++)
801 /* If memrange b overlaps or is adjacent to memrange a,
803 if (memranges
[a
].type
== memranges
[b
].type
804 && memranges
[b
].start
<= memranges
[a
].end
)
806 if (memranges
[b
].end
> memranges
[a
].end
)
807 memranges
[a
].end
= memranges
[b
].end
;
808 continue; /* next b, same a */
812 memranges
[a
] = memranges
[b
];
814 memranges
.resize (a
+ 1);
818 /* Add remote register number REGNO to the collection list mask. */
821 collection_list::add_remote_register (unsigned int regno
)
824 gdb_printf ("collect register %d\n", regno
);
826 m_regs_mask
.at (regno
/ 8) |= 1 << (regno
% 8);
829 /* Add all the registers from the mask in AEXPR to the mask in the
830 collection list. Registers in the AEXPR mask are already remote
834 collection_list::add_ax_registers (struct agent_expr
*aexpr
)
836 for (int ndx1
= 0; ndx1
< aexpr
->reg_mask
.size (); ndx1
++)
838 QUIT
; /* Allow user to bail out with ^C. */
839 if (aexpr
->reg_mask
[ndx1
])
841 /* It's used -- record it. */
842 add_remote_register (ndx1
);
847 /* If REGNO is raw, add its corresponding remote register number to
848 the mask. If REGNO is a pseudo-register, figure out the necessary
849 registers using a temporary agent expression, and add it to the
850 list if it needs more than just a mask. */
853 collection_list::add_local_register (struct gdbarch
*gdbarch
,
857 if (regno
< gdbarch_num_regs (gdbarch
))
859 int remote_regno
= gdbarch_remote_register_number (gdbarch
, regno
);
861 if (remote_regno
< 0)
862 error (_("Can't collect register %d"), regno
);
864 add_remote_register (remote_regno
);
868 agent_expr_up
aexpr (new agent_expr (gdbarch
, scope
));
870 ax_reg_mask (aexpr
.get (), regno
);
872 finalize_tracepoint_aexpr (aexpr
.get ());
874 add_ax_registers (aexpr
.get ());
876 /* Usually ax_reg_mask for a pseudo-regiser only sets the
877 corresponding raw registers in the ax mask, but if this isn't
878 the case add the expression that is generated to the
880 if (aexpr
->buf
.size () > 0)
881 add_aexpr (std::move (aexpr
));
885 /* Add a memrange to a collection list. */
888 collection_list::add_memrange (struct gdbarch
*gdbarch
,
889 int type
, bfd_signed_vma base
,
890 unsigned long len
, CORE_ADDR scope
)
893 gdb_printf ("(%d,%s,%ld)\n", type
, paddress (gdbarch
, base
), len
);
895 /* type: memrange_absolute == memory, other n == basereg */
896 /* base: addr if memory, offset if reg relative. */
897 /* len: we actually save end (base + len) for convenience */
898 m_memranges
.emplace_back (type
, base
, base
+ len
);
900 if (type
!= memrange_absolute
) /* Better collect the base register! */
901 add_local_register (gdbarch
, type
, scope
);
904 /* Add a symbol to a collection list. */
907 collection_list::collect_symbol (struct symbol
*sym
,
908 struct gdbarch
*gdbarch
,
909 long frame_regno
, long frame_offset
,
915 bfd_signed_vma offset
;
916 int treat_as_expr
= 0;
918 len
= check_typedef (sym
->type ())->length ();
919 switch (sym
->aclass ())
922 gdb_printf ("%s: don't know symbol class %d\n",
923 sym
->print_name (), sym
->aclass ());
926 gdb_printf ("constant %s (value %s) will not be collected.\n",
927 sym
->print_name (), plongest (sym
->value_longest ()));
930 offset
= sym
->value_address ();
933 gdb_printf ("LOC_STATIC %s: collect %ld bytes at %s.\n",
934 sym
->print_name (), len
,
935 paddress (gdbarch
, offset
));
937 /* A struct may be a C++ class with static fields, go to general
938 expression handling. */
939 if (sym
->type ()->code () == TYPE_CODE_STRUCT
)
942 add_memrange (gdbarch
, memrange_absolute
, offset
, len
, scope
);
945 reg
= sym
->register_ops ()->register_number (sym
, gdbarch
);
947 gdb_printf ("LOC_REG[parm] %s: ", sym
->print_name ());
948 add_local_register (gdbarch
, reg
, scope
);
949 /* Check for doubles stored in two registers. */
950 /* FIXME: how about larger types stored in 3 or more regs? */
951 if (sym
->type ()->code () == TYPE_CODE_FLT
&&
952 len
> register_size (gdbarch
, reg
))
953 add_local_register (gdbarch
, reg
+ 1, scope
);
956 gdb_printf ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
957 gdb_printf (" (will not collect %s)\n", sym
->print_name ());
961 offset
= frame_offset
+ sym
->value_longest ();
964 gdb_printf ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
965 " from frame ptr reg %d\n", sym
->print_name (), len
,
966 paddress (gdbarch
, offset
), reg
);
968 add_memrange (gdbarch
, reg
, offset
, len
, scope
);
970 case LOC_REGPARM_ADDR
:
971 reg
= sym
->value_longest ();
975 gdb_printf ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
976 " from reg %d\n", sym
->print_name (), len
,
977 paddress (gdbarch
, offset
), reg
);
979 add_memrange (gdbarch
, reg
, offset
, len
, scope
);
983 offset
= frame_offset
+ sym
->value_longest ();
986 gdb_printf ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
987 " from frame ptr reg %d\n", sym
->print_name (), len
,
988 paddress (gdbarch
, offset
), reg
);
990 add_memrange (gdbarch
, reg
, offset
, len
, scope
);
997 case LOC_OPTIMIZED_OUT
:
998 gdb_printf ("%s has been optimized out of existence.\n",
1007 /* Expressions are the most general case. */
1010 agent_expr_up aexpr
= gen_trace_for_var (scope
, gdbarch
,
1013 /* It can happen that the symbol is recorded as a computed
1014 location, but it's been optimized away and doesn't actually
1015 have a location expression. */
1018 gdb_printf ("%s has been optimized out of existence.\n",
1019 sym
->print_name ());
1023 finalize_tracepoint_aexpr (aexpr
.get ());
1025 /* Take care of the registers. */
1026 add_ax_registers (aexpr
.get ());
1028 add_aexpr (std::move (aexpr
));
1033 collection_list::add_wholly_collected (const char *print_name
)
1035 m_wholly_collected
.push_back (print_name
);
1038 /* Add all locals (or args) symbols to collection list. */
1041 collection_list::add_local_symbols (struct gdbarch
*gdbarch
, CORE_ADDR pc
,
1042 long frame_regno
, long frame_offset
, int type
,
1045 const struct block
*block
;
1048 auto do_collect_symbol
= [&] (const char *print_name
,
1051 collect_symbol (sym
, gdbarch
, frame_regno
,
1052 frame_offset
, pc
, trace_string
);
1054 add_wholly_collected (print_name
);
1059 block
= block_for_pc (pc
);
1062 warning (_("Can't collect locals; "
1063 "no symbol table info available.\n"));
1067 iterate_over_block_local_vars (block
, do_collect_symbol
);
1069 warning (_("No locals found in scope."));
1073 CORE_ADDR fn_pc
= get_pc_function_start (pc
);
1074 block
= block_for_pc (fn_pc
);
1077 warning (_("Can't collect args; no symbol table info available."));
1081 iterate_over_block_arg_vars (block
, do_collect_symbol
);
1083 warning (_("No args found in scope."));
1088 collection_list::add_static_trace_data ()
1091 gdb_printf ("collect static trace data\n");
1092 m_strace_data
= true;
1095 collection_list::collection_list ()
1096 : m_strace_data (false)
1098 int max_remote_regno
= 0;
1099 for (int i
= 0; i
< gdbarch_num_regs (current_inferior ()->arch ()); i
++)
1101 int remote_regno
= (gdbarch_remote_register_number
1102 (current_inferior ()->arch (), i
));
1104 if (remote_regno
>= 0 && remote_regno
> max_remote_regno
)
1105 max_remote_regno
= remote_regno
;
1108 m_regs_mask
.resize ((max_remote_regno
/ 8) + 1);
1110 m_memranges
.reserve (128);
1111 m_aexprs
.reserve (128);
1114 /* Reduce a collection list to string form (for gdb protocol). */
1116 std::vector
<std::string
>
1117 collection_list::stringify ()
1119 gdb::char_vector
temp_buf (2048);
1124 std::vector
<std::string
> str_list
;
1129 gdb_printf ("\nCollecting static trace data\n");
1130 end
= temp_buf
.data ();
1132 str_list
.emplace_back (temp_buf
.data (), end
- temp_buf
.data ());
1135 for (i
= m_regs_mask
.size () - 1; i
> 0; i
--)
1136 if (m_regs_mask
[i
] != 0) /* Skip leading zeroes in regs_mask. */
1138 if (m_regs_mask
[i
] != 0) /* Prepare to send regs_mask to the stub. */
1141 gdb_printf ("\nCollecting registers (mask): 0x");
1143 /* One char for 'R', one for the null terminator and two per
1145 std::size_t new_size
= (i
+ 1) * 2 + 2;
1146 if (new_size
> temp_buf
.size ())
1147 temp_buf
.resize (new_size
);
1149 end
= temp_buf
.data ();
1153 QUIT
; /* Allow user to bail out with ^C. */
1155 gdb_printf ("%02X", m_regs_mask
[i
]);
1157 end
= pack_hex_byte (end
, m_regs_mask
[i
]);
1161 str_list
.emplace_back (temp_buf
.data ());
1165 if (!m_memranges
.empty () && info_verbose
)
1166 gdb_printf ("Collecting memranges: \n");
1167 for (i
= 0, count
= 0, end
= temp_buf
.data ();
1168 i
< m_memranges
.size (); i
++)
1170 QUIT
; /* Allow user to bail out with ^C. */
1173 gdb_printf ("(%d, %s, %ld)\n",
1174 m_memranges
[i
].type
,
1175 paddress (current_inferior ()->arch (),
1176 m_memranges
[i
].start
),
1177 (long) (m_memranges
[i
].end
1178 - m_memranges
[i
].start
));
1180 if (count
+ 27 > MAX_AGENT_EXPR_LEN
)
1182 str_list
.emplace_back (temp_buf
.data (), count
);
1184 end
= temp_buf
.data ();
1188 bfd_signed_vma length
1189 = m_memranges
[i
].end
- m_memranges
[i
].start
;
1191 /* The "%X" conversion specifier expects an unsigned argument,
1192 so passing -1 (memrange_absolute) to it directly gives you
1193 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1195 if (m_memranges
[i
].type
== memrange_absolute
)
1196 sprintf (end
, "M-1,%s,%lX", phex_nz (m_memranges
[i
].start
, 0),
1199 sprintf (end
, "M%X,%s,%lX", m_memranges
[i
].type
,
1200 phex_nz (m_memranges
[i
].start
, 0), (long) length
);
1203 count
+= strlen (end
);
1204 end
= temp_buf
.data () + count
;
1207 for (i
= 0; i
< m_aexprs
.size (); i
++)
1209 QUIT
; /* Allow user to bail out with ^C. */
1210 if ((count
+ 10 + 2 * m_aexprs
[i
]->buf
.size ()) > MAX_AGENT_EXPR_LEN
)
1212 str_list
.emplace_back (temp_buf
.data (), count
);
1214 end
= temp_buf
.data ();
1216 sprintf (end
, "X%08X,", (int) m_aexprs
[i
]->buf
.size ());
1217 end
+= 10; /* 'X' + 8 hex digits + ',' */
1220 end
+= 2 * bin2hex (m_aexprs
[i
]->buf
.data (), end
,
1221 m_aexprs
[i
]->buf
.size ());
1222 count
+= 2 * m_aexprs
[i
]->buf
.size ();
1227 str_list
.emplace_back (temp_buf
.data (), count
);
1229 end
= temp_buf
.data ();
1235 /* Add the expression STR to M_COMPUTED. */
1238 collection_list::append_exp (std::string
&&str
)
1240 m_computed
.push_back (std::move (str
));
1244 collection_list::finish ()
1246 memrange_sortmerge (m_memranges
);
1250 encode_actions_1 (struct command_line
*action
,
1251 struct bp_location
*tloc
,
1253 LONGEST frame_offset
,
1254 struct collection_list
*collect
,
1255 struct collection_list
*stepping_list
)
1257 const char *action_exp
;
1259 struct value
*tempval
;
1260 struct cmd_list_element
*cmd
;
1262 for (; action
; action
= action
->next
)
1264 QUIT
; /* Allow user to bail out with ^C. */
1265 action_exp
= action
->line
;
1266 action_exp
= skip_spaces (action_exp
);
1268 cmd
= lookup_cmd (&action_exp
, cmdlist
, "", NULL
, -1, 1);
1270 error (_("Bad action list item: %s"), action_exp
);
1272 if (cmd_simple_func_eq (cmd
, collect_pseudocommand
))
1274 int trace_string
= 0;
1276 if (*action_exp
== '/')
1277 action_exp
= decode_agent_options (action_exp
, &trace_string
);
1280 { /* Repeat over a comma-separated list. */
1281 QUIT
; /* Allow user to bail out with ^C. */
1282 action_exp
= skip_spaces (action_exp
);
1283 gdbarch
*arch
= current_inferior ()->arch ();
1285 if (0 == strncasecmp ("$reg", action_exp
, 4))
1287 for (i
= 0; i
< gdbarch_num_regs (arch
);
1290 int remote_regno
= (gdbarch_remote_register_number
1293 /* Ignore arch regnos without a corresponding
1294 remote regno. This can happen for regnos not
1296 if (remote_regno
>= 0)
1297 collect
->add_remote_register (remote_regno
);
1299 action_exp
= strchr (action_exp
, ','); /* more? */
1301 else if (0 == strncasecmp ("$arg", action_exp
, 4))
1303 collect
->add_local_symbols (arch
,
1309 action_exp
= strchr (action_exp
, ','); /* more? */
1311 else if (0 == strncasecmp ("$loc", action_exp
, 4))
1313 collect
->add_local_symbols (arch
,
1319 action_exp
= strchr (action_exp
, ','); /* more? */
1321 else if (0 == strncasecmp ("$_ret", action_exp
, 5))
1324 = gen_trace_for_return_address (tloc
->address
,
1325 arch
, trace_string
);
1327 finalize_tracepoint_aexpr (aexpr
.get ());
1329 /* take care of the registers */
1330 collect
->add_ax_registers (aexpr
.get ());
1332 collect
->add_aexpr (std::move (aexpr
));
1333 action_exp
= strchr (action_exp
, ','); /* more? */
1335 else if (0 == strncasecmp ("$_sdata", action_exp
, 7))
1337 collect
->add_static_trace_data ();
1338 action_exp
= strchr (action_exp
, ','); /* more? */
1344 const char *exp_start
= action_exp
;
1345 expression_up exp
= parse_exp_1 (&action_exp
, tloc
->address
,
1346 block_for_pc (tloc
->address
),
1347 PARSER_COMMA_TERMINATES
);
1349 switch (exp
->first_opcode ())
1353 expr::register_operation
*regop
1354 = (gdb::checked_static_cast
<expr::register_operation
*>
1356 const char *name
= regop
->get_name ();
1358 i
= user_reg_map_name_to_regnum (arch
,
1359 name
, strlen (name
));
1361 internal_error (_("Register $%s not available"),
1364 gdb_printf ("OP_REGISTER: ");
1365 collect
->add_local_register (arch
, i
, tloc
->address
);
1371 /* Safe because we know it's a simple expression. */
1372 tempval
= exp
->evaluate ();
1373 addr
= tempval
->address ();
1374 expr::unop_memval_operation
*memop
1375 = (gdb::checked_static_cast
<expr::unop_memval_operation
*>
1377 struct type
*type
= memop
->get_type ();
1378 /* Initialize the TYPE_LENGTH if it is a typedef. */
1379 check_typedef (type
);
1380 collect
->add_memrange (arch
,
1381 memrange_absolute
, addr
,
1384 collect
->append_exp (std::string (exp_start
,
1391 expr::var_value_operation
*vvo
1392 = (gdb::checked_static_cast
<expr::var_value_operation
*>
1394 struct symbol
*sym
= vvo
->get_symbol ();
1395 const char *name
= sym
->natural_name ();
1397 collect
->collect_symbol (sym
,
1403 collect
->add_wholly_collected (name
);
1407 default: /* Full-fledged expression. */
1408 agent_expr_up aexpr
= gen_trace_for_expr (tloc
->address
,
1412 finalize_tracepoint_aexpr (aexpr
.get ());
1414 /* Take care of the registers. */
1415 collect
->add_ax_registers (aexpr
.get ());
1417 collect
->add_aexpr (std::move (aexpr
));
1418 collect
->append_exp (std::string (exp_start
,
1424 while (action_exp
&& *action_exp
++ == ',');
1426 else if (cmd_simple_func_eq (cmd
, teval_pseudocommand
))
1429 { /* Repeat over a comma-separated list. */
1430 QUIT
; /* Allow user to bail out with ^C. */
1431 action_exp
= skip_spaces (action_exp
);
1434 expression_up exp
= parse_exp_1 (&action_exp
, tloc
->address
,
1435 block_for_pc (tloc
->address
),
1436 PARSER_COMMA_TERMINATES
);
1438 agent_expr_up aexpr
= gen_eval_for_expr (tloc
->address
,
1441 finalize_tracepoint_aexpr (aexpr
.get ());
1443 /* Even though we're not officially collecting, add
1444 to the collect list anyway. */
1445 collect
->add_aexpr (std::move (aexpr
));
1448 while (action_exp
&& *action_exp
++ == ',');
1450 else if (cmd_simple_func_eq (cmd
, while_stepping_pseudocommand
))
1452 /* We check against nested while-stepping when setting
1453 breakpoint action, so no way to run into nested
1455 gdb_assert (stepping_list
);
1457 encode_actions_1 (action
->body_list_0
.get (), tloc
, frame_reg
,
1458 frame_offset
, stepping_list
, NULL
);
1461 error (_("Invalid tracepoint command '%s'"), action
->line
);
1465 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
1466 and STEPPING_LIST. */
1469 encode_actions (struct bp_location
*tloc
,
1470 struct collection_list
*tracepoint_list
,
1471 struct collection_list
*stepping_list
)
1474 LONGEST frame_offset
;
1476 gdbarch_virtual_frame_pointer (tloc
->gdbarch
,
1477 tloc
->address
, &frame_reg
, &frame_offset
);
1479 tracepoint
*t
= gdb::checked_static_cast
<tracepoint
*> (tloc
->owner
);
1480 counted_command_line actions
= all_tracepoint_actions (t
);
1481 encode_actions_1 (actions
.get (), tloc
, frame_reg
, frame_offset
,
1482 tracepoint_list
, stepping_list
);
1483 encode_actions_1 (breakpoint_commands (tloc
->owner
), tloc
,
1484 frame_reg
, frame_offset
, tracepoint_list
, stepping_list
);
1486 tracepoint_list
->finish ();
1487 stepping_list
->finish ();
1490 /* Render all actions into gdb protocol. */
1493 encode_actions_rsp (struct bp_location
*tloc
,
1494 std::vector
<std::string
> *tdp_actions
,
1495 std::vector
<std::string
> *stepping_actions
)
1497 struct collection_list tracepoint_list
, stepping_list
;
1499 encode_actions (tloc
, &tracepoint_list
, &stepping_list
);
1501 *tdp_actions
= tracepoint_list
.stringify ();
1502 *stepping_actions
= stepping_list
.stringify ();
1506 collection_list::add_aexpr (agent_expr_up aexpr
)
1508 m_aexprs
.push_back (std::move (aexpr
));
1512 process_tracepoint_on_disconnect (void)
1514 int has_pending_p
= 0;
1516 /* Check whether we still have pending tracepoint. If we have, warn the
1517 user that pending tracepoint will no longer work. */
1518 for (breakpoint
&b
: all_tracepoints ())
1520 if (!b
.has_locations ())
1527 for (bp_location
&loc1
: b
.locations ())
1529 if (loc1
.shlib_disabled
)
1542 warning (_("Pending tracepoints will not be resolved while"
1543 " GDB is disconnected\n"));
1546 /* Reset local state of tracing. */
1549 trace_reset_local_state (void)
1551 set_traceframe_num (-1);
1552 set_tracepoint_num (-1);
1553 set_traceframe_context (NULL
);
1554 clear_traceframe_info ();
1558 start_tracing (const char *notes
)
1560 int any_enabled
= 0, num_to_download
= 0;
1563 auto tracepoint_range
= all_tracepoints ();
1565 /* No point in tracing without any tracepoints... */
1566 if (tracepoint_range
.begin () == tracepoint_range
.end ())
1567 error (_("No tracepoints defined, not starting trace"));
1569 for (breakpoint
&b
: tracepoint_range
)
1571 if (b
.enable_state
== bp_enabled
)
1574 if ((b
.type
== bp_fast_tracepoint
1575 ? may_insert_fast_tracepoints
1576 : may_insert_tracepoints
))
1579 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1580 (b
.type
== bp_fast_tracepoint
? "fast " : ""), b
.number
);
1585 if (target_supports_enable_disable_tracepoint ())
1586 warning (_("No tracepoints enabled"));
1589 /* No point in tracing with only disabled tracepoints that
1590 cannot be re-enabled. */
1591 error (_("No tracepoints enabled, not starting trace"));
1595 if (num_to_download
<= 0)
1596 error (_("No tracepoints that may be downloaded, not starting trace"));
1598 target_trace_init ();
1600 for (breakpoint
&b
: tracepoint_range
)
1602 tracepoint
&t
= gdb::checked_static_cast
<tracepoint
&> (b
);
1603 int bp_location_downloaded
= 0;
1605 /* Clear `inserted' flag. */
1606 for (bp_location
&loc
: b
.locations ())
1609 if ((b
.type
== bp_fast_tracepoint
1610 ? !may_insert_fast_tracepoints
1611 : !may_insert_tracepoints
))
1614 t
.number_on_target
= 0;
1616 for (bp_location
&loc
: b
.locations ())
1618 /* Since tracepoint locations are never duplicated, `inserted'
1619 flag should be zero. */
1620 gdb_assert (!loc
.inserted
);
1622 target_download_tracepoint (&loc
);
1625 bp_location_downloaded
= 1;
1628 t
.number_on_target
= b
.number
;
1630 for (bp_location
&loc
: b
.locations ())
1631 if (loc
.probe
.prob
!= NULL
)
1632 loc
.probe
.prob
->set_semaphore (loc
.probe
.objfile
, loc
.gdbarch
);
1634 if (bp_location_downloaded
)
1635 notify_breakpoint_modified (&b
);
1638 /* Send down all the trace state variables too. */
1639 for (const trace_state_variable
&tsv
: tvariables
)
1640 target_download_trace_state_variable (tsv
);
1642 /* Tell target to treat text-like sections as transparent. */
1643 target_trace_set_readonly_regions ();
1644 /* Set some mode flags. */
1645 target_set_disconnected_tracing (disconnected_tracing
);
1646 target_set_circular_trace_buffer (circular_trace_buffer
);
1647 target_set_trace_buffer_size (trace_buffer_size
);
1650 notes
= trace_notes
.c_str ();
1652 ret
= target_set_trace_notes (trace_user
.c_str (), notes
, NULL
);
1654 if (!ret
&& (!trace_user
.empty () || notes
))
1655 warning (_("Target does not support trace user/notes, info ignored"));
1657 /* Now insert traps and begin collecting data. */
1658 target_trace_start ();
1660 /* Reset our local state. */
1661 trace_reset_local_state ();
1662 current_trace_status()->running
= 1;
1665 /* The tstart command requests the target to start a new trace run.
1666 The command passes any arguments it has to the target verbatim, as
1667 an optional "trace note". This is useful as for instance a warning
1668 to other users if the trace runs disconnected, and you don't want
1669 anybody else messing with the target. */
1672 tstart_command (const char *args
, int from_tty
)
1674 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1676 if (current_trace_status ()->running
)
1679 && !query (_("A trace is running already. Start a new run? ")))
1680 error (_("New trace run not started."));
1683 start_tracing (args
);
1686 /* The tstop command stops the tracing run. The command passes any
1687 supplied arguments to the target verbatim as a "stop note"; if the
1688 target supports trace notes, then it will be reported back as part
1689 of the trace run's status. */
1692 tstop_command (const char *args
, int from_tty
)
1694 if (!current_trace_status ()->running
)
1695 error (_("Trace is not running."));
1697 stop_tracing (args
);
1701 stop_tracing (const char *note
)
1705 target_trace_stop ();
1707 for (breakpoint
&t
: all_tracepoints ())
1709 if ((t
.type
== bp_fast_tracepoint
1710 ? !may_insert_fast_tracepoints
1711 : !may_insert_tracepoints
))
1714 for (bp_location
&loc
: t
.locations ())
1716 /* GDB can be totally absent in some disconnected trace scenarios,
1717 but we don't really care if this semaphore goes out of sync.
1718 That's why we are decrementing it here, but not taking care
1720 if (loc
.probe
.prob
!= NULL
)
1721 loc
.probe
.prob
->clear_semaphore (loc
.probe
.objfile
, loc
.gdbarch
);
1726 note
= trace_stop_notes
.c_str ();
1728 ret
= target_set_trace_notes (NULL
, NULL
, note
);
1731 warning (_("Target does not support trace notes, note ignored"));
1733 /* Should change in response to reply? */
1734 current_trace_status ()->running
= 0;
1737 /* tstatus command */
1739 tstatus_command (const char *args
, int from_tty
)
1741 struct trace_status
*ts
= current_trace_status ();
1744 status
= target_get_trace_status (ts
);
1748 if (ts
->filename
!= NULL
)
1749 gdb_printf (_("Using a trace file.\n"));
1752 gdb_printf (_("Trace can not be run on this target.\n"));
1757 if (!ts
->running_known
)
1759 gdb_printf (_("Run/stop status is unknown.\n"));
1761 else if (ts
->running
)
1763 gdb_printf (_("Trace is running on the target.\n"));
1767 switch (ts
->stop_reason
)
1769 case trace_never_run
:
1770 gdb_printf (_("No trace has been run on the target.\n"));
1772 case trace_stop_command
:
1774 gdb_printf (_("Trace stopped by a tstop command (%s).\n"),
1777 gdb_printf (_("Trace stopped by a tstop command.\n"));
1779 case trace_buffer_full
:
1780 gdb_printf (_("Trace stopped because the buffer was full.\n"));
1782 case trace_disconnected
:
1783 gdb_printf (_("Trace stopped because of disconnection.\n"));
1785 case tracepoint_passcount
:
1786 gdb_printf (_("Trace stopped by tracepoint %d.\n"),
1787 ts
->stopping_tracepoint
);
1789 case tracepoint_error
:
1790 if (ts
->stopping_tracepoint
)
1791 gdb_printf (_("Trace stopped by an "
1792 "error (%s, tracepoint %d).\n"),
1793 ts
->stop_desc
, ts
->stopping_tracepoint
);
1795 gdb_printf (_("Trace stopped by an error (%s).\n"),
1798 case trace_stop_reason_unknown
:
1799 gdb_printf (_("Trace stopped for an unknown reason.\n"));
1802 gdb_printf (_("Trace stopped for some other reason (%d).\n"),
1808 if (ts
->traceframes_created
>= 0
1809 && ts
->traceframe_count
!= ts
->traceframes_created
)
1811 gdb_printf (_("Buffer contains %d trace "
1812 "frames (of %d created total).\n"),
1813 ts
->traceframe_count
, ts
->traceframes_created
);
1815 else if (ts
->traceframe_count
>= 0)
1817 gdb_printf (_("Collected %d trace frames.\n"),
1818 ts
->traceframe_count
);
1821 if (ts
->buffer_free
>= 0)
1823 if (ts
->buffer_size
>= 0)
1825 gdb_printf (_("Trace buffer has %d bytes of %d bytes free"),
1826 ts
->buffer_free
, ts
->buffer_size
);
1827 if (ts
->buffer_size
> 0)
1828 gdb_printf (_(" (%d%% full)"),
1829 ((int) ((((long long) (ts
->buffer_size
1830 - ts
->buffer_free
)) * 100)
1831 / ts
->buffer_size
)));
1832 gdb_printf (_(".\n"));
1835 gdb_printf (_("Trace buffer has %d bytes free.\n"),
1839 if (ts
->disconnected_tracing
)
1840 gdb_printf (_("Trace will continue if GDB disconnects.\n"));
1842 gdb_printf (_("Trace will stop if GDB disconnects.\n"));
1844 if (ts
->circular_buffer
)
1845 gdb_printf (_("Trace buffer is circular.\n"));
1847 if (ts
->user_name
&& strlen (ts
->user_name
) > 0)
1848 gdb_printf (_("Trace user is %s.\n"), ts
->user_name
);
1850 if (ts
->notes
&& strlen (ts
->notes
) > 0)
1851 gdb_printf (_("Trace notes: %s.\n"), ts
->notes
);
1853 /* Now report on what we're doing with tfind. */
1854 if (traceframe_number
>= 0)
1855 gdb_printf (_("Looking at trace frame %d, tracepoint %d.\n"),
1856 traceframe_number
, tracepoint_number
);
1858 gdb_printf (_("Not looking at any trace frame.\n"));
1860 /* Report start/stop times if supplied. */
1865 LONGEST run_time
= ts
->stop_time
- ts
->start_time
;
1867 /* Reporting a run time is more readable than two long numbers. */
1868 gdb_printf (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
1869 (long int) (ts
->start_time
/ 1000000),
1870 (long int) (ts
->start_time
% 1000000),
1871 (long int) (run_time
/ 1000000),
1872 (long int) (run_time
% 1000000));
1875 gdb_printf (_("Trace started at %ld.%06ld secs.\n"),
1876 (long int) (ts
->start_time
/ 1000000),
1877 (long int) (ts
->start_time
% 1000000));
1879 else if (ts
->stop_time
)
1880 gdb_printf (_("Trace stopped at %ld.%06ld secs.\n"),
1881 (long int) (ts
->stop_time
/ 1000000),
1882 (long int) (ts
->stop_time
% 1000000));
1884 /* Now report any per-tracepoint status available. */
1885 for (breakpoint
&b
: all_tracepoints ())
1887 tracepoint
*t
= gdb::checked_static_cast
<tracepoint
*> (&b
);
1888 target_get_tracepoint_status (t
, nullptr);
1892 /* Report the trace status to uiout, in a way suitable for MI, and not
1893 suitable for CLI. If ON_STOP is true, suppress a few fields that
1894 are not meaningful in the -trace-stop response.
1896 The implementation is essentially parallel to trace_status_command, but
1897 merging them will result in unreadable code. */
1899 trace_status_mi (int on_stop
)
1901 struct ui_out
*uiout
= current_uiout
;
1902 struct trace_status
*ts
= current_trace_status ();
1905 status
= target_get_trace_status (ts
);
1907 if (status
== -1 && ts
->filename
== NULL
)
1909 uiout
->field_string ("supported", "0");
1913 if (ts
->filename
!= NULL
)
1914 uiout
->field_string ("supported", "file");
1916 uiout
->field_string ("supported", "1");
1918 if (ts
->filename
!= NULL
)
1919 uiout
->field_string ("trace-file", ts
->filename
);
1921 gdb_assert (ts
->running_known
);
1925 uiout
->field_string ("running", "1");
1927 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1928 Given that the frontend gets the status either on -trace-stop, or from
1929 -trace-status after re-connection, it does not seem like this
1930 information is necessary for anything. It is not necessary for either
1931 figuring the vital state of the target nor for navigation of trace
1932 frames. If the frontend wants to show the current state is some
1933 configure dialog, it can request the value when such dialog is
1934 invoked by the user. */
1938 const char *stop_reason
= NULL
;
1939 int stopping_tracepoint
= -1;
1942 uiout
->field_string ("running", "0");
1944 if (ts
->stop_reason
!= trace_stop_reason_unknown
)
1946 switch (ts
->stop_reason
)
1948 case trace_stop_command
:
1949 stop_reason
= "request";
1951 case trace_buffer_full
:
1952 stop_reason
= "overflow";
1954 case trace_disconnected
:
1955 stop_reason
= "disconnection";
1957 case tracepoint_passcount
:
1958 stop_reason
= "passcount";
1959 stopping_tracepoint
= ts
->stopping_tracepoint
;
1961 case tracepoint_error
:
1962 stop_reason
= "error";
1963 stopping_tracepoint
= ts
->stopping_tracepoint
;
1969 uiout
->field_string ("stop-reason", stop_reason
);
1970 if (stopping_tracepoint
!= -1)
1971 uiout
->field_signed ("stopping-tracepoint",
1972 stopping_tracepoint
);
1973 if (ts
->stop_reason
== tracepoint_error
)
1974 uiout
->field_string ("error-description",
1980 if (ts
->traceframe_count
!= -1)
1981 uiout
->field_signed ("frames", ts
->traceframe_count
);
1982 if (ts
->traceframes_created
!= -1)
1983 uiout
->field_signed ("frames-created", ts
->traceframes_created
);
1984 if (ts
->buffer_size
!= -1)
1985 uiout
->field_signed ("buffer-size", ts
->buffer_size
);
1986 if (ts
->buffer_free
!= -1)
1987 uiout
->field_signed ("buffer-free", ts
->buffer_free
);
1989 uiout
->field_signed ("disconnected", ts
->disconnected_tracing
);
1990 uiout
->field_signed ("circular", ts
->circular_buffer
);
1992 uiout
->field_string ("user-name", ts
->user_name
);
1993 uiout
->field_string ("notes", ts
->notes
);
1998 xsnprintf (buf
, sizeof buf
, "%ld.%06ld",
1999 (long int) (ts
->start_time
/ 1000000),
2000 (long int) (ts
->start_time
% 1000000));
2001 uiout
->field_string ("start-time", buf
);
2002 xsnprintf (buf
, sizeof buf
, "%ld.%06ld",
2003 (long int) (ts
->stop_time
/ 1000000),
2004 (long int) (ts
->stop_time
% 1000000));
2005 uiout
->field_string ("stop-time", buf
);
2009 /* Check if a trace run is ongoing. If so, and FROM_TTY, query the
2010 user if she really wants to detach. */
2013 query_if_trace_running (int from_tty
)
2018 /* It can happen that the target that was tracing went away on its
2019 own, and we didn't notice. Get a status update, and if the
2020 current target doesn't even do tracing, then assume it's not
2022 if (target_get_trace_status (current_trace_status ()) < 0)
2023 current_trace_status ()->running
= 0;
2025 /* If running interactively, give the user the option to cancel and
2026 then decide what to do differently with the run. Scripts are
2027 just going to disconnect and let the target deal with it,
2028 according to how it's been instructed previously via
2029 disconnected-tracing. */
2030 if (current_trace_status ()->running
)
2032 process_tracepoint_on_disconnect ();
2034 if (current_trace_status ()->disconnected_tracing
)
2036 if (!query (_("Trace is running and will "
2037 "continue after detach; detach anyway? ")))
2038 error (_("Not confirmed."));
2042 if (!query (_("Trace is running but will "
2043 "stop on detach; detach anyway? ")))
2044 error (_("Not confirmed."));
2049 /* This function handles the details of what to do about an ongoing
2050 tracing run if the user has asked to detach or otherwise disconnect
2054 disconnect_tracing (void)
2056 /* Also we want to be out of tfind mode, otherwise things can get
2057 confusing upon reconnection. Just use these calls instead of
2058 full tfind_1 behavior because we're in the middle of detaching,
2059 and there's no point to updating current stack frame etc. */
2060 trace_reset_local_state ();
2063 /* Worker function for the various flavors of the tfind command. */
2065 tfind_1 (enum trace_find_type type
, int num
,
2066 CORE_ADDR addr1
, CORE_ADDR addr2
,
2069 int target_frameno
= -1, target_tracept
= -1;
2070 struct frame_id old_frame_id
= null_frame_id
;
2071 struct tracepoint
*tp
;
2072 struct ui_out
*uiout
= current_uiout
;
2074 /* Only try to get the current stack frame if we have a chance of
2075 succeeding. In particular, if we're trying to get a first trace
2076 frame while all threads are running, it's not going to succeed,
2077 so leave it with a default value and let the frame comparison
2078 below (correctly) decide to print out the source location of the
2080 if (!(type
== tfind_number
&& num
== -1)
2081 && (has_stack_frames () || traceframe_number
>= 0))
2082 old_frame_id
= get_frame_id (get_current_frame ());
2084 target_frameno
= target_trace_find (type
, num
, addr1
, addr2
,
2087 if (type
== tfind_number
2089 && target_frameno
== -1)
2091 /* We told the target to get out of tfind mode, and it did. */
2093 else if (target_frameno
== -1)
2095 /* A request for a non-existent trace frame has failed.
2096 Our response will be different, depending on FROM_TTY:
2098 If FROM_TTY is true, meaning that this command was
2099 typed interactively by the user, then give an error
2100 and DO NOT change the state of traceframe_number etc.
2102 However if FROM_TTY is false, meaning that we're either
2103 in a script, a loop, or a user-defined command, then
2104 DON'T give an error, but DO change the state of
2105 traceframe_number etc. to invalid.
2107 The rationale is that if you typed the command, you
2108 might just have committed a typo or something, and you'd
2109 like to NOT lose your current debugging state. However
2110 if you're in a user-defined command or especially in a
2111 loop, then you need a way to detect that the command
2112 failed WITHOUT aborting. This allows you to write
2113 scripts that search thru the trace buffer until the end,
2114 and then continue on to do something else. */
2117 error (_("Target failed to find requested trace frame."));
2121 gdb_printf ("End of trace buffer.\n");
2122 #if 0 /* dubious now? */
2123 /* The following will not recurse, since it's
2125 tfind_command ("-1", from_tty
);
2130 tp
= get_tracepoint_by_number_on_target (target_tracept
);
2132 reinit_frame_cache ();
2133 target_dcache_invalidate (current_program_space
->aspace
);
2135 set_tracepoint_num (tp
? tp
->number
: target_tracept
);
2137 if (target_frameno
!= get_traceframe_number ())
2138 interps_notify_traceframe_changed (target_frameno
, tracepoint_number
);
2140 set_current_traceframe (target_frameno
);
2142 if (target_frameno
== -1)
2143 set_traceframe_context (NULL
);
2145 set_traceframe_context (get_current_frame ());
2147 if (traceframe_number
>= 0)
2149 /* Use different branches for MI and CLI to make CLI messages
2151 if (uiout
->is_mi_like_p ())
2153 uiout
->field_string ("found", "1");
2154 uiout
->field_signed ("tracepoint", tracepoint_number
);
2155 uiout
->field_signed ("traceframe", traceframe_number
);
2159 gdb_printf (_("Found trace frame %d, tracepoint %d\n"),
2160 traceframe_number
, tracepoint_number
);
2165 if (uiout
->is_mi_like_p ())
2166 uiout
->field_string ("found", "0");
2167 else if (type
== tfind_number
&& num
== -1)
2168 gdb_printf (_("No longer looking at any trace frame\n"));
2169 else /* This case may never occur, check. */
2170 gdb_printf (_("No trace frame found\n"));
2173 /* If we're in nonstop mode and getting out of looking at trace
2174 frames, there won't be any current frame to go back to and
2177 && (has_stack_frames () || traceframe_number
>= 0))
2179 enum print_what print_what
;
2181 /* NOTE: in imitation of the step command, try to determine
2182 whether we have made a transition from one function to
2183 another. If so, we'll print the "stack frame" (ie. the new
2184 function and it's arguments) -- otherwise we'll just show the
2187 if (old_frame_id
== get_frame_id (get_current_frame ()))
2188 print_what
= SRC_LINE
;
2190 print_what
= SRC_AND_LOC
;
2192 print_stack_frame (get_selected_frame (NULL
), 1, print_what
, 1);
2197 /* Error on looking at traceframes while trace is running. */
2200 check_trace_running (struct trace_status
*status
)
2202 if (status
->running
&& status
->filename
== NULL
)
2203 error (_("May not look at trace frames while trace is running."));
2206 /* trace_find_command takes a trace frame number n,
2207 sends "QTFrame:<n>" to the target,
2208 and accepts a reply that may contain several optional pieces
2209 of information: a frame number, a tracepoint number, and an
2210 indication of whether this is a trap frame or a stepping frame.
2212 The minimal response is just "OK" (which indicates that the
2213 target does not give us a frame number or a tracepoint number).
2214 Instead of that, the target may send us a string containing
2216 F<hexnum> (gives the selected frame number)
2217 T<hexnum> (gives the selected tracepoint number)
2222 tfind_command_1 (const char *args
, int from_tty
)
2223 { /* This should only be called with a numeric argument. */
2226 check_trace_running (current_trace_status ());
2228 if (args
== 0 || *args
== 0)
2229 { /* TFIND with no args means find NEXT trace frame. */
2230 if (traceframe_number
== -1)
2231 frameno
= 0; /* "next" is first one. */
2233 frameno
= traceframe_number
+ 1;
2235 else if (0 == strcmp (args
, "-"))
2237 if (traceframe_number
== -1)
2238 error (_("not debugging trace buffer"));
2239 else if (from_tty
&& traceframe_number
== 0)
2240 error (_("already at start of trace buffer"));
2242 frameno
= traceframe_number
- 1;
2244 /* A hack to work around eval's need for fp to have been collected. */
2245 else if (0 == strcmp (args
, "-1"))
2248 frameno
= parse_and_eval_long (args
);
2251 error (_("invalid input (%d is less than zero)"), frameno
);
2253 tfind_1 (tfind_number
, frameno
, 0, 0, from_tty
);
2257 tfind_command (const char *args
, int from_tty
)
2259 tfind_command_1 (args
, from_tty
);
2264 tfind_end_command (const char *args
, int from_tty
)
2266 tfind_command_1 ("-1", from_tty
);
2271 tfind_start_command (const char *args
, int from_tty
)
2273 tfind_command_1 ("0", from_tty
);
2276 /* tfind pc command */
2278 tfind_pc_command (const char *args
, int from_tty
)
2282 check_trace_running (current_trace_status ());
2284 if (args
== 0 || *args
== 0)
2285 pc
= regcache_read_pc (get_thread_regcache (inferior_thread ()));
2287 pc
= parse_and_eval_address (args
);
2289 tfind_1 (tfind_pc
, 0, pc
, 0, from_tty
);
2292 /* tfind tracepoint command */
2294 tfind_tracepoint_command (const char *args
, int from_tty
)
2297 struct tracepoint
*tp
;
2299 check_trace_running (current_trace_status ());
2301 if (args
== 0 || *args
== 0)
2303 if (tracepoint_number
== -1)
2304 error (_("No current tracepoint -- please supply an argument."));
2306 tdp
= tracepoint_number
; /* Default is current TDP. */
2309 tdp
= parse_and_eval_long (args
);
2311 /* If we have the tracepoint on hand, use the number that the
2312 target knows about (which may be different if we disconnected
2313 and reconnected). */
2314 tp
= get_tracepoint (tdp
);
2316 tdp
= tp
->number_on_target
;
2318 tfind_1 (tfind_tp
, tdp
, 0, 0, from_tty
);
2321 /* TFIND LINE command:
2323 This command will take a sourceline for argument, just like BREAK
2324 or TRACE (ie. anything that "decode_line_1" can handle).
2326 With no argument, this command will find the next trace frame
2327 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2330 tfind_line_command (const char *args
, int from_tty
)
2332 check_trace_running (current_trace_status ());
2334 symtab_and_line sal
;
2335 if (args
== 0 || *args
== 0)
2337 sal
= find_pc_line (get_frame_pc (get_current_frame ()), 0);
2341 std::vector
<symtab_and_line
> sals
2342 = decode_line_with_current_source (args
, DECODE_LINE_FUNFIRSTLINE
);
2346 if (sal
.symtab
== 0)
2347 error (_("No line number information available."));
2349 CORE_ADDR start_pc
, end_pc
;
2350 if (sal
.line
> 0 && find_line_pc_range (sal
, &start_pc
, &end_pc
))
2352 if (start_pc
== end_pc
)
2354 gdb_printf ("Line %d of \"%s\"",
2356 symtab_to_filename_for_display (sal
.symtab
));
2357 gdb_stdout
->wrap_here (2);
2358 gdb_printf (" is at address ");
2359 print_address (get_current_arch (), start_pc
, gdb_stdout
);
2360 gdb_stdout
->wrap_here (2);
2361 gdb_printf (" but contains no code.\n");
2362 sal
= find_pc_line (start_pc
, 0);
2364 && find_line_pc_range (sal
, &start_pc
, &end_pc
)
2365 && start_pc
!= end_pc
)
2366 gdb_printf ("Attempting to find line %d instead.\n",
2369 error (_("Cannot find a good line."));
2374 /* Is there any case in which we get here, and have an address
2375 which the user would want to see? If we have debugging
2376 symbols and no line numbers? */
2377 error (_("Line number %d is out of range for \"%s\"."),
2378 sal
.line
, symtab_to_filename_for_display (sal
.symtab
));
2381 /* Find within range of stated line. */
2383 tfind_1 (tfind_range
, 0, start_pc
, end_pc
- 1, from_tty
);
2385 tfind_1 (tfind_outside
, 0, start_pc
, end_pc
- 1, from_tty
);
2388 /* tfind range command */
2390 tfind_range_command (const char *args
, int from_tty
)
2392 static CORE_ADDR start
, stop
;
2395 check_trace_running (current_trace_status ());
2397 if (args
== 0 || *args
== 0)
2398 { /* XXX FIXME: what should default behavior be? */
2399 gdb_printf ("Usage: tfind range STARTADDR, ENDADDR\n");
2403 if (0 != (tmp
= strchr (args
, ',')))
2405 std::string
start_addr (args
, tmp
);
2407 tmp
= skip_spaces (tmp
);
2408 start
= parse_and_eval_address (start_addr
.c_str ());
2409 stop
= parse_and_eval_address (tmp
);
2412 { /* No explicit end address? */
2413 start
= parse_and_eval_address (args
);
2414 stop
= start
+ 1; /* ??? */
2417 tfind_1 (tfind_range
, 0, start
, stop
, from_tty
);
2420 /* tfind outside command */
2422 tfind_outside_command (const char *args
, int from_tty
)
2424 CORE_ADDR start
, stop
;
2427 if (current_trace_status ()->running
2428 && current_trace_status ()->filename
== NULL
)
2429 error (_("May not look at trace frames while trace is running."));
2431 if (args
== 0 || *args
== 0)
2432 { /* XXX FIXME: what should default behavior be? */
2433 gdb_printf ("Usage: tfind outside STARTADDR, ENDADDR\n");
2437 if (0 != (tmp
= strchr (args
, ',')))
2439 std::string
start_addr (args
, tmp
);
2441 tmp
= skip_spaces (tmp
);
2442 start
= parse_and_eval_address (start_addr
.c_str ());
2443 stop
= parse_and_eval_address (tmp
);
2446 { /* No explicit end address? */
2447 start
= parse_and_eval_address (args
);
2448 stop
= start
+ 1; /* ??? */
2451 tfind_1 (tfind_outside
, 0, start
, stop
, from_tty
);
2454 /* info scope command: list the locals for a scope. */
2456 info_scope_command (const char *args_in
, int from_tty
)
2458 struct bound_minimal_symbol msym
;
2459 const struct block
*block
;
2460 const char *symname
;
2461 const char *save_args
= args_in
;
2463 struct gdbarch
*gdbarch
;
2465 const char *args
= args_in
;
2467 if (args
== 0 || *args
== 0)
2468 error (_("requires an argument (function, "
2469 "line or *addr) to define a scope"));
2471 location_spec_up locspec
= string_to_location_spec (&args
,
2473 std::vector
<symtab_and_line
> sals
2474 = decode_line_1 (locspec
.get (), DECODE_LINE_FUNFIRSTLINE
,
2478 /* Presumably decode_line_1 has already warned. */
2482 /* Resolve line numbers to PC. */
2483 resolve_sal_pc (&sals
[0]);
2484 block
= block_for_pc (sals
[0].pc
);
2488 QUIT
; /* Allow user to bail out with ^C. */
2489 for (struct symbol
*sym
: block_iterator_range (block
))
2491 QUIT
; /* Allow user to bail out with ^C. */
2493 gdb_printf ("Scope for %s:\n", save_args
);
2496 symname
= sym
->print_name ();
2497 if (symname
== NULL
|| *symname
== '\0')
2498 continue; /* Probably botched, certainly useless. */
2500 gdbarch
= sym
->arch ();
2502 gdb_printf ("Symbol %s is ", symname
);
2504 if (const symbol_computed_ops
*computed_ops
= sym
->computed_ops ();
2505 computed_ops
!= nullptr)
2506 computed_ops
->describe_location (sym
, block
->entry_pc (),
2510 switch (sym
->aclass ())
2513 case LOC_UNDEF
: /* Messed up symbol? */
2514 gdb_printf ("a bogus symbol, class %d.\n",
2516 count
--; /* Don't count this one. */
2519 gdb_printf ("a constant with value %s (%s)",
2520 plongest (sym
->value_longest ()),
2521 hex_string (sym
->value_longest ()));
2523 case LOC_CONST_BYTES
:
2524 gdb_printf ("constant bytes: ");
2526 for (j
= 0; j
< sym
->type ()->length (); j
++)
2527 gdb_printf (" %02x", (unsigned) sym
->value_bytes ()[j
]);
2530 gdb_printf ("in static storage at address ");
2531 gdb_printf ("%s", paddress (gdbarch
, sym
->value_address ()));
2534 /* GDBARCH is the architecture associated with the objfile
2535 the symbol is defined in; the target architecture may be
2536 different, and may provide additional registers. However,
2537 we do not know the target architecture at this point.
2538 We assume the objfile architecture will contain all the
2539 standard registers that occur in debug info in that
2541 regno
= sym
->register_ops ()->register_number (sym
, gdbarch
);
2543 if (sym
->is_argument ())
2544 gdb_printf ("an argument in register $%s",
2545 gdbarch_register_name (gdbarch
, regno
));
2547 gdb_printf ("a local variable in register $%s",
2548 gdbarch_register_name (gdbarch
, regno
));
2551 gdb_printf ("an argument at stack/frame offset %s",
2552 plongest (sym
->value_longest ()));
2555 gdb_printf ("a local variable at frame offset %s",
2556 plongest (sym
->value_longest ()));
2559 gdb_printf ("a reference argument at offset %s",
2560 plongest (sym
->value_longest ()));
2562 case LOC_REGPARM_ADDR
:
2563 /* Note comment at LOC_REGISTER. */
2564 regno
= sym
->register_ops ()->register_number (sym
, gdbarch
);
2565 gdb_printf ("the address of an argument, in register $%s",
2566 gdbarch_register_name (gdbarch
, regno
));
2569 gdb_printf ("a typedef.\n");
2572 gdb_printf ("a label at address ");
2573 gdb_printf ("%s", paddress (gdbarch
, sym
->value_address ()));
2576 gdb_printf ("a function at address ");
2579 sym
->value_block ()->entry_pc ()));
2581 case LOC_UNRESOLVED
:
2582 msym
= lookup_minimal_symbol (sym
->linkage_name (),
2584 if (msym
.minsym
== NULL
)
2585 gdb_printf ("Unresolved Static");
2588 gdb_printf ("static storage at address ");
2590 paddress (gdbarch
, msym
.value_address ()));
2593 case LOC_OPTIMIZED_OUT
:
2594 gdb_printf ("optimized out.\n");
2597 gdb_assert_not_reached ("LOC_COMPUTED variable missing a method");
2602 struct type
*t
= check_typedef (sym
->type ());
2604 gdb_printf (", length %s.\n", pulongest (t
->length ()));
2607 if (block
->function ())
2610 block
= block
->superblock ();
2613 gdb_printf ("Scope for %s contains no locals or arguments.\n",
2617 /* Helper for trace_dump_command. Dump the action list starting at
2618 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2619 actions of the body of a while-stepping action. STEPPING_FRAME is
2620 set if the current traceframe was determined to be a while-stepping
2624 trace_dump_actions (struct command_line
*action
,
2625 int stepping_actions
, int stepping_frame
,
2628 const char *action_exp
, *next_comma
;
2630 for (; action
!= NULL
; action
= action
->next
)
2632 struct cmd_list_element
*cmd
;
2634 QUIT
; /* Allow user to bail out with ^C. */
2635 action_exp
= action
->line
;
2636 action_exp
= skip_spaces (action_exp
);
2638 /* The collection actions to be done while stepping are
2639 bracketed by the commands "while-stepping" and "end". */
2641 if (*action_exp
== '#') /* comment line */
2644 cmd
= lookup_cmd (&action_exp
, cmdlist
, "", NULL
, -1, 1);
2646 error (_("Bad action list item: %s"), action_exp
);
2648 if (cmd_simple_func_eq (cmd
, while_stepping_pseudocommand
))
2650 gdb_assert (action
->body_list_1
== nullptr);
2651 trace_dump_actions (action
->body_list_0
.get (),
2652 1, stepping_frame
, from_tty
);
2654 else if (cmd_simple_func_eq (cmd
, collect_pseudocommand
))
2656 /* Display the collected data.
2657 For the trap frame, display only what was collected at
2658 the trap. Likewise for stepping frames, display only
2659 what was collected while stepping. This means that the
2660 two boolean variables, STEPPING_FRAME and
2661 STEPPING_ACTIONS should be equal. */
2662 if (stepping_frame
== stepping_actions
)
2664 int trace_string
= 0;
2666 if (*action_exp
== '/')
2667 action_exp
= decode_agent_options (action_exp
, &trace_string
);
2670 { /* Repeat over a comma-separated list. */
2671 QUIT
; /* Allow user to bail out with ^C. */
2672 if (*action_exp
== ',')
2674 action_exp
= skip_spaces (action_exp
);
2676 next_comma
= strchr (action_exp
, ',');
2678 if (0 == strncasecmp (action_exp
, "$reg", 4))
2679 registers_info (NULL
, from_tty
);
2680 else if (0 == strncasecmp (action_exp
, "$_ret", 5))
2682 else if (0 == strncasecmp (action_exp
, "$loc", 4))
2683 info_locals_command (NULL
, from_tty
);
2684 else if (0 == strncasecmp (action_exp
, "$arg", 4))
2685 info_args_command (NULL
, from_tty
);
2688 std::string contents
;
2689 const char *exp
= action_exp
;
2690 if (next_comma
!= NULL
)
2692 size_t len
= next_comma
- action_exp
;
2693 contents
= std::string (action_exp
, len
);
2694 exp
= contents
.c_str ();
2697 gdb_printf ("%s = ", exp
);
2698 output_command (exp
, from_tty
);
2701 action_exp
= next_comma
;
2703 while (action_exp
&& *action_exp
== ',');
2709 /* Return bp_location of the tracepoint associated with the current
2710 traceframe. Set *STEPPING_FRAME_P to 1 if the current traceframe
2711 is a stepping traceframe. */
2713 struct bp_location
*
2714 get_traceframe_location (int *stepping_frame_p
)
2716 struct tracepoint
*t
;
2717 struct regcache
*regcache
;
2719 if (tracepoint_number
== -1)
2720 error (_("No current trace frame."));
2722 t
= get_tracepoint (tracepoint_number
);
2725 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2728 /* The current frame is a trap frame if the frame PC is equal to the
2729 tracepoint PC. If not, then the current frame was collected
2730 during single-stepping. */
2731 regcache
= get_thread_regcache (inferior_thread ());
2733 /* If the traceframe's address matches any of the tracepoint's
2734 locations, assume it is a direct hit rather than a while-stepping
2735 frame. (FIXME this is not reliable, should record each frame's
2737 for (bp_location
&tloc
: t
->locations ())
2738 if (tloc
.address
== regcache_read_pc (regcache
))
2740 *stepping_frame_p
= 0;
2744 /* If this is a stepping frame, we don't know which location
2745 triggered. The first is as good (or bad) a guess as any... */
2746 *stepping_frame_p
= 1;
2747 return &t
->first_loc ();
2750 /* Return the default collect actions of a tracepoint T. */
2752 static counted_command_line
2753 all_tracepoint_actions (tracepoint
*t
)
2755 counted_command_line
actions (nullptr, command_lines_deleter ());
2757 /* If there are default expressions to collect, make up a collect
2758 action and prepend to the action list to encode. Note that since
2759 validation is per-tracepoint (local var "xyz" might be valid for
2760 one tracepoint and not another, etc), we make up the action on
2761 the fly, and don't cache it. */
2762 if (!default_collect
.empty ())
2764 gdb::unique_xmalloc_ptr
<char> default_collect_line
2765 = xstrprintf ("collect %s", default_collect
.c_str ());
2767 validate_actionline (default_collect_line
.get (), t
);
2768 actions
.reset (new struct command_line (simple_control
,
2769 default_collect_line
.release ()),
2770 command_lines_deleter ());
2776 /* The tdump command. */
2779 tdump_command (const char *args
, int from_tty
)
2781 int stepping_frame
= 0;
2782 struct bp_location
*loc
;
2784 /* This throws an error is not inspecting a trace frame. */
2785 loc
= get_traceframe_location (&stepping_frame
);
2787 gdb_printf ("Data collected at tracepoint %d, trace frame %d:\n",
2788 tracepoint_number
, traceframe_number
);
2790 /* This command only makes sense for the current frame, not the
2792 scoped_restore_current_thread restore_thread
;
2794 select_frame (get_current_frame ());
2796 tracepoint
*t
= gdb::checked_static_cast
<tracepoint
*> (loc
->owner
);
2797 counted_command_line actions
= all_tracepoint_actions (t
);
2799 trace_dump_actions (actions
.get (), 0, stepping_frame
, from_tty
);
2800 trace_dump_actions (breakpoint_commands (loc
->owner
), 0, stepping_frame
,
2804 /* Encode a piece of a tracepoint's source-level definition in a form
2805 that is suitable for both protocol and saving in files. */
2806 /* This version does not do multiple encodes for long strings; it should
2807 return an offset to the next piece to encode. FIXME */
2810 encode_source_string (int tpnum
, ULONGEST addr
,
2811 const char *srctype
, const char *src
,
2812 char *buf
, int buf_size
)
2814 if (80 + strlen (srctype
) > buf_size
)
2815 error (_("Buffer too small for source encoding"));
2816 sprintf (buf
, "%x:%s:%s:%x:%x:",
2817 tpnum
, phex_nz (addr
, sizeof (addr
)),
2818 srctype
, 0, (int) strlen (src
));
2819 if (strlen (buf
) + strlen (src
) * 2 >= buf_size
)
2820 error (_("Source string too long for buffer"));
2821 bin2hex ((gdb_byte
*) src
, buf
+ strlen (buf
), strlen (src
));
2825 /* Tell the target what to do with an ongoing tracing run if GDB
2826 disconnects for some reason. */
2829 set_disconnected_tracing (const char *args
, int from_tty
,
2830 struct cmd_list_element
*c
)
2832 target_set_disconnected_tracing (disconnected_tracing
);
2836 set_circular_trace_buffer (const char *args
, int from_tty
,
2837 struct cmd_list_element
*c
)
2839 target_set_circular_trace_buffer (circular_trace_buffer
);
2843 set_trace_buffer_size (const char *args
, int from_tty
,
2844 struct cmd_list_element
*c
)
2846 target_set_trace_buffer_size (trace_buffer_size
);
2850 set_trace_user (const char *args
, int from_tty
,
2851 struct cmd_list_element
*c
)
2855 ret
= target_set_trace_notes (trace_user
.c_str (), NULL
, NULL
);
2858 warning (_("Target does not support trace notes, user ignored"));
2862 set_trace_notes (const char *args
, int from_tty
,
2863 struct cmd_list_element
*c
)
2867 ret
= target_set_trace_notes (NULL
, trace_notes
.c_str (), NULL
);
2870 warning (_("Target does not support trace notes, note ignored"));
2874 set_trace_stop_notes (const char *args
, int from_tty
,
2875 struct cmd_list_element
*c
)
2879 ret
= target_set_trace_notes (NULL
, NULL
, trace_stop_notes
.c_str ());
2882 warning (_("Target does not support trace notes, stop note ignored"));
2886 get_traceframe_number (void)
2888 return traceframe_number
;
2892 get_tracepoint_number (void)
2894 return tracepoint_number
;
2897 /* Make the traceframe NUM be the current trace frame. Does nothing
2898 if NUM is already current. */
2901 set_current_traceframe (int num
)
2905 if (traceframe_number
== num
)
2907 /* Nothing to do. */
2911 newnum
= target_trace_find (tfind_number
, num
, 0, 0, NULL
);
2914 warning (_("could not change traceframe"));
2916 set_traceframe_num (newnum
);
2918 /* Changing the traceframe changes our view of registers and of the
2920 registers_changed ();
2922 clear_traceframe_info ();
2925 scoped_restore_current_traceframe::scoped_restore_current_traceframe ()
2926 : m_traceframe_number (traceframe_number
)
2929 /* Given a number and address, return an uploaded tracepoint with that
2930 number, creating if necessary. */
2932 struct uploaded_tp
*
2933 get_uploaded_tp (int num
, ULONGEST addr
, struct uploaded_tp
**utpp
)
2935 struct uploaded_tp
*utp
;
2937 for (utp
= *utpp
; utp
; utp
= utp
->next
)
2938 if (utp
->number
== num
&& utp
->addr
== addr
)
2941 utp
= new uploaded_tp
;
2951 free_uploaded_tps (struct uploaded_tp
**utpp
)
2953 struct uploaded_tp
*next_one
;
2957 next_one
= (*utpp
)->next
;
2963 /* Given a number and address, return an uploaded tracepoint with that
2964 number, creating if necessary. */
2966 struct uploaded_tsv
*
2967 get_uploaded_tsv (int num
, struct uploaded_tsv
**utsvp
)
2969 struct uploaded_tsv
*utsv
;
2971 for (utsv
= *utsvp
; utsv
; utsv
= utsv
->next
)
2972 if (utsv
->number
== num
)
2975 utsv
= XCNEW (struct uploaded_tsv
);
2977 utsv
->next
= *utsvp
;
2984 free_uploaded_tsvs (struct uploaded_tsv
**utsvp
)
2986 struct uploaded_tsv
*next_one
;
2990 next_one
= (*utsvp
)->next
;
2996 /* FIXME this function is heuristic and will miss the cases where the
2997 conditional is semantically identical but differs in whitespace,
2998 such as "x == 0" vs "x==0". */
3001 cond_string_is_same (char *str1
, char *str2
)
3003 if (str1
== NULL
|| str2
== NULL
)
3004 return (str1
== str2
);
3006 return (strcmp (str1
, str2
) == 0);
3009 /* Look for an existing tracepoint that seems similar enough to the
3010 uploaded one. Enablement isn't compared, because the user can
3011 toggle that freely, and may have done so in anticipation of the
3012 next trace run. Return the location of matched tracepoint. */
3014 static struct bp_location
*
3015 find_matching_tracepoint_location (struct uploaded_tp
*utp
)
3017 for (breakpoint
&b
: all_tracepoints ())
3019 tracepoint
&t
= gdb::checked_static_cast
<tracepoint
&> (b
);
3021 if (b
.type
== utp
->type
3022 && t
.step_count
== utp
->step
3023 && t
.pass_count
== utp
->pass
3024 && cond_string_is_same (t
.cond_string
.get (),
3025 utp
->cond_string
.get ())
3026 /* FIXME also test actions. */
3029 /* Scan the locations for an address match. */
3030 for (bp_location
&loc
: b
.locations ())
3031 if (loc
.address
== utp
->addr
)
3038 /* Given a list of tracepoints uploaded from a target, attempt to
3039 match them up with existing tracepoints, and create new ones if not
3043 merge_uploaded_tracepoints (struct uploaded_tp
**uploaded_tps
)
3045 struct uploaded_tp
*utp
;
3046 /* A set of tracepoints which are modified. */
3047 std::vector
<breakpoint
*> modified_tp
;
3049 /* Look for GDB tracepoints that match up with our uploaded versions. */
3050 for (utp
= *uploaded_tps
; utp
; utp
= utp
->next
)
3052 struct bp_location
*loc
;
3053 struct tracepoint
*t
;
3055 loc
= find_matching_tracepoint_location (utp
);
3060 /* Mark this location as already inserted. */
3062 t
= gdb::checked_static_cast
<tracepoint
*> (loc
->owner
);
3063 gdb_printf (_("Assuming tracepoint %d is same "
3064 "as target's tracepoint %d at %s.\n"),
3065 loc
->owner
->number
, utp
->number
,
3066 paddress (loc
->gdbarch
, utp
->addr
));
3068 /* The tracepoint LOC->owner was modified (the location LOC
3069 was marked as inserted in the target). Save it in
3070 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3071 observers will be notified later once for each tracepoint
3072 saved in MODIFIED_TP. */
3073 for (breakpoint
*b
: modified_tp
)
3074 if (b
== loc
->owner
)
3080 modified_tp
.push_back (loc
->owner
);
3084 t
= create_tracepoint_from_upload (utp
);
3086 gdb_printf (_("Created tracepoint %d for "
3087 "target's tracepoint %d at %s.\n"),
3088 t
->number
, utp
->number
,
3089 paddress (get_current_arch (), utp
->addr
));
3091 gdb_printf (_("Failed to create tracepoint for target's "
3092 "tracepoint %d at %s, skipping it.\n"),
3094 paddress (get_current_arch (), utp
->addr
));
3096 /* Whether found or created, record the number used by the
3097 target, to help with mapping target tracepoints back to their
3098 counterparts here. */
3100 t
->number_on_target
= utp
->number
;
3103 /* Notify 'breakpoint-modified' observer that at least one of B's
3104 locations was changed. */
3105 for (breakpoint
*b
: modified_tp
)
3106 notify_breakpoint_modified (b
);
3108 free_uploaded_tps (uploaded_tps
);
3111 /* Trace state variables don't have much to identify them beyond their
3112 name, so just use that to detect matches. */
3114 static struct trace_state_variable
*
3115 find_matching_tsv (struct uploaded_tsv
*utsv
)
3120 return find_trace_state_variable (utsv
->name
);
3123 static struct trace_state_variable
*
3124 create_tsv_from_upload (struct uploaded_tsv
*utsv
)
3126 const char *namebase
;
3129 struct trace_state_variable
*tsv
;
3133 namebase
= utsv
->name
;
3139 buf
= string_printf ("%s_%d", namebase
, try_num
++);
3142 /* Fish for a name that is not in use. */
3143 /* (should check against all internal vars?) */
3144 while (find_trace_state_variable (buf
.c_str ()))
3145 buf
= string_printf ("%s_%d", namebase
, try_num
++);
3147 /* We have an available name, create the variable. */
3148 tsv
= create_trace_state_variable (buf
.c_str ());
3149 tsv
->initial_value
= utsv
->initial_value
;
3150 tsv
->builtin
= utsv
->builtin
;
3152 interps_notify_tsv_created (tsv
);
3157 /* Given a list of uploaded trace state variables, try to match them
3158 up with existing variables, or create additional ones. */
3161 merge_uploaded_trace_state_variables (struct uploaded_tsv
**uploaded_tsvs
)
3163 struct uploaded_tsv
*utsv
;
3166 /* Most likely some numbers will have to be reassigned as part of
3167 the merge, so clear them all in anticipation. */
3168 for (trace_state_variable
&tsv
: tvariables
)
3171 for (utsv
= *uploaded_tsvs
; utsv
; utsv
= utsv
->next
)
3173 struct trace_state_variable
*tsv
= find_matching_tsv (utsv
);
3177 gdb_printf (_("Assuming trace state variable $%s "
3178 "is same as target's variable %d.\n"),
3179 tsv
->name
.c_str (), utsv
->number
);
3183 tsv
= create_tsv_from_upload (utsv
);
3185 gdb_printf (_("Created trace state variable "
3186 "$%s for target's variable %d.\n"),
3187 tsv
->name
.c_str (), utsv
->number
);
3189 /* Give precedence to numberings that come from the target. */
3191 tsv
->number
= utsv
->number
;
3194 /* Renumber everything that didn't get a target-assigned number. */
3196 for (const trace_state_variable
&tsv
: tvariables
)
3197 highest
= std::max (tsv
.number
, highest
);
3200 for (trace_state_variable
&tsv
: tvariables
)
3201 if (tsv
.number
== 0)
3202 tsv
.number
= highest
++;
3204 free_uploaded_tsvs (uploaded_tsvs
);
3207 /* Parse the part of trace status syntax that is shared between
3208 the remote protocol and the trace file reader. */
3211 parse_trace_status (const char *line
, struct trace_status
*ts
)
3213 const char *p
= line
, *p1
, *p2
, *p3
, *p_temp
;
3217 ts
->running_known
= 1;
3218 ts
->running
= (*p
++ == '1');
3219 ts
->stop_reason
= trace_stop_reason_unknown
;
3220 xfree (ts
->stop_desc
);
3221 ts
->stop_desc
= NULL
;
3222 ts
->traceframe_count
= -1;
3223 ts
->traceframes_created
= -1;
3224 ts
->buffer_free
= -1;
3225 ts
->buffer_size
= -1;
3226 ts
->disconnected_tracing
= 0;
3227 ts
->circular_buffer
= 0;
3228 xfree (ts
->user_name
);
3229 ts
->user_name
= NULL
;
3232 ts
->start_time
= ts
->stop_time
= 0;
3236 p1
= strchr (p
, ':');
3238 error (_("Malformed trace status, at %s\n\
3239 Status line: '%s'\n"), p
, line
);
3240 p3
= strchr (p
, ';');
3242 p3
= p
+ strlen (p
);
3243 if (strncmp (p
, stop_reason_names
[trace_buffer_full
], p1
- p
) == 0)
3245 p
= unpack_varlen_hex (++p1
, &val
);
3246 ts
->stop_reason
= trace_buffer_full
;
3248 else if (strncmp (p
, stop_reason_names
[trace_never_run
], p1
- p
) == 0)
3250 p
= unpack_varlen_hex (++p1
, &val
);
3251 ts
->stop_reason
= trace_never_run
;
3253 else if (strncmp (p
, stop_reason_names
[tracepoint_passcount
],
3256 p
= unpack_varlen_hex (++p1
, &val
);
3257 ts
->stop_reason
= tracepoint_passcount
;
3258 ts
->stopping_tracepoint
= val
;
3260 else if (strncmp (p
, stop_reason_names
[trace_stop_command
], p1
- p
) == 0)
3262 p2
= strchr (++p1
, ':');
3270 ts
->stop_desc
= (char *) xmalloc (strlen (line
));
3271 end
= hex2bin (p1
, (gdb_byte
*) ts
->stop_desc
, (p2
- p1
) / 2);
3272 ts
->stop_desc
[end
] = '\0';
3275 ts
->stop_desc
= xstrdup ("");
3277 p
= unpack_varlen_hex (++p2
, &val
);
3278 ts
->stop_reason
= trace_stop_command
;
3280 else if (strncmp (p
, stop_reason_names
[trace_disconnected
], p1
- p
) == 0)
3282 p
= unpack_varlen_hex (++p1
, &val
);
3283 ts
->stop_reason
= trace_disconnected
;
3285 else if (strncmp (p
, stop_reason_names
[tracepoint_error
], p1
- p
) == 0)
3287 p2
= strchr (++p1
, ':');
3290 ts
->stop_desc
= (char *) xmalloc ((p2
- p1
) / 2 + 1);
3291 end
= hex2bin (p1
, (gdb_byte
*) ts
->stop_desc
, (p2
- p1
) / 2);
3292 ts
->stop_desc
[end
] = '\0';
3295 ts
->stop_desc
= xstrdup ("");
3297 p
= unpack_varlen_hex (++p2
, &val
);
3298 ts
->stopping_tracepoint
= val
;
3299 ts
->stop_reason
= tracepoint_error
;
3301 else if (strncmp (p
, "tframes", p1
- p
) == 0)
3303 p
= unpack_varlen_hex (++p1
, &val
);
3304 ts
->traceframe_count
= val
;
3306 else if (strncmp (p
, "tcreated", p1
- p
) == 0)
3308 p
= unpack_varlen_hex (++p1
, &val
);
3309 ts
->traceframes_created
= val
;
3311 else if (strncmp (p
, "tfree", p1
- p
) == 0)
3313 p
= unpack_varlen_hex (++p1
, &val
);
3314 ts
->buffer_free
= val
;
3316 else if (strncmp (p
, "tsize", p1
- p
) == 0)
3318 p
= unpack_varlen_hex (++p1
, &val
);
3319 ts
->buffer_size
= val
;
3321 else if (strncmp (p
, "disconn", p1
- p
) == 0)
3323 p
= unpack_varlen_hex (++p1
, &val
);
3324 ts
->disconnected_tracing
= val
;
3326 else if (strncmp (p
, "circular", p1
- p
) == 0)
3328 p
= unpack_varlen_hex (++p1
, &val
);
3329 ts
->circular_buffer
= val
;
3331 else if (strncmp (p
, "starttime", p1
- p
) == 0)
3333 p
= unpack_varlen_hex (++p1
, &val
);
3334 ts
->start_time
= val
;
3336 else if (strncmp (p
, "stoptime", p1
- p
) == 0)
3338 p
= unpack_varlen_hex (++p1
, &val
);
3339 ts
->stop_time
= val
;
3341 else if (strncmp (p
, "username", p1
- p
) == 0)
3344 ts
->user_name
= (char *) xmalloc (strlen (p
) / 2);
3345 end
= hex2bin (p1
, (gdb_byte
*) ts
->user_name
, (p3
- p1
) / 2);
3346 ts
->user_name
[end
] = '\0';
3349 else if (strncmp (p
, "notes", p1
- p
) == 0)
3352 ts
->notes
= (char *) xmalloc (strlen (p
) / 2);
3353 end
= hex2bin (p1
, (gdb_byte
*) ts
->notes
, (p3
- p1
) / 2);
3354 ts
->notes
[end
] = '\0';
3359 /* Silently skip unknown optional info. */
3360 p_temp
= strchr (p1
+ 1, ';');
3364 /* Must be at the end. */
3371 parse_tracepoint_status (const char *p
, tracepoint
*tp
,
3372 struct uploaded_tp
*utp
)
3376 p
= unpack_varlen_hex (p
, &uval
);
3378 tp
->hit_count
+= uval
;
3380 utp
->hit_count
+= uval
;
3381 p
= unpack_varlen_hex (p
+ 1, &uval
);
3383 tp
->traceframe_usage
+= uval
;
3385 utp
->traceframe_usage
+= uval
;
3386 /* Ignore any extra, allowing for future extensions. */
3389 /* Given a line of text defining a part of a tracepoint, parse it into
3390 an "uploaded tracepoint". */
3393 parse_tracepoint_definition (const char *line
, struct uploaded_tp
**utpp
)
3397 ULONGEST num
, addr
, step
, pass
, orig_size
, xlen
, start
;
3400 const char *srctype
;
3402 struct uploaded_tp
*utp
= NULL
;
3405 /* Both tracepoint and action definitions start with the same number
3406 and address sequence. */
3408 p
= unpack_varlen_hex (p
, &num
);
3409 p
++; /* skip a colon */
3410 p
= unpack_varlen_hex (p
, &addr
);
3411 p
++; /* skip a colon */
3414 gdb::unique_xmalloc_ptr
<char[]> cond
;
3416 enabled
= (*p
++ == 'E');
3417 p
++; /* skip a colon */
3418 p
= unpack_varlen_hex (p
, &step
);
3419 p
++; /* skip a colon */
3420 p
= unpack_varlen_hex (p
, &pass
);
3421 type
= bp_tracepoint
;
3422 /* Thumb through optional fields. */
3425 p
++; /* skip a colon */
3428 type
= bp_fast_tracepoint
;
3430 p
= unpack_varlen_hex (p
, &orig_size
);
3434 type
= bp_static_tracepoint
;
3440 p
= unpack_varlen_hex (p
, &xlen
);
3441 p
++; /* skip a comma */
3442 cond
.reset ((char *) xmalloc (2 * xlen
+ 1));
3443 strncpy (&cond
[0], p
, 2 * xlen
);
3444 cond
[2 * xlen
] = '\0';
3448 warning (_("Unrecognized char '%c' in tracepoint "
3449 "definition, skipping rest"), *p
);
3451 utp
= get_uploaded_tp (num
, addr
, utpp
);
3453 utp
->enabled
= enabled
;
3456 utp
->cond
= std::move (cond
);
3458 else if (piece
== 'A')
3460 utp
= get_uploaded_tp (num
, addr
, utpp
);
3461 utp
->actions
.emplace_back (xstrdup (p
));
3463 else if (piece
== 'S')
3465 utp
= get_uploaded_tp (num
, addr
, utpp
);
3466 utp
->step_actions
.emplace_back (xstrdup (p
));
3468 else if (piece
== 'Z')
3470 /* Parse a chunk of source form definition. */
3471 utp
= get_uploaded_tp (num
, addr
, utpp
);
3473 p
= strchr (p
, ':');
3474 p
++; /* skip a colon */
3475 p
= unpack_varlen_hex (p
, &start
);
3476 p
++; /* skip a colon */
3477 p
= unpack_varlen_hex (p
, &xlen
);
3478 p
++; /* skip a colon */
3480 buf
= (char *) alloca (strlen (line
));
3482 end
= hex2bin (p
, (gdb_byte
*) buf
, strlen (p
) / 2);
3485 if (startswith (srctype
, "at:"))
3486 utp
->at_string
.reset (xstrdup (buf
));
3487 else if (startswith (srctype
, "cond:"))
3488 utp
->cond_string
.reset (xstrdup (buf
));
3489 else if (startswith (srctype
, "cmd:"))
3490 utp
->cmd_strings
.emplace_back (xstrdup (buf
));
3492 else if (piece
== 'V')
3494 utp
= get_uploaded_tp (num
, addr
, utpp
);
3496 parse_tracepoint_status (p
, NULL
, utp
);
3500 /* Don't error out, the target might be sending us optional
3501 info that we don't care about. */
3502 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece
);
3506 /* Convert a textual description of a trace state variable into an
3510 parse_tsv_definition (const char *line
, struct uploaded_tsv
**utsvp
)
3514 ULONGEST num
, initval
, builtin
;
3516 struct uploaded_tsv
*utsv
= NULL
;
3518 buf
= (char *) alloca (strlen (line
));
3521 p
= unpack_varlen_hex (p
, &num
);
3522 p
++; /* skip a colon */
3523 p
= unpack_varlen_hex (p
, &initval
);
3524 p
++; /* skip a colon */
3525 p
= unpack_varlen_hex (p
, &builtin
);
3526 p
++; /* skip a colon */
3527 end
= hex2bin (p
, (gdb_byte
*) buf
, strlen (p
) / 2);
3530 utsv
= get_uploaded_tsv (num
, utsvp
);
3531 utsv
->initial_value
= initval
;
3532 utsv
->builtin
= builtin
;
3533 utsv
->name
= xstrdup (buf
);
3536 /* Given a line of text defining a static tracepoint marker, parse it
3537 into a "static tracepoint marker" object. Throws an error is
3538 parsing fails. If PP is non-null, it points to one past the end of
3539 the parsed marker definition. */
3542 parse_static_tracepoint_marker_definition (const char *line
, const char **pp
,
3543 static_tracepoint_marker
*marker
)
3545 const char *p
, *endp
;
3549 p
= unpack_varlen_hex (p
, &addr
);
3550 p
++; /* skip a colon */
3552 marker
->gdbarch
= current_inferior ()->arch ();
3553 marker
->address
= (CORE_ADDR
) addr
;
3555 endp
= strchr (p
, ':');
3557 error (_("bad marker definition: %s"), line
);
3559 marker
->str_id
= hex2str (p
, (endp
- p
) / 2);
3562 p
++; /* skip a colon */
3564 /* This definition may be followed by another one, separated by a comma. */
3566 endp
= strchr (p
, ',');
3567 if (endp
!= nullptr)
3570 hex_len
= strlen (p
);
3572 marker
->extra
= hex2str (p
, hex_len
/ 2);
3578 /* Print MARKER to gdb_stdout. */
3581 print_one_static_tracepoint_marker (int count
,
3582 const static_tracepoint_marker
&marker
)
3586 struct ui_out
*uiout
= current_uiout
;
3588 symtab_and_line sal
;
3589 sal
.pc
= marker
.address
;
3591 std::vector
<breakpoint
*> tracepoints
3592 = static_tracepoints_here (marker
.address
);
3594 ui_out_emit_tuple
tuple_emitter (uiout
, "marker");
3596 /* A counter field to help readability. This is not a stable
3598 uiout
->field_signed ("count", count
);
3600 uiout
->field_string ("marker-id", marker
.str_id
);
3602 uiout
->field_fmt ("enabled", "%c",
3603 !tracepoints
.empty () ? 'y' : 'n');
3606 int wrap_indent
= 35;
3607 if (gdbarch_addr_bit (marker
.gdbarch
) <= 32)
3612 const char *extra_field_indent
= " ";
3614 uiout
->field_core_addr ("addr", marker
.gdbarch
, marker
.address
);
3616 sal
= find_pc_line (marker
.address
, 0);
3617 sym
= find_pc_sect_function (marker
.address
, NULL
);
3620 uiout
->text ("in ");
3621 uiout
->field_string ("func", sym
->print_name (),
3622 function_name_style
.style ());
3623 uiout
->wrap_hint (wrap_indent
);
3624 uiout
->text (" at ");
3627 uiout
->field_skip ("func");
3629 if (sal
.symtab
!= NULL
)
3631 uiout
->field_string ("file",
3632 symtab_to_filename_for_display (sal
.symtab
),
3633 file_name_style
.style ());
3636 if (uiout
->is_mi_like_p ())
3638 const char *fullname
= symtab_to_fullname (sal
.symtab
);
3640 uiout
->field_string ("fullname", fullname
);
3643 uiout
->field_skip ("fullname");
3645 uiout
->field_signed ("line", sal
.line
);
3649 uiout
->field_skip ("fullname");
3650 uiout
->field_skip ("line");
3654 uiout
->text (extra_field_indent
);
3655 uiout
->text (_("Data: \""));
3656 uiout
->field_string ("extra-data", marker
.extra
);
3657 uiout
->text ("\"\n");
3659 if (!tracepoints
.empty ())
3664 ui_out_emit_tuple
inner_tuple_emitter (uiout
, "tracepoints-at");
3666 uiout
->text (extra_field_indent
);
3667 uiout
->text (_("Probed by static tracepoints: "));
3668 for (ix
= 0; ix
< tracepoints
.size (); ix
++)
3673 uiout
->field_signed ("tracepoint-id", tracepoints
[ix
]->number
);
3677 if (uiout
->is_mi_like_p ())
3678 uiout
->field_signed ("number-of-tracepoints", tracepoints
.size ());
3685 info_static_tracepoint_markers_command (const char *arg
, int from_tty
)
3687 struct ui_out
*uiout
= current_uiout
;
3688 std::vector
<static_tracepoint_marker
> markers
3689 = target_static_tracepoint_markers_by_strid (NULL
);
3691 /* We don't have to check target_can_use_agent and agent's capability on
3692 static tracepoint here, in order to be compatible with older GDBserver.
3693 We don't check USE_AGENT is true or not, because static tracepoints
3694 don't work without in-process agent, so we don't bother users to type
3695 `set agent on' when to use static tracepoint. */
3697 ui_out_emit_table
table_emitter (uiout
, 5, -1,
3698 "StaticTracepointMarkersTable");
3700 uiout
->table_header (7, ui_left
, "counter", "Cnt");
3702 uiout
->table_header (40, ui_left
, "marker-id", "ID");
3704 uiout
->table_header (3, ui_left
, "enabled", "Enb");
3705 if (gdbarch_addr_bit (current_inferior ()->arch ()) <= 32)
3706 uiout
->table_header (10, ui_left
, "addr", "Address");
3708 uiout
->table_header (18, ui_left
, "addr", "Address");
3709 uiout
->table_header (40, ui_noalign
, "what", "What");
3711 uiout
->table_body ();
3713 for (int i
= 0; i
< markers
.size (); i
++)
3714 print_one_static_tracepoint_marker (i
+ 1, markers
[i
]);
3717 /* The $_sdata convenience variable is a bit special. We don't know
3718 for sure type of the value until we actually have a chance to fetch
3719 the data --- the size of the object depends on what has been
3720 collected. We solve this by making $_sdata be an internalvar that
3721 creates a new value on access. */
3723 /* Return a new value with the correct type for the sdata object of
3724 the current trace frame. Return a void value if there's no object
3727 static struct value
*
3728 sdata_make_value (struct gdbarch
*gdbarch
, struct internalvar
*var
,
3731 /* We need to read the whole object before we know its size. */
3732 std::optional
<gdb::byte_vector
> buf
3733 = target_read_alloc (current_inferior ()->top_target (),
3734 TARGET_OBJECT_STATIC_TRACE_DATA
,
3741 type
= init_vector_type (builtin_type (gdbarch
)->builtin_true_char
,
3743 v
= value::allocate (type
);
3744 memcpy (v
->contents_raw ().data (), buf
->data (), buf
->size ());
3748 return value::allocate (builtin_type (gdbarch
)->builtin_void
);
3751 #if !defined(HAVE_LIBEXPAT)
3753 struct std::unique_ptr
<traceframe_info
>
3754 parse_traceframe_info (const char *tframe_info
)
3756 static int have_warned
;
3761 warning (_("Can not parse XML trace frame info; XML support "
3762 "was disabled at compile time"));
3768 #else /* HAVE_LIBEXPAT */
3770 #include "xml-support.h"
3772 /* Handle the start of a <memory> element. */
3775 traceframe_info_start_memory (struct gdb_xml_parser
*parser
,
3776 const struct gdb_xml_element
*element
,
3778 std::vector
<gdb_xml_value
> &attributes
)
3780 struct traceframe_info
*info
= (struct traceframe_info
*) user_data
;
3781 ULONGEST
*start_p
, *length_p
;
3784 = (ULONGEST
*) xml_find_attribute (attributes
, "start")->value
.get ();
3786 = (ULONGEST
*) xml_find_attribute (attributes
, "length")->value
.get ();
3788 info
->memory
.emplace_back (*start_p
, *length_p
);
3791 /* Handle the start of a <tvar> element. */
3794 traceframe_info_start_tvar (struct gdb_xml_parser
*parser
,
3795 const struct gdb_xml_element
*element
,
3797 std::vector
<gdb_xml_value
> &attributes
)
3799 struct traceframe_info
*info
= (struct traceframe_info
*) user_data
;
3800 const char *id_attrib
3801 = (const char *) xml_find_attribute (attributes
, "id")->value
.get ();
3802 int id
= gdb_xml_parse_ulongest (parser
, id_attrib
);
3804 info
->tvars
.push_back (id
);
3807 /* The allowed elements and attributes for an XML memory map. */
3809 static const struct gdb_xml_attribute memory_attributes
[] = {
3810 { "start", GDB_XML_AF_NONE
, gdb_xml_parse_attr_ulongest
, NULL
},
3811 { "length", GDB_XML_AF_NONE
, gdb_xml_parse_attr_ulongest
, NULL
},
3812 { NULL
, GDB_XML_AF_NONE
, NULL
, NULL
}
3815 static const struct gdb_xml_attribute tvar_attributes
[] = {
3816 { "id", GDB_XML_AF_NONE
, NULL
, NULL
},
3817 { NULL
, GDB_XML_AF_NONE
, NULL
, NULL
}
3820 static const struct gdb_xml_element traceframe_info_children
[] = {
3821 { "memory", memory_attributes
, NULL
,
3822 GDB_XML_EF_REPEATABLE
| GDB_XML_EF_OPTIONAL
,
3823 traceframe_info_start_memory
, NULL
},
3824 { "tvar", tvar_attributes
, NULL
,
3825 GDB_XML_EF_REPEATABLE
| GDB_XML_EF_OPTIONAL
,
3826 traceframe_info_start_tvar
, NULL
},
3827 { NULL
, NULL
, NULL
, GDB_XML_EF_NONE
, NULL
, NULL
}
3830 static const struct gdb_xml_element traceframe_info_elements
[] = {
3831 { "traceframe-info", NULL
, traceframe_info_children
, GDB_XML_EF_NONE
,
3833 { NULL
, NULL
, NULL
, GDB_XML_EF_NONE
, NULL
, NULL
}
3836 /* Parse a traceframe-info XML document. */
3839 parse_traceframe_info (const char *tframe_info
)
3841 traceframe_info_up
result (new traceframe_info
);
3843 if (gdb_xml_parse_quick (_("trace frame info"),
3844 "traceframe-info.dtd", traceframe_info_elements
,
3845 tframe_info
, result
.get ()) == 0)
3851 #endif /* HAVE_LIBEXPAT */
3853 /* Returns the traceframe_info object for the current traceframe.
3854 This is where we avoid re-fetching the object from the target if we
3855 already have it cached. */
3857 struct traceframe_info
*
3858 get_traceframe_info (void)
3860 if (current_traceframe_info
== NULL
)
3861 current_traceframe_info
= target_traceframe_info ();
3863 return current_traceframe_info
.get ();
3866 /* If the target supports the query, return in RESULT the set of
3867 collected memory in the current traceframe, found within the LEN
3868 bytes range starting at MEMADDR. Returns true if the target
3869 supports the query, otherwise returns false, and RESULT is left
3873 traceframe_available_memory (std::vector
<mem_range
> *result
,
3874 CORE_ADDR memaddr
, ULONGEST len
)
3876 struct traceframe_info
*info
= get_traceframe_info ();
3882 for (mem_range
&r
: info
->memory
)
3883 if (mem_ranges_overlap (r
.start
, r
.length
, memaddr
, len
))
3885 ULONGEST lo1
, hi1
, lo2
, hi2
;
3888 hi1
= memaddr
+ len
;
3891 hi2
= r
.start
+ r
.length
;
3893 CORE_ADDR start
= std::max (lo1
, lo2
);
3894 int length
= std::min (hi1
, hi2
) - start
;
3896 result
->emplace_back (start
, length
);
3899 normalize_mem_ranges (result
);
3906 /* Implementation of `sdata' variable. */
3908 static const struct internalvar_funcs sdata_funcs
=
3914 /* See tracepoint.h. */
3915 cmd_list_element
*while_stepping_cmd_element
= nullptr;
3917 /* module initialization */
3918 void _initialize_tracepoint ();
3920 _initialize_tracepoint ()
3922 struct cmd_list_element
*c
;
3924 /* Explicitly create without lookup, since that tries to create a
3925 value with a void typed value, and when we get here, gdbarch
3926 isn't initialized yet. At this point, we're quite sure there
3927 isn't another convenience variable of the same name. */
3928 create_internalvar_type_lazy ("_sdata", &sdata_funcs
, NULL
);
3930 traceframe_number
= -1;
3931 tracepoint_number
= -1;
3933 add_info ("scope", info_scope_command
,
3934 _("List the variables local to a scope."));
3936 add_cmd ("tracepoints", class_trace
,
3937 _("Tracing of program execution without stopping the program."),
3940 add_com ("tdump", class_trace
, tdump_command
,
3941 _("Print everything collected at the current tracepoint."));
3943 c
= add_com ("tvariable", class_trace
, trace_variable_command
,_("\
3944 Define a trace state variable.\n\
3945 Argument is a $-prefixed name, optionally followed\n\
3946 by '=' and an expression that sets the initial value\n\
3947 at the start of tracing."));
3948 set_cmd_completer (c
, expression_completer
);
3950 add_cmd ("tvariable", class_trace
, delete_trace_variable_command
, _("\
3951 Delete one or more trace state variables.\n\
3952 Arguments are the names of the variables to delete.\n\
3953 If no arguments are supplied, delete all variables."), &deletelist
);
3954 /* FIXME add a trace variable completer. */
3956 add_info ("tvariables", info_tvariables_command
, _("\
3957 Status of trace state variables and their values."));
3959 add_info ("static-tracepoint-markers",
3960 info_static_tracepoint_markers_command
, _("\
3961 List target static tracepoints markers."));
3963 add_prefix_cmd ("tfind", class_trace
, tfind_command
, _("\
3964 Select a trace frame.\n\
3965 No argument means forward by one frame; '-' means backward by one frame."),
3966 &tfindlist
, 1, &cmdlist
);
3968 add_cmd ("outside", class_trace
, tfind_outside_command
, _("\
3969 Select a trace frame whose PC is outside the given range (exclusive).\n\
3970 Usage: tfind outside ADDR1, ADDR2"),
3973 add_cmd ("range", class_trace
, tfind_range_command
, _("\
3974 Select a trace frame whose PC is in the given range (inclusive).\n\
3975 Usage: tfind range ADDR1, ADDR2"),
3978 add_cmd ("line", class_trace
, tfind_line_command
, _("\
3979 Select a trace frame by source line.\n\
3980 Argument can be a line number (with optional source file),\n\
3981 a function name, or '*' followed by an address.\n\
3982 Default argument is 'the next source line that was traced'."),
3985 add_cmd ("tracepoint", class_trace
, tfind_tracepoint_command
, _("\
3986 Select a trace frame by tracepoint number.\n\
3987 Default is the tracepoint for the current trace frame."),
3990 add_cmd ("pc", class_trace
, tfind_pc_command
, _("\
3991 Select a trace frame by PC.\n\
3992 Default is the current PC, or the PC of the current trace frame."),
3995 cmd_list_element
*tfind_end_cmd
3996 = add_cmd ("end", class_trace
, tfind_end_command
, _("\
3997 De-select any trace frame and resume 'live' debugging."), &tfindlist
);
3999 add_alias_cmd ("none", tfind_end_cmd
, class_trace
, 0, &tfindlist
);
4001 add_cmd ("start", class_trace
, tfind_start_command
,
4002 _("Select the first trace frame in the trace buffer."),
4005 add_com ("tstatus", class_trace
, tstatus_command
,
4006 _("Display the status of the current trace data collection."));
4008 add_com ("tstop", class_trace
, tstop_command
, _("\
4009 Stop trace data collection.\n\
4010 Usage: tstop [NOTES]...\n\
4011 Any arguments supplied are recorded with the trace as a stop reason and\n\
4012 reported by tstatus (if the target supports trace notes)."));
4014 add_com ("tstart", class_trace
, tstart_command
, _("\
4015 Start trace data collection.\n\
4016 Usage: tstart [NOTES]...\n\
4017 Any arguments supplied are recorded with the trace as a note and\n\
4018 reported by tstatus (if the target supports trace notes)."));
4020 add_com ("end", class_trace
, end_actions_pseudocommand
, _("\
4021 Ends a list of commands or actions.\n\
4022 Several GDB commands allow you to enter a list of commands or actions.\n\
4023 Entering \"end\" on a line by itself is the normal way to terminate\n\
4025 Note: the \"end\" command cannot be used at the gdb prompt."));
4027 while_stepping_cmd_element
= add_com ("while-stepping", class_trace
,
4028 while_stepping_pseudocommand
, _("\
4029 Specify single-stepping behavior at a tracepoint.\n\
4030 Argument is number of instructions to trace in single-step mode\n\
4031 following the tracepoint. This command is normally followed by\n\
4032 one or more \"collect\" commands, to specify what to collect\n\
4033 while single-stepping.\n\n\
4034 Note: this command can only be used in a tracepoint \"actions\" list."));
4036 add_com_alias ("ws", while_stepping_cmd_element
, class_trace
, 0);
4037 add_com_alias ("stepping", while_stepping_cmd_element
, class_trace
, 0);
4039 add_com ("collect", class_trace
, collect_pseudocommand
, _("\
4040 Specify one or more data items to be collected at a tracepoint.\n\
4041 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4042 collect all data (variables, registers) referenced by that expression.\n\
4043 Also accepts the following special arguments:\n\
4044 $regs -- all registers.\n\
4045 $args -- all function arguments.\n\
4046 $locals -- all variables local to the block/function scope.\n\
4047 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4048 Note: this command can only be used in a tracepoint \"actions\" list."));
4050 add_com ("teval", class_trace
, teval_pseudocommand
, _("\
4051 Specify one or more expressions to be evaluated at a tracepoint.\n\
4052 Accepts a comma-separated list of (one or more) expressions.\n\
4053 The result of each evaluation will be discarded.\n\
4054 Note: this command can only be used in a tracepoint \"actions\" list."));
4056 add_com ("actions", class_trace
, actions_command
, _("\
4057 Specify the actions to be taken at a tracepoint.\n\
4058 Tracepoint actions may include collecting of specified data,\n\
4059 single-stepping, or enabling/disabling other tracepoints,\n\
4060 depending on target's capabilities."));
4062 add_setshow_string_cmd ("default-collect", class_trace
,
4063 &default_collect
, _("\
4064 Set the list of expressions to collect by default."), _("\
4065 Show the list of expressions to collect by default."), NULL
,
4067 &setlist
, &showlist
);
4069 add_setshow_boolean_cmd ("disconnected-tracing", no_class
,
4070 &disconnected_tracing
, _("\
4071 Set whether tracing continues after GDB disconnects."), _("\
4072 Show whether tracing continues after GDB disconnects."), _("\
4073 Use this to continue a tracing run even if GDB disconnects\n\
4074 or detaches from the target. You can reconnect later and look at\n\
4075 trace data collected in the meantime."),
4076 set_disconnected_tracing
,
4081 add_setshow_boolean_cmd ("circular-trace-buffer", no_class
,
4082 &circular_trace_buffer
, _("\
4083 Set target's use of circular trace buffer."), _("\
4084 Show target's use of circular trace buffer."), _("\
4085 Use this to make the trace buffer into a circular buffer,\n\
4086 which will discard traceframes (oldest first) instead of filling\n\
4087 up and stopping the trace run."),
4088 set_circular_trace_buffer
,
4093 add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class
,
4094 &trace_buffer_size
, _("\
4095 Set requested size of trace buffer."), _("\
4096 Show requested size of trace buffer."), _("\
4097 Use this to choose a size for the trace buffer. Some targets\n\
4098 may have fixed or limited buffer sizes. Specifying \"unlimited\" or -1\n\
4099 disables any attempt to set the buffer size and lets the target choose."),
4100 set_trace_buffer_size
, NULL
,
4101 &setlist
, &showlist
);
4103 add_setshow_string_cmd ("trace-user", class_trace
,
4105 Set the user name to use for current and future trace runs."), _("\
4106 Show the user name to use for current and future trace runs."), NULL
,
4107 set_trace_user
, NULL
,
4108 &setlist
, &showlist
);
4110 add_setshow_string_cmd ("trace-notes", class_trace
,
4112 Set notes string to use for current and future trace runs."), _("\
4113 Show the notes string to use for current and future trace runs."), NULL
,
4114 set_trace_notes
, NULL
,
4115 &setlist
, &showlist
);
4117 add_setshow_string_cmd ("trace-stop-notes", class_trace
,
4118 &trace_stop_notes
, _("\
4119 Set notes string to use for future tstop commands."), _("\
4120 Show the notes string to use for future tstop commands."), NULL
,
4121 set_trace_stop_notes
, NULL
,
4122 &setlist
, &showlist
);