1 /* Tracing functionality for remote targets in custom GDB protocol 2 3 Copyright (C) 1997-2024 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 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. 11 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. 16 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/>. */ 19 20 #include "arch-utils.h" 21 #include "event-top.h" 22 #include "symtab.h" 23 #include "frame.h" 24 #include "gdbtypes.h" 25 #include "expression.h" 26 #include "cli/cli-cmds.h" 27 #include "value.h" 28 #include "target.h" 29 #include "target-dcache.h" 30 #include "language.h" 31 #include "inferior.h" 32 #include "breakpoint.h" 33 #include "tracepoint.h" 34 #include "linespec.h" 35 #include "regcache.h" 36 #include "completer.h" 37 #include "block.h" 38 #include "dictionary.h" 39 #include "observable.h" 40 #include "user-regs.h" 41 #include "valprint.h" 42 #include "gdbcore.h" 43 #include "objfiles.h" 44 #include "filenames.h" 45 #include "gdbthread.h" 46 #include "stack.h" 47 #include "remote.h" 48 #include "source.h" 49 #include "ax.h" 50 #include "ax-gdb.h" 51 #include "memrange.h" 52 #include "cli/cli-utils.h" 53 #include "probe.h" 54 #include "gdbsupport/filestuff.h" 55 #include "gdbsupport/rsp-low.h" 56 #include "tracefile.h" 57 #include "location.h" 58 #include <algorithm> 59 #include "cli/cli-style.h" 60 #include "expop.h" 61 #include "gdbsupport/buildargv.h" 62 #include "interps.h" 63 64 #include <unistd.h> 65 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 70 continuation packet. 71 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 75 76 /* 77 Tracepoint.c: 78 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. 93 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. 99 */ 100 101 102 /* ======= Important global variables: ======= */ 103 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. */ 107 108 static std::vector<trace_state_variable> tvariables; 109 110 /* The next integer to assign to a variable. */ 111 112 static int next_tsv_number = 1; 113 114 /* Number of last traceframe collected. */ 115 static int traceframe_number; 116 117 /* Tracepoint for last traceframe collected. */ 118 static int tracepoint_number; 119 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 123 presently. */ 124 static traceframe_info_up current_traceframe_info; 125 126 /* Tracing command lists. */ 127 static struct cmd_list_element *tfindlist; 128 129 /* List of expressions to collect by default at each tracepoint hit. */ 130 std::string default_collect; 131 132 static bool disconnected_tracing; 133 134 /* This variable controls whether we ask the target for a linear or 135 circular trace buffer. */ 136 137 static bool circular_trace_buffer; 138 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. */ 141 142 static int trace_buffer_size = -1; 143 144 /* Textual notes applying to the current and/or future trace runs. */ 145 146 static std::string trace_user; 147 148 /* Textual notes applying to the current and/or future trace runs. */ 149 150 static std::string trace_notes; 151 152 /* Textual notes applying to the stopping of a trace. */ 153 154 static std::string trace_stop_notes; 155 156 /* support routines */ 157 158 struct collection_list; 159 160 static counted_command_line all_tracepoint_actions (tracepoint *); 161 162 static struct trace_status trace_status; 163 164 const char *stop_reason_names[] = { 165 "tunknown", 166 "tnotrun", 167 "tstop", 168 "tfull", 169 "tdisconnected", 170 "tpasscount", 171 "terror" 172 }; 173 174 struct trace_status * 175 current_trace_status (void) 176 { 177 return &trace_status; 178 } 179 180 /* Free and clear the traceframe info cache of the current 181 traceframe. */ 182 183 static void 184 clear_traceframe_info (void) 185 { 186 current_traceframe_info = NULL; 187 } 188 189 /* Set traceframe number to NUM. */ 190 static void 191 set_traceframe_num (int num) 192 { 193 traceframe_number = num; 194 set_internalvar_integer (lookup_internalvar ("trace_frame"), num); 195 } 196 197 /* Set tracepoint number to NUM. */ 198 static void 199 set_tracepoint_num (int num) 200 { 201 tracepoint_number = num; 202 set_internalvar_integer (lookup_internalvar ("tracepoint"), num); 203 } 204 205 /* Set externally visible debug variables for querying/printing 206 the traceframe context (line, function, file). */ 207 208 static void 209 set_traceframe_context (const frame_info_ptr &trace_frame) 210 { 211 CORE_ADDR trace_pc; 212 struct symbol *traceframe_fun; 213 symtab_and_line traceframe_sal; 214 215 /* Save as globals for internal use. */ 216 if (trace_frame != NULL 217 && get_frame_pc_if_available (trace_frame, &trace_pc)) 218 { 219 traceframe_sal = find_pc_line (trace_pc, 0); 220 traceframe_fun = find_pc_function (trace_pc); 221 222 /* Save linenumber as "$trace_line", a debugger variable visible to 223 users. */ 224 set_internalvar_integer (lookup_internalvar ("trace_line"), 225 traceframe_sal.line); 226 } 227 else 228 { 229 traceframe_fun = NULL; 230 set_internalvar_integer (lookup_internalvar ("trace_line"), -1); 231 } 232 233 /* Save func name as "$trace_func", a debugger variable visible to 234 users. */ 235 if (traceframe_fun == NULL 236 || traceframe_fun->linkage_name () == NULL) 237 clear_internalvar (lookup_internalvar ("trace_func")); 238 else 239 set_internalvar_string (lookup_internalvar ("trace_func"), 240 traceframe_fun->linkage_name ()); 241 242 /* Save file name as "$trace_file", a debugger variable visible to 243 users. */ 244 if (traceframe_sal.symtab == NULL) 245 clear_internalvar (lookup_internalvar ("trace_file")); 246 else 247 set_internalvar_string (lookup_internalvar ("trace_file"), 248 symtab_to_filename_for_display (traceframe_sal.symtab)); 249 } 250 251 /* Create a new trace state variable with the given name. */ 252 253 struct trace_state_variable * 254 create_trace_state_variable (const char *name) 255 { 256 return &tvariables.emplace_back (name, next_tsv_number++); 257 } 258 259 /* Look for a trace state variable of the given name. */ 260 261 struct trace_state_variable * 262 find_trace_state_variable (const char *name) 263 { 264 for (trace_state_variable &tsv : tvariables) 265 if (tsv.name == name) 266 return &tsv; 267 268 return NULL; 269 } 270 271 /* Look for a trace state variable of the given number. Return NULL if 272 not found. */ 273 274 struct trace_state_variable * 275 find_trace_state_variable_by_number (int number) 276 { 277 for (trace_state_variable &tsv : tvariables) 278 if (tsv.number == number) 279 return &tsv; 280 281 return NULL; 282 } 283 284 static void 285 delete_trace_state_variable (const char *name) 286 { 287 for (auto it = tvariables.begin (); it != tvariables.end (); it++) 288 if (it->name == name) 289 { 290 interps_notify_tsv_deleted (&*it); 291 tvariables.erase (it); 292 return; 293 } 294 295 warning (_("No trace variable named \"$%s\", not deleting"), name); 296 } 297 298 /* Throws an error if NAME is not valid syntax for a trace state 299 variable's name. */ 300 301 void 302 validate_trace_state_variable_name (const char *name) 303 { 304 const char *p; 305 306 if (*name == '\0') 307 error (_("Must supply a non-empty variable name")); 308 309 /* All digits in the name is reserved for value history 310 references. */ 311 for (p = name; isdigit ((unsigned char)*p); p++) 312 ; 313 if (*p == '\0') 314 error (_("$%s is not a valid trace state variable name"), name); 315 316 for (p = name; isalnum ((unsigned char)*p) || *p == '_'; p++) 317 ; 318 if (*p != '\0') 319 error (_("$%s is not a valid trace state variable name"), name); 320 } 321 322 /* The 'tvariable' command collects a name and optional expression to 323 evaluate into an initial value. */ 324 325 static void 326 trace_variable_command (const char *args, int from_tty) 327 { 328 LONGEST initval = 0; 329 struct trace_state_variable *tsv; 330 const char *name_start, *p; 331 332 if (!args || !*args) 333 error_no_arg (_("Syntax is $NAME [ = EXPR ]")); 334 335 /* Only allow two syntaxes; "$name" and "$name=value". */ 336 p = skip_spaces (args); 337 338 if (*p++ != '$') 339 error (_("Name of trace variable should start with '$'")); 340 341 name_start = p; 342 while (isalnum ((unsigned char)*p) || *p == '_') 343 p++; 344 std::string name (name_start, p - name_start); 345 346 p = skip_spaces (p); 347 if (*p != '=' && *p != '\0') 348 error (_("Syntax must be $NAME [ = EXPR ]")); 349 350 validate_trace_state_variable_name (name.c_str ()); 351 352 if (*p == '=') 353 initval = value_as_long (parse_and_eval (++p)); 354 355 /* If the variable already exists, just change its initial value. */ 356 tsv = find_trace_state_variable (name.c_str ()); 357 if (tsv) 358 { 359 if (tsv->initial_value != initval) 360 { 361 tsv->initial_value = initval; 362 interps_notify_tsv_modified (tsv); 363 } 364 gdb_printf (_("Trace state variable $%s " 365 "now has initial value %s.\n"), 366 tsv->name.c_str (), plongest (tsv->initial_value)); 367 return; 368 } 369 370 /* Create a new variable. */ 371 tsv = create_trace_state_variable (name.c_str ()); 372 tsv->initial_value = initval; 373 374 interps_notify_tsv_created (tsv); 375 376 gdb_printf (_("Trace state variable $%s " 377 "created, with initial value %s.\n"), 378 tsv->name.c_str (), plongest (tsv->initial_value)); 379 } 380 381 static void 382 delete_trace_variable_command (const char *args, int from_tty) 383 { 384 if (args == NULL) 385 { 386 if (query (_("Delete all trace state variables? "))) 387 tvariables.clear (); 388 dont_repeat (); 389 interps_notify_tsv_deleted (nullptr); 390 return; 391 } 392 393 gdb_argv argv (args); 394 395 for (char *arg : argv) 396 { 397 if (*arg == '$') 398 delete_trace_state_variable (arg + 1); 399 else 400 warning (_("Name \"%s\" not prefixed with '$', ignoring"), arg); 401 } 402 403 dont_repeat (); 404 } 405 406 void 407 tvariables_info_1 (void) 408 { 409 struct ui_out *uiout = current_uiout; 410 411 /* Try to acquire values from the target. */ 412 for (trace_state_variable &tsv : tvariables) 413 tsv.value_known 414 = target_get_trace_state_variable_value (tsv.number, &tsv.value); 415 416 { 417 ui_out_emit_table table_emitter (uiout, 3, tvariables.size (), 418 "trace-variables"); 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"); 422 423 uiout->table_body (); 424 425 for (const trace_state_variable &tsv : tvariables) 426 { 427 const char *c; 428 429 ui_out_emit_tuple tuple_emitter (uiout, "variable"); 430 431 uiout->field_string ("name", std::string ("$") + tsv.name); 432 uiout->field_string ("initial", plongest (tsv.initial_value)); 433 434 ui_file_style style; 435 if (tsv.value_known) 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. */ 441 c = NULL; 442 else if (current_trace_status ()->running || traceframe_number >= 0) 443 { 444 /* The value is/was defined, but we don't have it. */ 445 c = "<unknown>"; 446 style = metadata_style.style (); 447 } 448 else 449 { 450 /* It is not meaningful to ask about the value. */ 451 c = "<undefined>"; 452 style = metadata_style.style (); 453 } 454 if (c) 455 uiout->field_string ("current", c, style); 456 uiout->text ("\n"); 457 } 458 } 459 460 if (tvariables.empty ()) 461 uiout->text (_("No trace state variables.\n")); 462 } 463 464 /* List all the trace state variables. */ 465 466 static void 467 info_tvariables_command (const char *args, int from_tty) 468 { 469 tvariables_info_1 (); 470 } 471 472 /* Stash definitions of tsvs into the given file. */ 473 474 void 475 save_trace_state_variables (struct ui_file *fp) 476 { 477 for (const trace_state_variable &tsv : tvariables) 478 { 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"); 483 } 484 } 485 486 /* ACTIONS functions: */ 487 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. */ 496 497 static void 498 end_actions_pseudocommand (const char *args, int from_tty) 499 { 500 error (_("This command cannot be used at the top level.")); 501 } 502 503 static void 504 while_stepping_pseudocommand (const char *args, int from_tty) 505 { 506 error (_("This command can only be used in a tracepoint actions list.")); 507 } 508 509 static void 510 collect_pseudocommand (const char *args, int from_tty) 511 { 512 error (_("This command can only be used in a tracepoint actions list.")); 513 } 514 515 static void 516 teval_pseudocommand (const char *args, int from_tty) 517 { 518 error (_("This command can only be used in a tracepoint actions list.")); 519 } 520 521 /* Parse any collection options, such as /s for strings. */ 522 523 const char * 524 decode_agent_options (const char *exp, int *trace_string) 525 { 526 struct value_print_options opts; 527 528 *trace_string = 0; 529 530 if (*exp != '/') 531 return exp; 532 533 /* Call this to borrow the print elements default for collection 534 size. */ 535 get_user_print_options (&opts); 536 537 exp++; 538 if (*exp == 's') 539 { 540 if (target_supports_string_tracing ()) 541 { 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); 546 exp++; 547 if (*exp >= '0' && *exp <= '9') 548 *trace_string = atoi (exp); 549 while (*exp >= '0' && *exp <= '9') 550 exp++; 551 } 552 else 553 error (_("Target does not support \"/s\" option for string tracing.")); 554 } 555 else 556 error (_("Undefined collection format \"%c\"."), *exp); 557 558 exp = skip_spaces (exp); 559 560 return exp; 561 } 562 563 /* Enter a list of actions for a tracepoint. */ 564 static void 565 actions_command (const char *args, int from_tty) 566 { 567 struct tracepoint *t; 568 569 t = get_tracepoint_by_number (&args, NULL); 570 if (t) 571 { 572 std::string tmpbuf = 573 string_printf ("Enter actions for tracepoint %d, one per line.", 574 t->number); 575 576 counted_command_line l = read_command_lines (tmpbuf.c_str (), 577 from_tty, 1, 578 [=] (const char *line) 579 { 580 validate_actionline (line, t); 581 }); 582 breakpoint_set_commands (t, std::move (l)); 583 } 584 /* else just return */ 585 } 586 587 /* Report the results of checking the agent expression, as errors or 588 internal errors. */ 589 590 static void 591 report_agent_reqs_errors (struct agent_expr *aexpr) 592 { 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")); 597 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")); 602 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.")); 611 } 612 613 /* Call ax_reqs on AEXPR and raise an error if something is wrong. */ 614 615 static void 616 finalize_tracepoint_aexpr (struct agent_expr *aexpr) 617 { 618 ax_reqs (aexpr); 619 620 if (aexpr->buf.size () > MAX_AGENT_EXPR_LEN) 621 error (_("Expression is too complicated.")); 622 623 report_agent_reqs_errors (aexpr); 624 } 625 626 /* worker function */ 627 void 628 validate_actionline (const char *line, tracepoint *t) 629 { 630 struct cmd_list_element *c; 631 const char *tmp_p; 632 const char *p; 633 634 /* If EOF is typed, *line is NULL. */ 635 if (line == NULL) 636 return; 637 638 p = skip_spaces (line); 639 640 /* Symbol lookup etc. */ 641 if (*p == '\0') /* empty line: just prompt for another line. */ 642 return; 643 644 if (*p == '#') /* comment line */ 645 return; 646 647 c = lookup_cmd (&p, cmdlist, "", NULL, -1, 1); 648 if (c == 0) 649 error (_("`%s' is not a tracepoint action, or is ambiguous."), p); 650 651 if (cmd_simple_func_eq (c, collect_pseudocommand)) 652 { 653 int trace_string = 0; 654 655 if (*p == '/') 656 p = decode_agent_options (p, &trace_string); 657 658 do 659 { /* Repeat over a comma-separated list. */ 660 QUIT; /* Allow user to bail out with ^C. */ 661 p = skip_spaces (p); 662 663 if (*p == '$') /* Look for special pseudo-symbols. */ 664 { 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)) 670 { 671 p = strchr (p, ','); 672 continue; 673 } 674 /* else fall through, treat p as an expression and parse it! */ 675 } 676 tmp_p = p; 677 for (bp_location &loc : t->locations ()) 678 { 679 p = tmp_p; 680 expression_up exp = parse_exp_1 (&p, loc.address, 681 block_for_pc (loc.address), 682 PARSER_COMMA_TERMINATES); 683 684 if (exp->first_opcode () == OP_VAR_VALUE) 685 { 686 symbol *sym; 687 expr::var_value_operation *vvop 688 = (gdb::checked_static_cast<expr::var_value_operation *> 689 (exp->op.get ())); 690 sym = vvop->get_symbol (); 691 692 if (sym->aclass () == LOC_CONST) 693 { 694 error (_("constant `%s' (value %s) " 695 "will not be collected."), 696 sym->print_name (), 697 plongest (sym->value_longest ())); 698 } 699 else if (sym->aclass () == LOC_OPTIMIZED_OUT) 700 { 701 error (_("`%s' is optimized away " 702 "and cannot be collected."), 703 sym->print_name ()); 704 } 705 } 706 707 /* We have something to collect, make sure that the expr to 708 bytecode translator can handle it and that it's not too 709 long. */ 710 agent_expr_up aexpr = gen_trace_for_expr (loc.address, 711 exp.get (), 712 trace_string); 713 714 finalize_tracepoint_aexpr (aexpr.get ()); 715 } 716 } 717 while (p && *p++ == ','); 718 } 719 720 else if (cmd_simple_func_eq (c, teval_pseudocommand)) 721 { 722 do 723 { /* Repeat over a comma-separated list. */ 724 QUIT; /* Allow user to bail out with ^C. */ 725 p = skip_spaces (p); 726 727 tmp_p = p; 728 for (bp_location &loc : t->locations ()) 729 { 730 p = tmp_p; 731 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); 736 737 /* We have something to evaluate, make sure that the expr to 738 bytecode translator can handle it and that it's not too 739 long. */ 740 agent_expr_up aexpr = gen_eval_for_expr (loc.address, exp.get ()); 741 742 finalize_tracepoint_aexpr (aexpr.get ()); 743 } 744 } 745 while (p && *p++ == ','); 746 } 747 748 else if (cmd_simple_func_eq (c, while_stepping_pseudocommand)) 749 { 750 char *endp; 751 752 p = skip_spaces (p); 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); 756 p = endp; 757 } 758 759 else if (cmd_simple_func_eq (c, end_actions_pseudocommand)) 760 ; 761 762 else 763 error (_("`%s' is not a supported tracepoint action."), line); 764 } 765 766 enum { 767 memrange_absolute = -1 768 }; 769 770 /* MEMRANGE functions: */ 771 772 /* Compare memranges for std::sort. */ 773 774 static bool 775 memrange_comp (const memrange &a, const memrange &b) 776 { 777 if (a.type == b.type) 778 { 779 if (a.type == memrange_absolute) 780 return (bfd_vma) a.start < (bfd_vma) b.start; 781 else 782 return a.start < b.start; 783 } 784 785 return a.type < b.type; 786 } 787 788 /* Sort the memrange list using std::sort, and merge adjacent memranges. */ 789 790 static void 791 memrange_sortmerge (std::vector<memrange> &memranges) 792 { 793 if (!memranges.empty ()) 794 { 795 int a, b; 796 797 std::sort (memranges.begin (), memranges.end (), memrange_comp); 798 799 for (a = 0, b = 1; b < memranges.size (); b++) 800 { 801 /* If memrange b overlaps or is adjacent to memrange a, 802 merge them. */ 803 if (memranges[a].type == memranges[b].type 804 && memranges[b].start <= memranges[a].end) 805 { 806 if (memranges[b].end > memranges[a].end) 807 memranges[a].end = memranges[b].end; 808 continue; /* next b, same a */ 809 } 810 a++; /* next a */ 811 if (a != b) 812 memranges[a] = memranges[b]; 813 } 814 memranges.resize (a + 1); 815 } 816 } 817 818 /* Add remote register number REGNO to the collection list mask. */ 819 820 void 821 collection_list::add_remote_register (unsigned int regno) 822 { 823 if (info_verbose) 824 gdb_printf ("collect register %d\n", regno); 825 826 m_regs_mask.at (regno / 8) |= 1 << (regno % 8); 827 } 828 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 831 register numbers. */ 832 833 void 834 collection_list::add_ax_registers (struct agent_expr *aexpr) 835 { 836 for (int ndx1 = 0; ndx1 < aexpr->reg_mask.size (); ndx1++) 837 { 838 QUIT; /* Allow user to bail out with ^C. */ 839 if (aexpr->reg_mask[ndx1]) 840 { 841 /* It's used -- record it. */ 842 add_remote_register (ndx1); 843 } 844 } 845 } 846 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. */ 851 852 void 853 collection_list::add_local_register (struct gdbarch *gdbarch, 854 unsigned int regno, 855 CORE_ADDR scope) 856 { 857 if (regno < gdbarch_num_regs (gdbarch)) 858 { 859 int remote_regno = gdbarch_remote_register_number (gdbarch, regno); 860 861 if (remote_regno < 0) 862 error (_("Can't collect register %d"), regno); 863 864 add_remote_register (remote_regno); 865 } 866 else 867 { 868 agent_expr_up aexpr (new agent_expr (gdbarch, scope)); 869 870 ax_reg_mask (aexpr.get (), regno); 871 872 finalize_tracepoint_aexpr (aexpr.get ()); 873 874 add_ax_registers (aexpr.get ()); 875 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 879 collection list. */ 880 if (aexpr->buf.size () > 0) 881 add_aexpr (std::move (aexpr)); 882 } 883 } 884 885 /* Add a memrange to a collection list. */ 886 887 void 888 collection_list::add_memrange (struct gdbarch *gdbarch, 889 int type, bfd_signed_vma base, 890 unsigned long len, CORE_ADDR scope) 891 { 892 if (info_verbose) 893 gdb_printf ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len); 894 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); 899 900 if (type != memrange_absolute) /* Better collect the base register! */ 901 add_local_register (gdbarch, type, scope); 902 } 903 904 /* Add a symbol to a collection list. */ 905 906 void 907 collection_list::collect_symbol (struct symbol *sym, 908 struct gdbarch *gdbarch, 909 long frame_regno, long frame_offset, 910 CORE_ADDR scope, 911 int trace_string) 912 { 913 unsigned long len; 914 unsigned int reg; 915 bfd_signed_vma offset; 916 int treat_as_expr = 0; 917 918 len = check_typedef (sym->type ())->length (); 919 switch (sym->aclass ()) 920 { 921 default: 922 gdb_printf ("%s: don't know symbol class %d\n", 923 sym->print_name (), sym->aclass ()); 924 break; 925 case LOC_CONST: 926 gdb_printf ("constant %s (value %s) will not be collected.\n", 927 sym->print_name (), plongest (sym->value_longest ())); 928 break; 929 case LOC_STATIC: 930 offset = sym->value_address (); 931 if (info_verbose) 932 { 933 gdb_printf ("LOC_STATIC %s: collect %ld bytes at %s.\n", 934 sym->print_name (), len, 935 paddress (gdbarch, offset)); 936 } 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) 940 treat_as_expr = 1; 941 else 942 add_memrange (gdbarch, memrange_absolute, offset, len, scope); 943 break; 944 case LOC_REGISTER: 945 reg = sym->register_ops ()->register_number (sym, gdbarch); 946 if (info_verbose) 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); 954 break; 955 case LOC_REF_ARG: 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 ()); 958 break; 959 case LOC_ARG: 960 reg = frame_regno; 961 offset = frame_offset + sym->value_longest (); 962 if (info_verbose) 963 { 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); 967 } 968 add_memrange (gdbarch, reg, offset, len, scope); 969 break; 970 case LOC_REGPARM_ADDR: 971 reg = sym->value_longest (); 972 offset = 0; 973 if (info_verbose) 974 { 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); 978 } 979 add_memrange (gdbarch, reg, offset, len, scope); 980 break; 981 case LOC_LOCAL: 982 reg = frame_regno; 983 offset = frame_offset + sym->value_longest (); 984 if (info_verbose) 985 { 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); 989 } 990 add_memrange (gdbarch, reg, offset, len, scope); 991 break; 992 993 case LOC_UNRESOLVED: 994 treat_as_expr = 1; 995 break; 996 997 case LOC_OPTIMIZED_OUT: 998 gdb_printf ("%s has been optimized out of existence.\n", 999 sym->print_name ()); 1000 break; 1001 1002 case LOC_COMPUTED: 1003 treat_as_expr = 1; 1004 break; 1005 } 1006 1007 /* Expressions are the most general case. */ 1008 if (treat_as_expr) 1009 { 1010 agent_expr_up aexpr = gen_trace_for_var (scope, gdbarch, 1011 sym, trace_string); 1012 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. */ 1016 if (!aexpr) 1017 { 1018 gdb_printf ("%s has been optimized out of existence.\n", 1019 sym->print_name ()); 1020 return; 1021 } 1022 1023 finalize_tracepoint_aexpr (aexpr.get ()); 1024 1025 /* Take care of the registers. */ 1026 add_ax_registers (aexpr.get ()); 1027 1028 add_aexpr (std::move (aexpr)); 1029 } 1030 } 1031 1032 void 1033 collection_list::add_wholly_collected (const char *print_name) 1034 { 1035 m_wholly_collected.push_back (print_name); 1036 } 1037 1038 /* Add all locals (or args) symbols to collection list. */ 1039 1040 void 1041 collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc, 1042 long frame_regno, long frame_offset, int type, 1043 int trace_string) 1044 { 1045 const struct block *block; 1046 int count = 0; 1047 1048 auto do_collect_symbol = [&] (const char *print_name, 1049 struct symbol *sym) 1050 { 1051 collect_symbol (sym, gdbarch, frame_regno, 1052 frame_offset, pc, trace_string); 1053 count++; 1054 add_wholly_collected (print_name); 1055 }; 1056 1057 if (type == 'L') 1058 { 1059 block = block_for_pc (pc); 1060 if (block == NULL) 1061 { 1062 warning (_("Can't collect locals; " 1063 "no symbol table info available.\n")); 1064 return; 1065 } 1066 1067 iterate_over_block_local_vars (block, do_collect_symbol); 1068 if (count == 0) 1069 warning (_("No locals found in scope.")); 1070 } 1071 else 1072 { 1073 CORE_ADDR fn_pc = get_pc_function_start (pc); 1074 block = block_for_pc (fn_pc); 1075 if (block == NULL) 1076 { 1077 warning (_("Can't collect args; no symbol table info available.")); 1078 return; 1079 } 1080 1081 iterate_over_block_arg_vars (block, do_collect_symbol); 1082 if (count == 0) 1083 warning (_("No args found in scope.")); 1084 } 1085 } 1086 1087 void 1088 collection_list::add_static_trace_data () 1089 { 1090 if (info_verbose) 1091 gdb_printf ("collect static trace data\n"); 1092 m_strace_data = true; 1093 } 1094 1095 collection_list::collection_list () 1096 : m_strace_data (false) 1097 { 1098 int max_remote_regno = 0; 1099 for (int i = 0; i < gdbarch_num_regs (current_inferior ()->arch ()); i++) 1100 { 1101 int remote_regno = (gdbarch_remote_register_number 1102 (current_inferior ()->arch (), i)); 1103 1104 if (remote_regno >= 0 && remote_regno > max_remote_regno) 1105 max_remote_regno = remote_regno; 1106 } 1107 1108 m_regs_mask.resize ((max_remote_regno / 8) + 1); 1109 1110 m_memranges.reserve (128); 1111 m_aexprs.reserve (128); 1112 } 1113 1114 /* Reduce a collection list to string form (for gdb protocol). */ 1115 1116 std::vector<std::string> 1117 collection_list::stringify () 1118 { 1119 gdb::char_vector temp_buf (2048); 1120 1121 int count; 1122 char *end; 1123 long i; 1124 std::vector<std::string> str_list; 1125 1126 if (m_strace_data) 1127 { 1128 if (info_verbose) 1129 gdb_printf ("\nCollecting static trace data\n"); 1130 end = temp_buf.data (); 1131 *end++ = 'L'; 1132 str_list.emplace_back (temp_buf.data (), end - temp_buf.data ()); 1133 } 1134 1135 for (i = m_regs_mask.size () - 1; i > 0; i--) 1136 if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */ 1137 break; 1138 if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */ 1139 { 1140 if (info_verbose) 1141 gdb_printf ("\nCollecting registers (mask): 0x"); 1142 1143 /* One char for 'R', one for the null terminator and two per 1144 mask byte. */ 1145 std::size_t new_size = (i + 1) * 2 + 2; 1146 if (new_size > temp_buf.size ()) 1147 temp_buf.resize (new_size); 1148 1149 end = temp_buf.data (); 1150 *end++ = 'R'; 1151 for (; i >= 0; i--) 1152 { 1153 QUIT; /* Allow user to bail out with ^C. */ 1154 if (info_verbose) 1155 gdb_printf ("%02X", m_regs_mask[i]); 1156 1157 end = pack_hex_byte (end, m_regs_mask[i]); 1158 } 1159 *end = '\0'; 1160 1161 str_list.emplace_back (temp_buf.data ()); 1162 } 1163 if (info_verbose) 1164 gdb_printf ("\n"); 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++) 1169 { 1170 QUIT; /* Allow user to bail out with ^C. */ 1171 if (info_verbose) 1172 { 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)); 1179 } 1180 if (count + 27 > MAX_AGENT_EXPR_LEN) 1181 { 1182 str_list.emplace_back (temp_buf.data (), count); 1183 count = 0; 1184 end = temp_buf.data (); 1185 } 1186 1187 { 1188 bfd_signed_vma length 1189 = m_memranges[i].end - m_memranges[i].start; 1190 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)). 1194 Special-case it. */ 1195 if (m_memranges[i].type == memrange_absolute) 1196 sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0), 1197 (long) length); 1198 else 1199 sprintf (end, "M%X,%s,%lX", m_memranges[i].type, 1200 phex_nz (m_memranges[i].start, 0), (long) length); 1201 } 1202 1203 count += strlen (end); 1204 end = temp_buf.data () + count; 1205 } 1206 1207 for (i = 0; i < m_aexprs.size (); i++) 1208 { 1209 QUIT; /* Allow user to bail out with ^C. */ 1210 if ((count + 10 + 2 * m_aexprs[i]->buf.size ()) > MAX_AGENT_EXPR_LEN) 1211 { 1212 str_list.emplace_back (temp_buf.data (), count); 1213 count = 0; 1214 end = temp_buf.data (); 1215 } 1216 sprintf (end, "X%08X,", (int) m_aexprs[i]->buf.size ()); 1217 end += 10; /* 'X' + 8 hex digits + ',' */ 1218 count += 10; 1219 1220 end += 2 * bin2hex (m_aexprs[i]->buf.data (), end, 1221 m_aexprs[i]->buf.size ()); 1222 count += 2 * m_aexprs[i]->buf.size (); 1223 } 1224 1225 if (count != 0) 1226 { 1227 str_list.emplace_back (temp_buf.data (), count); 1228 count = 0; 1229 end = temp_buf.data (); 1230 } 1231 1232 return str_list; 1233 } 1234 1235 /* Add the expression STR to M_COMPUTED. */ 1236 1237 void 1238 collection_list::append_exp (std::string &&str) 1239 { 1240 m_computed.push_back (std::move (str)); 1241 } 1242 1243 void 1244 collection_list::finish () 1245 { 1246 memrange_sortmerge (m_memranges); 1247 } 1248 1249 static void 1250 encode_actions_1 (struct command_line *action, 1251 struct bp_location *tloc, 1252 int frame_reg, 1253 LONGEST frame_offset, 1254 struct collection_list *collect, 1255 struct collection_list *stepping_list) 1256 { 1257 const char *action_exp; 1258 int i; 1259 struct value *tempval; 1260 struct cmd_list_element *cmd; 1261 1262 for (; action; action = action->next) 1263 { 1264 QUIT; /* Allow user to bail out with ^C. */ 1265 action_exp = action->line; 1266 action_exp = skip_spaces (action_exp); 1267 1268 cmd = lookup_cmd (&action_exp, cmdlist, "", NULL, -1, 1); 1269 if (cmd == 0) 1270 error (_("Bad action list item: %s"), action_exp); 1271 1272 if (cmd_simple_func_eq (cmd, collect_pseudocommand)) 1273 { 1274 int trace_string = 0; 1275 1276 if (*action_exp == '/') 1277 action_exp = decode_agent_options (action_exp, &trace_string); 1278 1279 do 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 (); 1284 1285 if (0 == strncasecmp ("$reg", action_exp, 4)) 1286 { 1287 for (i = 0; i < gdbarch_num_regs (arch); 1288 i++) 1289 { 1290 int remote_regno = (gdbarch_remote_register_number 1291 (arch, i)); 1292 1293 /* Ignore arch regnos without a corresponding 1294 remote regno. This can happen for regnos not 1295 in the tdesc. */ 1296 if (remote_regno >= 0) 1297 collect->add_remote_register (remote_regno); 1298 } 1299 action_exp = strchr (action_exp, ','); /* more? */ 1300 } 1301 else if (0 == strncasecmp ("$arg", action_exp, 4)) 1302 { 1303 collect->add_local_symbols (arch, 1304 tloc->address, 1305 frame_reg, 1306 frame_offset, 1307 'A', 1308 trace_string); 1309 action_exp = strchr (action_exp, ','); /* more? */ 1310 } 1311 else if (0 == strncasecmp ("$loc", action_exp, 4)) 1312 { 1313 collect->add_local_symbols (arch, 1314 tloc->address, 1315 frame_reg, 1316 frame_offset, 1317 'L', 1318 trace_string); 1319 action_exp = strchr (action_exp, ','); /* more? */ 1320 } 1321 else if (0 == strncasecmp ("$_ret", action_exp, 5)) 1322 { 1323 agent_expr_up aexpr 1324 = gen_trace_for_return_address (tloc->address, 1325 arch, trace_string); 1326 1327 finalize_tracepoint_aexpr (aexpr.get ()); 1328 1329 /* take care of the registers */ 1330 collect->add_ax_registers (aexpr.get ()); 1331 1332 collect->add_aexpr (std::move (aexpr)); 1333 action_exp = strchr (action_exp, ','); /* more? */ 1334 } 1335 else if (0 == strncasecmp ("$_sdata", action_exp, 7)) 1336 { 1337 collect->add_static_trace_data (); 1338 action_exp = strchr (action_exp, ','); /* more? */ 1339 } 1340 else 1341 { 1342 unsigned long addr; 1343 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); 1348 1349 switch (exp->first_opcode ()) 1350 { 1351 case OP_REGISTER: 1352 { 1353 expr::register_operation *regop 1354 = (gdb::checked_static_cast<expr::register_operation *> 1355 (exp->op.get ())); 1356 const char *name = regop->get_name (); 1357 1358 i = user_reg_map_name_to_regnum (arch, 1359 name, strlen (name)); 1360 if (i == -1) 1361 internal_error (_("Register $%s not available"), 1362 name); 1363 if (info_verbose) 1364 gdb_printf ("OP_REGISTER: "); 1365 collect->add_local_register (arch, i, tloc->address); 1366 break; 1367 } 1368 1369 case UNOP_MEMVAL: 1370 { 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 *> 1376 (exp->op.get ())); 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, 1382 type->length (), 1383 tloc->address); 1384 collect->append_exp (std::string (exp_start, 1385 action_exp)); 1386 } 1387 break; 1388 1389 case OP_VAR_VALUE: 1390 { 1391 expr::var_value_operation *vvo 1392 = (gdb::checked_static_cast<expr::var_value_operation *> 1393 (exp->op.get ())); 1394 struct symbol *sym = vvo->get_symbol (); 1395 const char *name = sym->natural_name (); 1396 1397 collect->collect_symbol (sym, 1398 arch, 1399 frame_reg, 1400 frame_offset, 1401 tloc->address, 1402 trace_string); 1403 collect->add_wholly_collected (name); 1404 } 1405 break; 1406 1407 default: /* Full-fledged expression. */ 1408 agent_expr_up aexpr = gen_trace_for_expr (tloc->address, 1409 exp.get (), 1410 trace_string); 1411 1412 finalize_tracepoint_aexpr (aexpr.get ()); 1413 1414 /* Take care of the registers. */ 1415 collect->add_ax_registers (aexpr.get ()); 1416 1417 collect->add_aexpr (std::move (aexpr)); 1418 collect->append_exp (std::string (exp_start, 1419 action_exp)); 1420 break; 1421 } /* switch */ 1422 } /* do */ 1423 } 1424 while (action_exp && *action_exp++ == ','); 1425 } /* if */ 1426 else if (cmd_simple_func_eq (cmd, teval_pseudocommand)) 1427 { 1428 do 1429 { /* Repeat over a comma-separated list. */ 1430 QUIT; /* Allow user to bail out with ^C. */ 1431 action_exp = skip_spaces (action_exp); 1432 1433 { 1434 expression_up exp = parse_exp_1 (&action_exp, tloc->address, 1435 block_for_pc (tloc->address), 1436 PARSER_COMMA_TERMINATES); 1437 1438 agent_expr_up aexpr = gen_eval_for_expr (tloc->address, 1439 exp.get ()); 1440 1441 finalize_tracepoint_aexpr (aexpr.get ()); 1442 1443 /* Even though we're not officially collecting, add 1444 to the collect list anyway. */ 1445 collect->add_aexpr (std::move (aexpr)); 1446 } /* do */ 1447 } 1448 while (action_exp && *action_exp++ == ','); 1449 } /* if */ 1450 else if (cmd_simple_func_eq (cmd, while_stepping_pseudocommand)) 1451 { 1452 /* We check against nested while-stepping when setting 1453 breakpoint action, so no way to run into nested 1454 here. */ 1455 gdb_assert (stepping_list); 1456 1457 encode_actions_1 (action->body_list_0.get (), tloc, frame_reg, 1458 frame_offset, stepping_list, NULL); 1459 } 1460 else 1461 error (_("Invalid tracepoint command '%s'"), action->line); 1462 } /* for */ 1463 } 1464 1465 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST 1466 and STEPPING_LIST. */ 1467 1468 void 1469 encode_actions (struct bp_location *tloc, 1470 struct collection_list *tracepoint_list, 1471 struct collection_list *stepping_list) 1472 { 1473 int frame_reg; 1474 LONGEST frame_offset; 1475 1476 gdbarch_virtual_frame_pointer (tloc->gdbarch, 1477 tloc->address, &frame_reg, &frame_offset); 1478 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); 1485 1486 tracepoint_list->finish (); 1487 stepping_list->finish (); 1488 } 1489 1490 /* Render all actions into gdb protocol. */ 1491 1492 void 1493 encode_actions_rsp (struct bp_location *tloc, 1494 std::vector<std::string> *tdp_actions, 1495 std::vector<std::string> *stepping_actions) 1496 { 1497 struct collection_list tracepoint_list, stepping_list; 1498 1499 encode_actions (tloc, &tracepoint_list, &stepping_list); 1500 1501 *tdp_actions = tracepoint_list.stringify (); 1502 *stepping_actions = stepping_list.stringify (); 1503 } 1504 1505 void 1506 collection_list::add_aexpr (agent_expr_up aexpr) 1507 { 1508 m_aexprs.push_back (std::move (aexpr)); 1509 } 1510 1511 static void 1512 process_tracepoint_on_disconnect (void) 1513 { 1514 int has_pending_p = 0; 1515 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 ()) 1519 { 1520 if (!b.has_locations ()) 1521 { 1522 has_pending_p = 1; 1523 break; 1524 } 1525 else 1526 { 1527 for (bp_location &loc1 : b.locations ()) 1528 { 1529 if (loc1.shlib_disabled) 1530 { 1531 has_pending_p = 1; 1532 break; 1533 } 1534 } 1535 1536 if (has_pending_p) 1537 break; 1538 } 1539 } 1540 1541 if (has_pending_p) 1542 warning (_("Pending tracepoints will not be resolved while" 1543 " GDB is disconnected\n")); 1544 } 1545 1546 /* Reset local state of tracing. */ 1547 1548 void 1549 trace_reset_local_state (void) 1550 { 1551 set_traceframe_num (-1); 1552 set_tracepoint_num (-1); 1553 set_traceframe_context (NULL); 1554 clear_traceframe_info (); 1555 } 1556 1557 void 1558 start_tracing (const char *notes) 1559 { 1560 int any_enabled = 0, num_to_download = 0; 1561 int ret; 1562 1563 auto tracepoint_range = all_tracepoints (); 1564 1565 /* No point in tracing without any tracepoints... */ 1566 if (tracepoint_range.begin () == tracepoint_range.end ()) 1567 error (_("No tracepoints defined, not starting trace")); 1568 1569 for (breakpoint &b : tracepoint_range) 1570 { 1571 if (b.enable_state == bp_enabled) 1572 any_enabled = 1; 1573 1574 if ((b.type == bp_fast_tracepoint 1575 ? may_insert_fast_tracepoints 1576 : may_insert_tracepoints)) 1577 ++num_to_download; 1578 else 1579 warning (_("May not insert %stracepoints, skipping tracepoint %d"), 1580 (b.type == bp_fast_tracepoint ? "fast " : ""), b.number); 1581 } 1582 1583 if (!any_enabled) 1584 { 1585 if (target_supports_enable_disable_tracepoint ()) 1586 warning (_("No tracepoints enabled")); 1587 else 1588 { 1589 /* No point in tracing with only disabled tracepoints that 1590 cannot be re-enabled. */ 1591 error (_("No tracepoints enabled, not starting trace")); 1592 } 1593 } 1594 1595 if (num_to_download <= 0) 1596 error (_("No tracepoints that may be downloaded, not starting trace")); 1597 1598 target_trace_init (); 1599 1600 for (breakpoint &b : tracepoint_range) 1601 { 1602 tracepoint &t = gdb::checked_static_cast<tracepoint &> (b); 1603 int bp_location_downloaded = 0; 1604 1605 /* Clear `inserted' flag. */ 1606 for (bp_location &loc : b.locations ()) 1607 loc.inserted = 0; 1608 1609 if ((b.type == bp_fast_tracepoint 1610 ? !may_insert_fast_tracepoints 1611 : !may_insert_tracepoints)) 1612 continue; 1613 1614 t.number_on_target = 0; 1615 1616 for (bp_location &loc : b.locations ()) 1617 { 1618 /* Since tracepoint locations are never duplicated, `inserted' 1619 flag should be zero. */ 1620 gdb_assert (!loc.inserted); 1621 1622 target_download_tracepoint (&loc); 1623 1624 loc.inserted = 1; 1625 bp_location_downloaded = 1; 1626 } 1627 1628 t.number_on_target = b.number; 1629 1630 for (bp_location &loc : b.locations ()) 1631 if (loc.probe.prob != NULL) 1632 loc.probe.prob->set_semaphore (loc.probe.objfile, loc.gdbarch); 1633 1634 if (bp_location_downloaded) 1635 notify_breakpoint_modified (&b); 1636 } 1637 1638 /* Send down all the trace state variables too. */ 1639 for (const trace_state_variable &tsv : tvariables) 1640 target_download_trace_state_variable (tsv); 1641 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); 1648 1649 if (!notes) 1650 notes = trace_notes.c_str (); 1651 1652 ret = target_set_trace_notes (trace_user.c_str (), notes, NULL); 1653 1654 if (!ret && (!trace_user.empty () || notes)) 1655 warning (_("Target does not support trace user/notes, info ignored")); 1656 1657 /* Now insert traps and begin collecting data. */ 1658 target_trace_start (); 1659 1660 /* Reset our local state. */ 1661 trace_reset_local_state (); 1662 current_trace_status()->running = 1; 1663 } 1664 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. */ 1670 1671 static void 1672 tstart_command (const char *args, int from_tty) 1673 { 1674 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */ 1675 1676 if (current_trace_status ()->running) 1677 { 1678 if (from_tty 1679 && !query (_("A trace is running already. Start a new run? "))) 1680 error (_("New trace run not started.")); 1681 } 1682 1683 start_tracing (args); 1684 } 1685 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. */ 1690 1691 static void 1692 tstop_command (const char *args, int from_tty) 1693 { 1694 if (!current_trace_status ()->running) 1695 error (_("Trace is not running.")); 1696 1697 stop_tracing (args); 1698 } 1699 1700 void 1701 stop_tracing (const char *note) 1702 { 1703 int ret; 1704 1705 target_trace_stop (); 1706 1707 for (breakpoint &t : all_tracepoints ()) 1708 { 1709 if ((t.type == bp_fast_tracepoint 1710 ? !may_insert_fast_tracepoints 1711 : !may_insert_tracepoints)) 1712 continue; 1713 1714 for (bp_location &loc : t.locations ()) 1715 { 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 1719 in other places. */ 1720 if (loc.probe.prob != NULL) 1721 loc.probe.prob->clear_semaphore (loc.probe.objfile, loc.gdbarch); 1722 } 1723 } 1724 1725 if (!note) 1726 note = trace_stop_notes.c_str (); 1727 1728 ret = target_set_trace_notes (NULL, NULL, note); 1729 1730 if (!ret && note) 1731 warning (_("Target does not support trace notes, note ignored")); 1732 1733 /* Should change in response to reply? */ 1734 current_trace_status ()->running = 0; 1735 } 1736 1737 /* tstatus command */ 1738 static void 1739 tstatus_command (const char *args, int from_tty) 1740 { 1741 struct trace_status *ts = current_trace_status (); 1742 int status; 1743 1744 status = target_get_trace_status (ts); 1745 1746 if (status == -1) 1747 { 1748 if (ts->filename != NULL) 1749 gdb_printf (_("Using a trace file.\n")); 1750 else 1751 { 1752 gdb_printf (_("Trace can not be run on this target.\n")); 1753 return; 1754 } 1755 } 1756 1757 if (!ts->running_known) 1758 { 1759 gdb_printf (_("Run/stop status is unknown.\n")); 1760 } 1761 else if (ts->running) 1762 { 1763 gdb_printf (_("Trace is running on the target.\n")); 1764 } 1765 else 1766 { 1767 switch (ts->stop_reason) 1768 { 1769 case trace_never_run: 1770 gdb_printf (_("No trace has been run on the target.\n")); 1771 break; 1772 case trace_stop_command: 1773 if (ts->stop_desc) 1774 gdb_printf (_("Trace stopped by a tstop command (%s).\n"), 1775 ts->stop_desc); 1776 else 1777 gdb_printf (_("Trace stopped by a tstop command.\n")); 1778 break; 1779 case trace_buffer_full: 1780 gdb_printf (_("Trace stopped because the buffer was full.\n")); 1781 break; 1782 case trace_disconnected: 1783 gdb_printf (_("Trace stopped because of disconnection.\n")); 1784 break; 1785 case tracepoint_passcount: 1786 gdb_printf (_("Trace stopped by tracepoint %d.\n"), 1787 ts->stopping_tracepoint); 1788 break; 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); 1794 else 1795 gdb_printf (_("Trace stopped by an error (%s).\n"), 1796 ts->stop_desc); 1797 break; 1798 case trace_stop_reason_unknown: 1799 gdb_printf (_("Trace stopped for an unknown reason.\n")); 1800 break; 1801 default: 1802 gdb_printf (_("Trace stopped for some other reason (%d).\n"), 1803 ts->stop_reason); 1804 break; 1805 } 1806 } 1807 1808 if (ts->traceframes_created >= 0 1809 && ts->traceframe_count != ts->traceframes_created) 1810 { 1811 gdb_printf (_("Buffer contains %d trace " 1812 "frames (of %d created total).\n"), 1813 ts->traceframe_count, ts->traceframes_created); 1814 } 1815 else if (ts->traceframe_count >= 0) 1816 { 1817 gdb_printf (_("Collected %d trace frames.\n"), 1818 ts->traceframe_count); 1819 } 1820 1821 if (ts->buffer_free >= 0) 1822 { 1823 if (ts->buffer_size >= 0) 1824 { 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")); 1833 } 1834 else 1835 gdb_printf (_("Trace buffer has %d bytes free.\n"), 1836 ts->buffer_free); 1837 } 1838 1839 if (ts->disconnected_tracing) 1840 gdb_printf (_("Trace will continue if GDB disconnects.\n")); 1841 else 1842 gdb_printf (_("Trace will stop if GDB disconnects.\n")); 1843 1844 if (ts->circular_buffer) 1845 gdb_printf (_("Trace buffer is circular.\n")); 1846 1847 if (ts->user_name && strlen (ts->user_name) > 0) 1848 gdb_printf (_("Trace user is %s.\n"), ts->user_name); 1849 1850 if (ts->notes && strlen (ts->notes) > 0) 1851 gdb_printf (_("Trace notes: %s.\n"), ts->notes); 1852 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); 1857 else 1858 gdb_printf (_("Not looking at any trace frame.\n")); 1859 1860 /* Report start/stop times if supplied. */ 1861 if (ts->start_time) 1862 { 1863 if (ts->stop_time) 1864 { 1865 LONGEST run_time = ts->stop_time - ts->start_time; 1866 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)); 1873 } 1874 else 1875 gdb_printf (_("Trace started at %ld.%06ld secs.\n"), 1876 (long int) (ts->start_time / 1000000), 1877 (long int) (ts->start_time % 1000000)); 1878 } 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)); 1883 1884 /* Now report any per-tracepoint status available. */ 1885 for (breakpoint &b : all_tracepoints ()) 1886 { 1887 tracepoint *t = gdb::checked_static_cast<tracepoint *> (&b); 1888 target_get_tracepoint_status (t, nullptr); 1889 } 1890 } 1891 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. 1895 1896 The implementation is essentially parallel to trace_status_command, but 1897 merging them will result in unreadable code. */ 1898 void 1899 trace_status_mi (int on_stop) 1900 { 1901 struct ui_out *uiout = current_uiout; 1902 struct trace_status *ts = current_trace_status (); 1903 int status; 1904 1905 status = target_get_trace_status (ts); 1906 1907 if (status == -1 && ts->filename == NULL) 1908 { 1909 uiout->field_string ("supported", "0"); 1910 return; 1911 } 1912 1913 if (ts->filename != NULL) 1914 uiout->field_string ("supported", "file"); 1915 else if (!on_stop) 1916 uiout->field_string ("supported", "1"); 1917 1918 if (ts->filename != NULL) 1919 uiout->field_string ("trace-file", ts->filename); 1920 1921 gdb_assert (ts->running_known); 1922 1923 if (ts->running) 1924 { 1925 uiout->field_string ("running", "1"); 1926 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. */ 1935 } 1936 else 1937 { 1938 const char *stop_reason = NULL; 1939 int stopping_tracepoint = -1; 1940 1941 if (!on_stop) 1942 uiout->field_string ("running", "0"); 1943 1944 if (ts->stop_reason != trace_stop_reason_unknown) 1945 { 1946 switch (ts->stop_reason) 1947 { 1948 case trace_stop_command: 1949 stop_reason = "request"; 1950 break; 1951 case trace_buffer_full: 1952 stop_reason = "overflow"; 1953 break; 1954 case trace_disconnected: 1955 stop_reason = "disconnection"; 1956 break; 1957 case tracepoint_passcount: 1958 stop_reason = "passcount"; 1959 stopping_tracepoint = ts->stopping_tracepoint; 1960 break; 1961 case tracepoint_error: 1962 stop_reason = "error"; 1963 stopping_tracepoint = ts->stopping_tracepoint; 1964 break; 1965 } 1966 1967 if (stop_reason) 1968 { 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", 1975 ts->stop_desc); 1976 } 1977 } 1978 } 1979 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); 1988 1989 uiout->field_signed ("disconnected", ts->disconnected_tracing); 1990 uiout->field_signed ("circular", ts->circular_buffer); 1991 1992 uiout->field_string ("user-name", ts->user_name); 1993 uiout->field_string ("notes", ts->notes); 1994 1995 { 1996 char buf[100]; 1997 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); 2006 } 2007 } 2008 2009 /* Check if a trace run is ongoing. If so, and FROM_TTY, query the 2010 user if she really wants to detach. */ 2011 2012 void 2013 query_if_trace_running (int from_tty) 2014 { 2015 if (!from_tty) 2016 return; 2017 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 2021 running anymore. */ 2022 if (target_get_trace_status (current_trace_status ()) < 0) 2023 current_trace_status ()->running = 0; 2024 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) 2031 { 2032 process_tracepoint_on_disconnect (); 2033 2034 if (current_trace_status ()->disconnected_tracing) 2035 { 2036 if (!query (_("Trace is running and will " 2037 "continue after detach; detach anyway? "))) 2038 error (_("Not confirmed.")); 2039 } 2040 else 2041 { 2042 if (!query (_("Trace is running but will " 2043 "stop on detach; detach anyway? "))) 2044 error (_("Not confirmed.")); 2045 } 2046 } 2047 } 2048 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 2051 from the target. */ 2052 2053 void 2054 disconnect_tracing (void) 2055 { 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 (); 2061 } 2062 2063 /* Worker function for the various flavors of the tfind command. */ 2064 void 2065 tfind_1 (enum trace_find_type type, int num, 2066 CORE_ADDR addr1, CORE_ADDR addr2, 2067 int from_tty) 2068 { 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; 2073 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 2079 trace frame. */ 2080 if (!(type == tfind_number && num == -1) 2081 && (has_stack_frames () || traceframe_number >= 0)) 2082 old_frame_id = get_frame_id (get_current_frame ()); 2083 2084 target_frameno = target_trace_find (type, num, addr1, addr2, 2085 &target_tracept); 2086 2087 if (type == tfind_number 2088 && num == -1 2089 && target_frameno == -1) 2090 { 2091 /* We told the target to get out of tfind mode, and it did. */ 2092 } 2093 else if (target_frameno == -1) 2094 { 2095 /* A request for a non-existent trace frame has failed. 2096 Our response will be different, depending on FROM_TTY: 2097 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. 2101 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. 2106 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 through the trace buffer until the end, 2114 and then continue on to do something else. */ 2115 2116 if (from_tty) 2117 error (_("Target failed to find requested trace frame.")); 2118 else 2119 { 2120 if (info_verbose) 2121 gdb_printf ("End of trace buffer.\n"); 2122 #if 0 /* dubious now? */ 2123 /* The following will not recurse, since it's 2124 special-cased. */ 2125 tfind_command ("-1", from_tty); 2126 #endif 2127 } 2128 } 2129 2130 tp = get_tracepoint_by_number_on_target (target_tracept); 2131 2132 reinit_frame_cache (); 2133 target_dcache_invalidate (current_program_space->aspace); 2134 2135 set_tracepoint_num (tp ? tp->number : target_tracept); 2136 2137 if (target_frameno != get_traceframe_number ()) 2138 interps_notify_traceframe_changed (target_frameno, tracepoint_number); 2139 2140 set_current_traceframe (target_frameno); 2141 2142 if (target_frameno == -1) 2143 set_traceframe_context (NULL); 2144 else 2145 set_traceframe_context (get_current_frame ()); 2146 2147 if (traceframe_number >= 0) 2148 { 2149 /* Use different branches for MI and CLI to make CLI messages 2150 i18n-eable. */ 2151 if (uiout->is_mi_like_p ()) 2152 { 2153 uiout->field_string ("found", "1"); 2154 uiout->field_signed ("tracepoint", tracepoint_number); 2155 uiout->field_signed ("traceframe", traceframe_number); 2156 } 2157 else 2158 { 2159 gdb_printf (_("Found trace frame %d, tracepoint %d\n"), 2160 traceframe_number, tracepoint_number); 2161 } 2162 } 2163 else 2164 { 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")); 2171 } 2172 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 2175 display. */ 2176 if (from_tty 2177 && (has_stack_frames () || traceframe_number >= 0)) 2178 { 2179 enum print_what print_what; 2180 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 2185 new source line. */ 2186 2187 if (old_frame_id == get_frame_id (get_current_frame ())) 2188 print_what = SRC_LINE; 2189 else 2190 print_what = SRC_AND_LOC; 2191 2192 print_stack_frame (get_selected_frame (NULL), 1, print_what, 1); 2193 do_displays (); 2194 } 2195 } 2196 2197 /* Error on looking at traceframes while trace is running. */ 2198 2199 void 2200 check_trace_running (struct trace_status *status) 2201 { 2202 if (status->running && status->filename == NULL) 2203 error (_("May not look at trace frames while trace is running.")); 2204 } 2205 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. 2211 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 2215 any combination of: 2216 F<hexnum> (gives the selected frame number) 2217 T<hexnum> (gives the selected tracepoint number) 2218 */ 2219 2220 /* tfind command */ 2221 static void 2222 tfind_command_1 (const char *args, int from_tty) 2223 { /* This should only be called with a numeric argument. */ 2224 int frameno = -1; 2225 2226 check_trace_running (current_trace_status ()); 2227 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. */ 2232 else 2233 frameno = traceframe_number + 1; 2234 } 2235 else if (0 == strcmp (args, "-")) 2236 { 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")); 2241 2242 frameno = traceframe_number - 1; 2243 } 2244 /* A hack to work around eval's need for fp to have been collected. */ 2245 else if (0 == strcmp (args, "-1")) 2246 frameno = -1; 2247 else 2248 frameno = parse_and_eval_long (args); 2249 2250 if (frameno < -1) 2251 error (_("invalid input (%d is less than zero)"), frameno); 2252 2253 tfind_1 (tfind_number, frameno, 0, 0, from_tty); 2254 } 2255 2256 static void 2257 tfind_command (const char *args, int from_tty) 2258 { 2259 tfind_command_1 (args, from_tty); 2260 } 2261 2262 /* tfind end */ 2263 static void 2264 tfind_end_command (const char *args, int from_tty) 2265 { 2266 tfind_command_1 ("-1", from_tty); 2267 } 2268 2269 /* tfind start */ 2270 static void 2271 tfind_start_command (const char *args, int from_tty) 2272 { 2273 tfind_command_1 ("0", from_tty); 2274 } 2275 2276 /* tfind pc command */ 2277 static void 2278 tfind_pc_command (const char *args, int from_tty) 2279 { 2280 CORE_ADDR pc; 2281 2282 check_trace_running (current_trace_status ()); 2283 2284 if (args == 0 || *args == 0) 2285 pc = regcache_read_pc (get_thread_regcache (inferior_thread ())); 2286 else 2287 pc = parse_and_eval_address (args); 2288 2289 tfind_1 (tfind_pc, 0, pc, 0, from_tty); 2290 } 2291 2292 /* tfind tracepoint command */ 2293 static void 2294 tfind_tracepoint_command (const char *args, int from_tty) 2295 { 2296 int tdp; 2297 struct tracepoint *tp; 2298 2299 check_trace_running (current_trace_status ()); 2300 2301 if (args == 0 || *args == 0) 2302 { 2303 if (tracepoint_number == -1) 2304 error (_("No current tracepoint -- please supply an argument.")); 2305 else 2306 tdp = tracepoint_number; /* Default is current TDP. */ 2307 } 2308 else 2309 tdp = parse_and_eval_long (args); 2310 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); 2315 if (tp) 2316 tdp = tp->number_on_target; 2317 2318 tfind_1 (tfind_tp, tdp, 0, 0, from_tty); 2319 } 2320 2321 /* TFIND LINE command: 2322 2323 This command will take a sourceline for argument, just like BREAK 2324 or TRACE (ie. anything that "decode_line_1" can handle). 2325 2326 With no argument, this command will find the next trace frame 2327 corresponding to a source line OTHER THAN THE CURRENT ONE. */ 2328 2329 static void 2330 tfind_line_command (const char *args, int from_tty) 2331 { 2332 check_trace_running (current_trace_status ()); 2333 2334 symtab_and_line sal; 2335 if (args == 0 || *args == 0) 2336 { 2337 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0); 2338 } 2339 else 2340 { 2341 std::vector<symtab_and_line> sals 2342 = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE); 2343 sal = sals[0]; 2344 } 2345 2346 if (sal.symtab == 0) 2347 error (_("No line number information available.")); 2348 2349 CORE_ADDR start_pc, end_pc; 2350 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc)) 2351 { 2352 if (start_pc == end_pc) 2353 { 2354 gdb_printf ("Line %ps of \"%s\"", 2355 styled_string (line_number_style.style (), 2356 pulongest (sal.line)), 2357 symtab_to_filename_for_display (sal.symtab)); 2358 gdb_stdout->wrap_here (2); 2359 gdb_printf (" is at address "); 2360 print_address (get_current_arch (), start_pc, gdb_stdout); 2361 gdb_stdout->wrap_here (2); 2362 gdb_printf (" but contains no code.\n"); 2363 sal = find_pc_line (start_pc, 0); 2364 if (sal.line > 0 2365 && find_line_pc_range (sal, &start_pc, &end_pc) 2366 && start_pc != end_pc) 2367 gdb_printf ("Attempting to find line %ps instead.\n", 2368 styled_string (line_number_style.style (), 2369 pulongest (sal.line))); 2370 else 2371 error (_("Cannot find a good line.")); 2372 } 2373 } 2374 else 2375 { 2376 /* Is there any case in which we get here, and have an address 2377 which the user would want to see? If we have debugging 2378 symbols and no line numbers? */ 2379 error (_("Line number %d is out of range for \"%s\"."), 2380 sal.line, symtab_to_filename_for_display (sal.symtab)); 2381 } 2382 2383 /* Find within range of stated line. */ 2384 if (args && *args) 2385 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty); 2386 else 2387 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty); 2388 } 2389 2390 /* tfind range command */ 2391 static void 2392 tfind_range_command (const char *args, int from_tty) 2393 { 2394 static CORE_ADDR start, stop; 2395 const char *tmp; 2396 2397 check_trace_running (current_trace_status ()); 2398 2399 if (args == 0 || *args == 0) 2400 { /* XXX FIXME: what should default behavior be? */ 2401 gdb_printf ("Usage: tfind range STARTADDR, ENDADDR\n"); 2402 return; 2403 } 2404 2405 if (0 != (tmp = strchr (args, ','))) 2406 { 2407 std::string start_addr (args, tmp); 2408 ++tmp; 2409 tmp = skip_spaces (tmp); 2410 start = parse_and_eval_address (start_addr.c_str ()); 2411 stop = parse_and_eval_address (tmp); 2412 } 2413 else 2414 { /* No explicit end address? */ 2415 start = parse_and_eval_address (args); 2416 stop = start + 1; /* ??? */ 2417 } 2418 2419 tfind_1 (tfind_range, 0, start, stop, from_tty); 2420 } 2421 2422 /* tfind outside command */ 2423 static void 2424 tfind_outside_command (const char *args, int from_tty) 2425 { 2426 CORE_ADDR start, stop; 2427 const char *tmp; 2428 2429 if (current_trace_status ()->running 2430 && current_trace_status ()->filename == NULL) 2431 error (_("May not look at trace frames while trace is running.")); 2432 2433 if (args == 0 || *args == 0) 2434 { /* XXX FIXME: what should default behavior be? */ 2435 gdb_printf ("Usage: tfind outside STARTADDR, ENDADDR\n"); 2436 return; 2437 } 2438 2439 if (0 != (tmp = strchr (args, ','))) 2440 { 2441 std::string start_addr (args, tmp); 2442 ++tmp; 2443 tmp = skip_spaces (tmp); 2444 start = parse_and_eval_address (start_addr.c_str ()); 2445 stop = parse_and_eval_address (tmp); 2446 } 2447 else 2448 { /* No explicit end address? */ 2449 start = parse_and_eval_address (args); 2450 stop = start + 1; /* ??? */ 2451 } 2452 2453 tfind_1 (tfind_outside, 0, start, stop, from_tty); 2454 } 2455 2456 /* info scope command: list the locals for a scope. */ 2457 static void 2458 info_scope_command (const char *args_in, int from_tty) 2459 { 2460 const struct block *block; 2461 const char *symname; 2462 const char *save_args = args_in; 2463 int j, count = 0; 2464 struct gdbarch *gdbarch; 2465 int regno; 2466 const char *args = args_in; 2467 2468 if (args == 0 || *args == 0) 2469 error (_("requires an argument (function, " 2470 "line or *addr) to define a scope")); 2471 2472 location_spec_up locspec = string_to_location_spec (&args, 2473 current_language); 2474 std::vector<symtab_and_line> sals 2475 = decode_line_1 (locspec.get (), DECODE_LINE_FUNFIRSTLINE, 2476 NULL, NULL, 0); 2477 if (sals.empty ()) 2478 { 2479 /* Presumably decode_line_1 has already warned. */ 2480 return; 2481 } 2482 2483 /* Resolve line numbers to PC. */ 2484 resolve_sal_pc (&sals[0]); 2485 block = block_for_pc (sals[0].pc); 2486 2487 while (block != 0) 2488 { 2489 QUIT; /* Allow user to bail out with ^C. */ 2490 for (struct symbol *sym : block_iterator_range (block)) 2491 { 2492 QUIT; /* Allow user to bail out with ^C. */ 2493 if (count == 0) 2494 gdb_printf ("Scope for %s:\n", save_args); 2495 count++; 2496 2497 symname = sym->print_name (); 2498 if (symname == NULL || *symname == '\0') 2499 continue; /* Probably botched, certainly useless. */ 2500 2501 gdbarch = sym->arch (); 2502 2503 gdb_printf ("Symbol %s is ", symname); 2504 2505 if (const symbol_computed_ops *computed_ops = sym->computed_ops (); 2506 computed_ops != nullptr) 2507 computed_ops->describe_location (sym, block->entry_pc (), 2508 gdb_stdout); 2509 else 2510 { 2511 switch (sym->aclass ()) 2512 { 2513 default: 2514 case LOC_UNDEF: /* Messed up symbol? */ 2515 gdb_printf ("a bogus symbol, class %d.\n", 2516 sym->aclass ()); 2517 count--; /* Don't count this one. */ 2518 continue; 2519 case LOC_CONST: 2520 gdb_printf ("a constant with value %s (%s)", 2521 plongest (sym->value_longest ()), 2522 hex_string (sym->value_longest ())); 2523 break; 2524 case LOC_CONST_BYTES: 2525 gdb_printf ("constant bytes: "); 2526 if (sym->type ()) 2527 for (j = 0; j < sym->type ()->length (); j++) 2528 gdb_printf (" %02x", (unsigned) sym->value_bytes ()[j]); 2529 break; 2530 case LOC_STATIC: 2531 gdb_printf ("in static storage at address "); 2532 gdb_printf ("%s", paddress (gdbarch, sym->value_address ())); 2533 break; 2534 case LOC_REGISTER: 2535 /* GDBARCH is the architecture associated with the objfile 2536 the symbol is defined in; the target architecture may be 2537 different, and may provide additional registers. However, 2538 we do not know the target architecture at this point. 2539 We assume the objfile architecture will contain all the 2540 standard registers that occur in debug info in that 2541 objfile. */ 2542 regno = sym->register_ops ()->register_number (sym, gdbarch); 2543 2544 if (sym->is_argument ()) 2545 gdb_printf ("an argument in register $%s", 2546 gdbarch_register_name (gdbarch, regno)); 2547 else 2548 gdb_printf ("a local variable in register $%s", 2549 gdbarch_register_name (gdbarch, regno)); 2550 break; 2551 case LOC_ARG: 2552 gdb_printf ("an argument at stack/frame offset %s", 2553 plongest (sym->value_longest ())); 2554 break; 2555 case LOC_LOCAL: 2556 gdb_printf ("a local variable at frame offset %s", 2557 plongest (sym->value_longest ())); 2558 break; 2559 case LOC_REF_ARG: 2560 gdb_printf ("a reference argument at offset %s", 2561 plongest (sym->value_longest ())); 2562 break; 2563 case LOC_REGPARM_ADDR: 2564 /* Note comment at LOC_REGISTER. */ 2565 regno = sym->register_ops ()->register_number (sym, gdbarch); 2566 gdb_printf ("the address of an argument, in register $%s", 2567 gdbarch_register_name (gdbarch, regno)); 2568 break; 2569 case LOC_TYPEDEF: 2570 gdb_printf ("a typedef.\n"); 2571 continue; 2572 case LOC_LABEL: 2573 gdb_printf ("a label at address "); 2574 gdb_printf ("%s", paddress (gdbarch, sym->value_address ())); 2575 break; 2576 case LOC_BLOCK: 2577 gdb_printf ("a function at address "); 2578 gdb_printf ("%s", 2579 paddress (gdbarch, 2580 sym->value_block ()->entry_pc ())); 2581 break; 2582 case LOC_UNRESOLVED: 2583 { 2584 bound_minimal_symbol msym 2585 = lookup_minimal_symbol (current_program_space, 2586 sym->linkage_name ()); 2587 if (msym.minsym == NULL) 2588 gdb_printf ("Unresolved Static"); 2589 else 2590 { 2591 gdb_printf ("static storage at address "); 2592 gdb_printf ("%s", 2593 paddress (gdbarch, msym.value_address ())); 2594 } 2595 break; 2596 } 2597 case LOC_OPTIMIZED_OUT: 2598 gdb_printf ("optimized out.\n"); 2599 continue; 2600 case LOC_COMPUTED: 2601 gdb_assert_not_reached ("LOC_COMPUTED variable missing a method"); 2602 } 2603 } 2604 if (sym->type ()) 2605 { 2606 struct type *t = check_typedef (sym->type ()); 2607 2608 gdb_printf (", length %s.\n", pulongest (t->length ())); 2609 } 2610 } 2611 if (block->function ()) 2612 break; 2613 else 2614 block = block->superblock (); 2615 } 2616 if (count <= 0) 2617 gdb_printf ("Scope for %s contains no locals or arguments.\n", 2618 save_args); 2619 } 2620 2621 /* Helper for trace_dump_command. Dump the action list starting at 2622 ACTION. STEPPING_ACTIONS is true if we're iterating over the 2623 actions of the body of a while-stepping action. STEPPING_FRAME is 2624 set if the current traceframe was determined to be a while-stepping 2625 traceframe. */ 2626 2627 static void 2628 trace_dump_actions (struct command_line *action, 2629 int stepping_actions, int stepping_frame, 2630 int from_tty) 2631 { 2632 const char *action_exp, *next_comma; 2633 2634 for (; action != NULL; action = action->next) 2635 { 2636 struct cmd_list_element *cmd; 2637 2638 QUIT; /* Allow user to bail out with ^C. */ 2639 action_exp = action->line; 2640 action_exp = skip_spaces (action_exp); 2641 2642 /* The collection actions to be done while stepping are 2643 bracketed by the commands "while-stepping" and "end". */ 2644 2645 if (*action_exp == '#') /* comment line */ 2646 continue; 2647 2648 cmd = lookup_cmd (&action_exp, cmdlist, "", NULL, -1, 1); 2649 if (cmd == 0) 2650 error (_("Bad action list item: %s"), action_exp); 2651 2652 if (cmd_simple_func_eq (cmd, while_stepping_pseudocommand)) 2653 { 2654 gdb_assert (action->body_list_1 == nullptr); 2655 trace_dump_actions (action->body_list_0.get (), 2656 1, stepping_frame, from_tty); 2657 } 2658 else if (cmd_simple_func_eq (cmd, collect_pseudocommand)) 2659 { 2660 /* Display the collected data. 2661 For the trap frame, display only what was collected at 2662 the trap. Likewise for stepping frames, display only 2663 what was collected while stepping. This means that the 2664 two boolean variables, STEPPING_FRAME and 2665 STEPPING_ACTIONS should be equal. */ 2666 if (stepping_frame == stepping_actions) 2667 { 2668 int trace_string = 0; 2669 2670 if (*action_exp == '/') 2671 action_exp = decode_agent_options (action_exp, &trace_string); 2672 2673 do 2674 { /* Repeat over a comma-separated list. */ 2675 QUIT; /* Allow user to bail out with ^C. */ 2676 if (*action_exp == ',') 2677 action_exp++; 2678 action_exp = skip_spaces (action_exp); 2679 2680 next_comma = strchr (action_exp, ','); 2681 2682 if (0 == strncasecmp (action_exp, "$reg", 4)) 2683 registers_info (NULL, from_tty); 2684 else if (0 == strncasecmp (action_exp, "$_ret", 5)) 2685 ; 2686 else if (0 == strncasecmp (action_exp, "$loc", 4)) 2687 info_locals_command (NULL, from_tty); 2688 else if (0 == strncasecmp (action_exp, "$arg", 4)) 2689 info_args_command (NULL, from_tty); 2690 else 2691 { /* variable */ 2692 std::string contents; 2693 const char *exp = action_exp; 2694 if (next_comma != NULL) 2695 { 2696 size_t len = next_comma - action_exp; 2697 contents = std::string (action_exp, len); 2698 exp = contents.c_str (); 2699 } 2700 2701 gdb_printf ("%s = ", exp); 2702 output_command (exp, from_tty); 2703 gdb_printf ("\n"); 2704 } 2705 action_exp = next_comma; 2706 } 2707 while (action_exp && *action_exp == ','); 2708 } 2709 } 2710 } 2711 } 2712 2713 /* Return bp_location of the tracepoint associated with the current 2714 traceframe. Set *STEPPING_FRAME_P to 1 if the current traceframe 2715 is a stepping traceframe. */ 2716 2717 struct bp_location * 2718 get_traceframe_location (int *stepping_frame_p) 2719 { 2720 struct tracepoint *t; 2721 struct regcache *regcache; 2722 2723 if (tracepoint_number == -1) 2724 error (_("No current trace frame.")); 2725 2726 t = get_tracepoint (tracepoint_number); 2727 2728 if (t == NULL) 2729 error (_("No known tracepoint matches 'current' tracepoint #%d."), 2730 tracepoint_number); 2731 2732 /* The current frame is a trap frame if the frame PC is equal to the 2733 tracepoint PC. If not, then the current frame was collected 2734 during single-stepping. */ 2735 regcache = get_thread_regcache (inferior_thread ()); 2736 2737 /* If the traceframe's address matches any of the tracepoint's 2738 locations, assume it is a direct hit rather than a while-stepping 2739 frame. (FIXME this is not reliable, should record each frame's 2740 type.) */ 2741 for (bp_location &tloc : t->locations ()) 2742 if (tloc.address == regcache_read_pc (regcache)) 2743 { 2744 *stepping_frame_p = 0; 2745 return &tloc; 2746 } 2747 2748 /* If this is a stepping frame, we don't know which location 2749 triggered. The first is as good (or bad) a guess as any... */ 2750 *stepping_frame_p = 1; 2751 return &t->first_loc (); 2752 } 2753 2754 /* Return the default collect actions of a tracepoint T. */ 2755 2756 static counted_command_line 2757 all_tracepoint_actions (tracepoint *t) 2758 { 2759 counted_command_line actions (nullptr, command_lines_deleter ()); 2760 2761 /* If there are default expressions to collect, make up a collect 2762 action and prepend to the action list to encode. Note that since 2763 validation is per-tracepoint (local var "xyz" might be valid for 2764 one tracepoint and not another, etc), we make up the action on 2765 the fly, and don't cache it. */ 2766 if (!default_collect.empty ()) 2767 { 2768 gdb::unique_xmalloc_ptr<char> default_collect_line 2769 = xstrprintf ("collect %s", default_collect.c_str ()); 2770 2771 validate_actionline (default_collect_line.get (), t); 2772 actions.reset (new struct command_line (simple_control, 2773 default_collect_line.release ()), 2774 command_lines_deleter ()); 2775 } 2776 2777 return actions; 2778 } 2779 2780 /* The tdump command. */ 2781 2782 static void 2783 tdump_command (const char *args, int from_tty) 2784 { 2785 int stepping_frame = 0; 2786 struct bp_location *loc; 2787 2788 /* This throws an error is not inspecting a trace frame. */ 2789 loc = get_traceframe_location (&stepping_frame); 2790 2791 gdb_printf ("Data collected at tracepoint %d, trace frame %d:\n", 2792 tracepoint_number, traceframe_number); 2793 2794 /* This command only makes sense for the current frame, not the 2795 selected frame. */ 2796 scoped_restore_current_thread restore_thread; 2797 2798 select_frame (get_current_frame ()); 2799 2800 tracepoint *t = gdb::checked_static_cast<tracepoint *> (loc->owner); 2801 counted_command_line actions = all_tracepoint_actions (t); 2802 2803 trace_dump_actions (actions.get (), 0, stepping_frame, from_tty); 2804 trace_dump_actions (breakpoint_commands (loc->owner), 0, stepping_frame, 2805 from_tty); 2806 } 2807 2808 /* Encode a piece of a tracepoint's source-level definition in a form 2809 that is suitable for both protocol and saving in files. */ 2810 /* This version does not do multiple encodes for long strings; it should 2811 return an offset to the next piece to encode. FIXME */ 2812 2813 int 2814 encode_source_string (int tpnum, ULONGEST addr, 2815 const char *srctype, const char *src, 2816 char *buf, int buf_size) 2817 { 2818 if (80 + strlen (srctype) > buf_size) 2819 error (_("Buffer too small for source encoding")); 2820 sprintf (buf, "%x:%s:%s:%x:%x:", 2821 tpnum, phex_nz (addr, sizeof (addr)), 2822 srctype, 0, (int) strlen (src)); 2823 if (strlen (buf) + strlen (src) * 2 >= buf_size) 2824 error (_("Source string too long for buffer")); 2825 bin2hex ((gdb_byte *) src, buf + strlen (buf), strlen (src)); 2826 return -1; 2827 } 2828 2829 /* Tell the target what to do with an ongoing tracing run if GDB 2830 disconnects for some reason. */ 2831 2832 static void 2833 set_disconnected_tracing (const char *args, int from_tty, 2834 struct cmd_list_element *c) 2835 { 2836 target_set_disconnected_tracing (disconnected_tracing); 2837 } 2838 2839 static void 2840 set_circular_trace_buffer (const char *args, int from_tty, 2841 struct cmd_list_element *c) 2842 { 2843 target_set_circular_trace_buffer (circular_trace_buffer); 2844 } 2845 2846 static void 2847 set_trace_buffer_size (const char *args, int from_tty, 2848 struct cmd_list_element *c) 2849 { 2850 target_set_trace_buffer_size (trace_buffer_size); 2851 } 2852 2853 static void 2854 set_trace_user (const char *args, int from_tty, 2855 struct cmd_list_element *c) 2856 { 2857 int ret; 2858 2859 ret = target_set_trace_notes (trace_user.c_str (), NULL, NULL); 2860 2861 if (!ret) 2862 warning (_("Target does not support trace notes, user ignored")); 2863 } 2864 2865 static void 2866 set_trace_notes (const char *args, int from_tty, 2867 struct cmd_list_element *c) 2868 { 2869 int ret; 2870 2871 ret = target_set_trace_notes (NULL, trace_notes.c_str (), NULL); 2872 2873 if (!ret) 2874 warning (_("Target does not support trace notes, note ignored")); 2875 } 2876 2877 static void 2878 set_trace_stop_notes (const char *args, int from_tty, 2879 struct cmd_list_element *c) 2880 { 2881 int ret; 2882 2883 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes.c_str ()); 2884 2885 if (!ret) 2886 warning (_("Target does not support trace notes, stop note ignored")); 2887 } 2888 2889 int 2890 get_traceframe_number (void) 2891 { 2892 return traceframe_number; 2893 } 2894 2895 int 2896 get_tracepoint_number (void) 2897 { 2898 return tracepoint_number; 2899 } 2900 2901 /* Make the traceframe NUM be the current trace frame. Does nothing 2902 if NUM is already current. */ 2903 2904 void 2905 set_current_traceframe (int num) 2906 { 2907 int newnum; 2908 2909 if (traceframe_number == num) 2910 { 2911 /* Nothing to do. */ 2912 return; 2913 } 2914 2915 newnum = target_trace_find (tfind_number, num, 0, 0, NULL); 2916 2917 if (newnum != num) 2918 warning (_("could not change traceframe")); 2919 2920 set_traceframe_num (newnum); 2921 2922 /* Changing the traceframe changes our view of registers and of the 2923 frame chain. */ 2924 registers_changed (); 2925 2926 clear_traceframe_info (); 2927 } 2928 2929 scoped_restore_current_traceframe::scoped_restore_current_traceframe () 2930 : m_traceframe_number (traceframe_number) 2931 {} 2932 2933 /* Given a number and address, return an uploaded tracepoint with that 2934 number, creating if necessary. */ 2935 2936 struct uploaded_tp * 2937 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp) 2938 { 2939 struct uploaded_tp *utp; 2940 2941 for (utp = *utpp; utp; utp = utp->next) 2942 if (utp->number == num && utp->addr == addr) 2943 return utp; 2944 2945 utp = new uploaded_tp; 2946 utp->number = num; 2947 utp->addr = addr; 2948 utp->next = *utpp; 2949 *utpp = utp; 2950 2951 return utp; 2952 } 2953 2954 void 2955 free_uploaded_tps (struct uploaded_tp **utpp) 2956 { 2957 struct uploaded_tp *next_one; 2958 2959 while (*utpp) 2960 { 2961 next_one = (*utpp)->next; 2962 delete *utpp; 2963 *utpp = next_one; 2964 } 2965 } 2966 2967 /* Given a number and address, return an uploaded tracepoint with that 2968 number, creating if necessary. */ 2969 2970 struct uploaded_tsv * 2971 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp) 2972 { 2973 struct uploaded_tsv *utsv; 2974 2975 for (utsv = *utsvp; utsv; utsv = utsv->next) 2976 if (utsv->number == num) 2977 return utsv; 2978 2979 utsv = XCNEW (struct uploaded_tsv); 2980 utsv->number = num; 2981 utsv->next = *utsvp; 2982 *utsvp = utsv; 2983 2984 return utsv; 2985 } 2986 2987 void 2988 free_uploaded_tsvs (struct uploaded_tsv **utsvp) 2989 { 2990 struct uploaded_tsv *next_one; 2991 2992 while (*utsvp) 2993 { 2994 next_one = (*utsvp)->next; 2995 xfree (*utsvp); 2996 *utsvp = next_one; 2997 } 2998 } 2999 3000 /* FIXME this function is heuristic and will miss the cases where the 3001 conditional is semantically identical but differs in whitespace, 3002 such as "x == 0" vs "x==0". */ 3003 3004 static int 3005 cond_string_is_same (char *str1, char *str2) 3006 { 3007 if (str1 == NULL || str2 == NULL) 3008 return (str1 == str2); 3009 3010 return (strcmp (str1, str2) == 0); 3011 } 3012 3013 /* Look for an existing tracepoint that seems similar enough to the 3014 uploaded one. Enablement isn't compared, because the user can 3015 toggle that freely, and may have done so in anticipation of the 3016 next trace run. Return the location of matched tracepoint. */ 3017 3018 static struct bp_location * 3019 find_matching_tracepoint_location (struct uploaded_tp *utp) 3020 { 3021 for (breakpoint &b : all_tracepoints ()) 3022 { 3023 tracepoint &t = gdb::checked_static_cast<tracepoint &> (b); 3024 3025 if (b.type == utp->type 3026 && t.step_count == utp->step 3027 && t.pass_count == utp->pass 3028 && cond_string_is_same (t.cond_string.get (), 3029 utp->cond_string.get ()) 3030 /* FIXME also test actions. */ 3031 ) 3032 { 3033 /* Scan the locations for an address match. */ 3034 for (bp_location &loc : b.locations ()) 3035 if (loc.address == utp->addr) 3036 return &loc; 3037 } 3038 } 3039 return NULL; 3040 } 3041 3042 /* Given a list of tracepoints uploaded from a target, attempt to 3043 match them up with existing tracepoints, and create new ones if not 3044 found. */ 3045 3046 void 3047 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps) 3048 { 3049 struct uploaded_tp *utp; 3050 /* A set of tracepoints which are modified. */ 3051 std::vector<breakpoint *> modified_tp; 3052 3053 /* Look for GDB tracepoints that match up with our uploaded versions. */ 3054 for (utp = *uploaded_tps; utp; utp = utp->next) 3055 { 3056 struct bp_location *loc; 3057 struct tracepoint *t; 3058 3059 loc = find_matching_tracepoint_location (utp); 3060 if (loc) 3061 { 3062 int found = 0; 3063 3064 /* Mark this location as already inserted. */ 3065 loc->inserted = 1; 3066 t = gdb::checked_static_cast<tracepoint *> (loc->owner); 3067 gdb_printf (_("Assuming tracepoint %d is same " 3068 "as target's tracepoint %d at %s.\n"), 3069 loc->owner->number, utp->number, 3070 paddress (loc->gdbarch, utp->addr)); 3071 3072 /* The tracepoint LOC->owner was modified (the location LOC 3073 was marked as inserted in the target). Save it in 3074 MODIFIED_TP if not there yet. The 'breakpoint-modified' 3075 observers will be notified later once for each tracepoint 3076 saved in MODIFIED_TP. */ 3077 for (breakpoint *b : modified_tp) 3078 if (b == loc->owner) 3079 { 3080 found = 1; 3081 break; 3082 } 3083 if (!found) 3084 modified_tp.push_back (loc->owner); 3085 } 3086 else 3087 { 3088 t = create_tracepoint_from_upload (utp); 3089 if (t) 3090 gdb_printf (_("Created tracepoint %d for " 3091 "target's tracepoint %d at %s.\n"), 3092 t->number, utp->number, 3093 paddress (get_current_arch (), utp->addr)); 3094 else 3095 gdb_printf (_("Failed to create tracepoint for target's " 3096 "tracepoint %d at %s, skipping it.\n"), 3097 utp->number, 3098 paddress (get_current_arch (), utp->addr)); 3099 } 3100 /* Whether found or created, record the number used by the 3101 target, to help with mapping target tracepoints back to their 3102 counterparts here. */ 3103 if (t) 3104 t->number_on_target = utp->number; 3105 } 3106 3107 /* Notify 'breakpoint-modified' observer that at least one of B's 3108 locations was changed. */ 3109 for (breakpoint *b : modified_tp) 3110 notify_breakpoint_modified (b); 3111 3112 free_uploaded_tps (uploaded_tps); 3113 } 3114 3115 /* Trace state variables don't have much to identify them beyond their 3116 name, so just use that to detect matches. */ 3117 3118 static struct trace_state_variable * 3119 find_matching_tsv (struct uploaded_tsv *utsv) 3120 { 3121 if (!utsv->name) 3122 return NULL; 3123 3124 return find_trace_state_variable (utsv->name); 3125 } 3126 3127 static struct trace_state_variable * 3128 create_tsv_from_upload (struct uploaded_tsv *utsv) 3129 { 3130 const char *namebase; 3131 std::string buf; 3132 int try_num = 0; 3133 struct trace_state_variable *tsv; 3134 3135 if (utsv->name) 3136 { 3137 namebase = utsv->name; 3138 buf = namebase; 3139 } 3140 else 3141 { 3142 namebase = "__tsv"; 3143 buf = string_printf ("%s_%d", namebase, try_num++); 3144 } 3145 3146 /* Fish for a name that is not in use. */ 3147 /* (should check against all internal vars?) */ 3148 while (find_trace_state_variable (buf.c_str ())) 3149 buf = string_printf ("%s_%d", namebase, try_num++); 3150 3151 /* We have an available name, create the variable. */ 3152 tsv = create_trace_state_variable (buf.c_str ()); 3153 tsv->initial_value = utsv->initial_value; 3154 tsv->builtin = utsv->builtin; 3155 3156 interps_notify_tsv_created (tsv); 3157 3158 return tsv; 3159 } 3160 3161 /* Given a list of uploaded trace state variables, try to match them 3162 up with existing variables, or create additional ones. */ 3163 3164 void 3165 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs) 3166 { 3167 struct uploaded_tsv *utsv; 3168 int highest; 3169 3170 /* Most likely some numbers will have to be reassigned as part of 3171 the merge, so clear them all in anticipation. */ 3172 for (trace_state_variable &tsv : tvariables) 3173 tsv.number = 0; 3174 3175 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next) 3176 { 3177 struct trace_state_variable *tsv = find_matching_tsv (utsv); 3178 if (tsv) 3179 { 3180 if (info_verbose) 3181 gdb_printf (_("Assuming trace state variable $%s " 3182 "is same as target's variable %d.\n"), 3183 tsv->name.c_str (), utsv->number); 3184 } 3185 else 3186 { 3187 tsv = create_tsv_from_upload (utsv); 3188 if (info_verbose) 3189 gdb_printf (_("Created trace state variable " 3190 "$%s for target's variable %d.\n"), 3191 tsv->name.c_str (), utsv->number); 3192 } 3193 /* Give precedence to numberings that come from the target. */ 3194 if (tsv) 3195 tsv->number = utsv->number; 3196 } 3197 3198 /* Renumber everything that didn't get a target-assigned number. */ 3199 highest = 0; 3200 for (const trace_state_variable &tsv : tvariables) 3201 highest = std::max (tsv.number, highest); 3202 3203 ++highest; 3204 for (trace_state_variable &tsv : tvariables) 3205 if (tsv.number == 0) 3206 tsv.number = highest++; 3207 3208 free_uploaded_tsvs (uploaded_tsvs); 3209 } 3210 3211 /* Parse the part of trace status syntax that is shared between 3212 the remote protocol and the trace file reader. */ 3213 3214 void 3215 parse_trace_status (const char *line, struct trace_status *ts) 3216 { 3217 const char *p = line, *p1, *p2, *p3, *p_temp; 3218 int end; 3219 ULONGEST val; 3220 3221 ts->running_known = 1; 3222 ts->running = (*p++ == '1'); 3223 ts->stop_reason = trace_stop_reason_unknown; 3224 xfree (ts->stop_desc); 3225 ts->stop_desc = NULL; 3226 ts->traceframe_count = -1; 3227 ts->traceframes_created = -1; 3228 ts->buffer_free = -1; 3229 ts->buffer_size = -1; 3230 ts->disconnected_tracing = 0; 3231 ts->circular_buffer = 0; 3232 xfree (ts->user_name); 3233 ts->user_name = NULL; 3234 xfree (ts->notes); 3235 ts->notes = NULL; 3236 ts->start_time = ts->stop_time = 0; 3237 3238 while (*p++) 3239 { 3240 p1 = strchr (p, ':'); 3241 if (p1 == NULL) 3242 error (_("Malformed trace status, at %s\n\ 3243 Status line: '%s'\n"), p, line); 3244 p3 = strchr (p, ';'); 3245 if (p3 == NULL) 3246 p3 = p + strlen (p); 3247 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0) 3248 { 3249 p = unpack_varlen_hex (++p1, &val); 3250 ts->stop_reason = trace_buffer_full; 3251 } 3252 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0) 3253 { 3254 p = unpack_varlen_hex (++p1, &val); 3255 ts->stop_reason = trace_never_run; 3256 } 3257 else if (strncmp (p, stop_reason_names[tracepoint_passcount], 3258 p1 - p) == 0) 3259 { 3260 p = unpack_varlen_hex (++p1, &val); 3261 ts->stop_reason = tracepoint_passcount; 3262 ts->stopping_tracepoint = val; 3263 } 3264 else if (strncmp (p, stop_reason_names[trace_stop_command], p1 - p) == 0) 3265 { 3266 p2 = strchr (++p1, ':'); 3267 if (!p2 || p2 > p3) 3268 { 3269 /*older style*/ 3270 p2 = p1; 3271 } 3272 else if (p2 != p1) 3273 { 3274 ts->stop_desc = (char *) xmalloc (strlen (line)); 3275 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2); 3276 ts->stop_desc[end] = '\0'; 3277 } 3278 else 3279 ts->stop_desc = xstrdup (""); 3280 3281 p = unpack_varlen_hex (++p2, &val); 3282 ts->stop_reason = trace_stop_command; 3283 } 3284 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0) 3285 { 3286 p = unpack_varlen_hex (++p1, &val); 3287 ts->stop_reason = trace_disconnected; 3288 } 3289 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0) 3290 { 3291 p2 = strchr (++p1, ':'); 3292 if (p2 != p1) 3293 { 3294 ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1); 3295 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2); 3296 ts->stop_desc[end] = '\0'; 3297 } 3298 else 3299 ts->stop_desc = xstrdup (""); 3300 3301 p = unpack_varlen_hex (++p2, &val); 3302 ts->stopping_tracepoint = val; 3303 ts->stop_reason = tracepoint_error; 3304 } 3305 else if (strncmp (p, "tframes", p1 - p) == 0) 3306 { 3307 p = unpack_varlen_hex (++p1, &val); 3308 ts->traceframe_count = val; 3309 } 3310 else if (strncmp (p, "tcreated", p1 - p) == 0) 3311 { 3312 p = unpack_varlen_hex (++p1, &val); 3313 ts->traceframes_created = val; 3314 } 3315 else if (strncmp (p, "tfree", p1 - p) == 0) 3316 { 3317 p = unpack_varlen_hex (++p1, &val); 3318 ts->buffer_free = val; 3319 } 3320 else if (strncmp (p, "tsize", p1 - p) == 0) 3321 { 3322 p = unpack_varlen_hex (++p1, &val); 3323 ts->buffer_size = val; 3324 } 3325 else if (strncmp (p, "disconn", p1 - p) == 0) 3326 { 3327 p = unpack_varlen_hex (++p1, &val); 3328 ts->disconnected_tracing = val; 3329 } 3330 else if (strncmp (p, "circular", p1 - p) == 0) 3331 { 3332 p = unpack_varlen_hex (++p1, &val); 3333 ts->circular_buffer = val; 3334 } 3335 else if (strncmp (p, "starttime", p1 - p) == 0) 3336 { 3337 p = unpack_varlen_hex (++p1, &val); 3338 ts->start_time = val; 3339 } 3340 else if (strncmp (p, "stoptime", p1 - p) == 0) 3341 { 3342 p = unpack_varlen_hex (++p1, &val); 3343 ts->stop_time = val; 3344 } 3345 else if (strncmp (p, "username", p1 - p) == 0) 3346 { 3347 ++p1; 3348 ts->user_name = (char *) xmalloc (strlen (p) / 2); 3349 end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1) / 2); 3350 ts->user_name[end] = '\0'; 3351 p = p3; 3352 } 3353 else if (strncmp (p, "notes", p1 - p) == 0) 3354 { 3355 ++p1; 3356 ts->notes = (char *) xmalloc (strlen (p) / 2); 3357 end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2); 3358 ts->notes[end] = '\0'; 3359 p = p3; 3360 } 3361 else 3362 { 3363 /* Silently skip unknown optional info. */ 3364 p_temp = strchr (p1 + 1, ';'); 3365 if (p_temp) 3366 p = p_temp; 3367 else 3368 /* Must be at the end. */ 3369 break; 3370 } 3371 } 3372 } 3373 3374 void 3375 parse_tracepoint_status (const char *p, tracepoint *tp, 3376 struct uploaded_tp *utp) 3377 { 3378 ULONGEST uval; 3379 3380 p = unpack_varlen_hex (p, &uval); 3381 if (tp) 3382 tp->hit_count += uval; 3383 else 3384 utp->hit_count += uval; 3385 p = unpack_varlen_hex (p + 1, &uval); 3386 if (tp) 3387 tp->traceframe_usage += uval; 3388 else 3389 utp->traceframe_usage += uval; 3390 /* Ignore any extra, allowing for future extensions. */ 3391 } 3392 3393 /* Given a line of text defining a part of a tracepoint, parse it into 3394 an "uploaded tracepoint". */ 3395 3396 void 3397 parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp) 3398 { 3399 const char *p; 3400 char piece; 3401 ULONGEST num, addr, step, pass, orig_size, xlen, start; 3402 int enabled, end; 3403 enum bptype type; 3404 const char *srctype; 3405 char *buf; 3406 struct uploaded_tp *utp = NULL; 3407 3408 p = line; 3409 /* Both tracepoint and action definitions start with the same number 3410 and address sequence. */ 3411 piece = *p++; 3412 p = unpack_varlen_hex (p, &num); 3413 p++; /* skip a colon */ 3414 p = unpack_varlen_hex (p, &addr); 3415 p++; /* skip a colon */ 3416 if (piece == 'T') 3417 { 3418 gdb::unique_xmalloc_ptr<char[]> cond; 3419 3420 enabled = (*p++ == 'E'); 3421 p++; /* skip a colon */ 3422 p = unpack_varlen_hex (p, &step); 3423 p++; /* skip a colon */ 3424 p = unpack_varlen_hex (p, &pass); 3425 type = bp_tracepoint; 3426 /* Thumb through optional fields. */ 3427 while (*p == ':') 3428 { 3429 p++; /* skip a colon */ 3430 if (*p == 'F') 3431 { 3432 type = bp_fast_tracepoint; 3433 p++; 3434 p = unpack_varlen_hex (p, &orig_size); 3435 } 3436 else if (*p == 'S') 3437 { 3438 type = bp_static_tracepoint; 3439 p++; 3440 } 3441 else if (*p == 'X') 3442 { 3443 p++; 3444 p = unpack_varlen_hex (p, &xlen); 3445 p++; /* skip a comma */ 3446 cond.reset ((char *) xmalloc (2 * xlen + 1)); 3447 strncpy (&cond[0], p, 2 * xlen); 3448 cond[2 * xlen] = '\0'; 3449 p += 2 * xlen; 3450 } 3451 else 3452 warning (_("Unrecognized char '%c' in tracepoint " 3453 "definition, skipping rest"), *p); 3454 } 3455 utp = get_uploaded_tp (num, addr, utpp); 3456 utp->type = type; 3457 utp->enabled = enabled; 3458 utp->step = step; 3459 utp->pass = pass; 3460 utp->cond = std::move (cond); 3461 } 3462 else if (piece == 'A') 3463 { 3464 utp = get_uploaded_tp (num, addr, utpp); 3465 utp->actions.emplace_back (xstrdup (p)); 3466 } 3467 else if (piece == 'S') 3468 { 3469 utp = get_uploaded_tp (num, addr, utpp); 3470 utp->step_actions.emplace_back (xstrdup (p)); 3471 } 3472 else if (piece == 'Z') 3473 { 3474 /* Parse a chunk of source form definition. */ 3475 utp = get_uploaded_tp (num, addr, utpp); 3476 srctype = p; 3477 p = strchr (p, ':'); 3478 p++; /* skip a colon */ 3479 p = unpack_varlen_hex (p, &start); 3480 p++; /* skip a colon */ 3481 p = unpack_varlen_hex (p, &xlen); 3482 p++; /* skip a colon */ 3483 3484 buf = (char *) alloca (strlen (line)); 3485 3486 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2); 3487 buf[end] = '\0'; 3488 3489 if (startswith (srctype, "at:")) 3490 utp->at_string.reset (xstrdup (buf)); 3491 else if (startswith (srctype, "cond:")) 3492 utp->cond_string.reset (xstrdup (buf)); 3493 else if (startswith (srctype, "cmd:")) 3494 utp->cmd_strings.emplace_back (xstrdup (buf)); 3495 } 3496 else if (piece == 'V') 3497 { 3498 utp = get_uploaded_tp (num, addr, utpp); 3499 3500 parse_tracepoint_status (p, NULL, utp); 3501 } 3502 else 3503 { 3504 /* Don't error out, the target might be sending us optional 3505 info that we don't care about. */ 3506 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece); 3507 } 3508 } 3509 3510 /* Convert a textual description of a trace state variable into an 3511 uploaded object. */ 3512 3513 void 3514 parse_tsv_definition (const char *line, struct uploaded_tsv **utsvp) 3515 { 3516 const char *p; 3517 char *buf; 3518 ULONGEST num, initval, builtin; 3519 int end; 3520 struct uploaded_tsv *utsv = NULL; 3521 3522 buf = (char *) alloca (strlen (line)); 3523 3524 p = line; 3525 p = unpack_varlen_hex (p, &num); 3526 p++; /* skip a colon */ 3527 p = unpack_varlen_hex (p, &initval); 3528 p++; /* skip a colon */ 3529 p = unpack_varlen_hex (p, &builtin); 3530 p++; /* skip a colon */ 3531 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2); 3532 buf[end] = '\0'; 3533 3534 utsv = get_uploaded_tsv (num, utsvp); 3535 utsv->initial_value = initval; 3536 utsv->builtin = builtin; 3537 utsv->name = xstrdup (buf); 3538 } 3539 3540 /* Given a line of text defining a static tracepoint marker, parse it 3541 into a "static tracepoint marker" object. Throws an error is 3542 parsing fails. If PP is non-null, it points to one past the end of 3543 the parsed marker definition. */ 3544 3545 void 3546 parse_static_tracepoint_marker_definition (const char *line, const char **pp, 3547 static_tracepoint_marker *marker) 3548 { 3549 const char *p, *endp; 3550 ULONGEST addr; 3551 3552 p = line; 3553 p = unpack_varlen_hex (p, &addr); 3554 p++; /* skip a colon */ 3555 3556 marker->gdbarch = current_inferior ()->arch (); 3557 marker->address = (CORE_ADDR) addr; 3558 3559 endp = strchr (p, ':'); 3560 if (endp == NULL) 3561 error (_("bad marker definition: %s"), line); 3562 3563 marker->str_id = hex2str (p, (endp - p) / 2); 3564 3565 p = endp; 3566 p++; /* skip a colon */ 3567 3568 /* This definition may be followed by another one, separated by a comma. */ 3569 int hex_len; 3570 endp = strchr (p, ','); 3571 if (endp != nullptr) 3572 hex_len = endp - p; 3573 else 3574 hex_len = strlen (p); 3575 3576 marker->extra = hex2str (p, hex_len / 2); 3577 3578 if (pp != nullptr) 3579 *pp = p + hex_len; 3580 } 3581 3582 /* Print MARKER to gdb_stdout. */ 3583 3584 static void 3585 print_one_static_tracepoint_marker (int count, 3586 const static_tracepoint_marker &marker) 3587 { 3588 struct symbol *sym; 3589 3590 struct ui_out *uiout = current_uiout; 3591 3592 symtab_and_line sal; 3593 sal.pc = marker.address; 3594 3595 std::vector<breakpoint *> tracepoints 3596 = static_tracepoints_here (marker.address); 3597 3598 ui_out_emit_tuple tuple_emitter (uiout, "marker"); 3599 3600 /* A counter field to help readability. This is not a stable 3601 identifier! */ 3602 uiout->field_signed ("count", count); 3603 3604 uiout->field_string ("marker-id", marker.str_id); 3605 3606 uiout->field_fmt ("enabled", "%c", 3607 !tracepoints.empty () ? 'y' : 'n'); 3608 uiout->spaces (2); 3609 3610 int wrap_indent = 35; 3611 if (gdbarch_addr_bit (marker.gdbarch) <= 32) 3612 wrap_indent += 11; 3613 else 3614 wrap_indent += 19; 3615 3616 const char *extra_field_indent = " "; 3617 3618 uiout->field_core_addr ("addr", marker.gdbarch, marker.address); 3619 3620 sal = find_pc_line (marker.address, 0); 3621 sym = find_pc_sect_function (marker.address, NULL); 3622 if (sym) 3623 { 3624 uiout->text ("in "); 3625 uiout->field_string ("func", sym->print_name (), 3626 function_name_style.style ()); 3627 uiout->wrap_hint (wrap_indent); 3628 uiout->text (" at "); 3629 } 3630 else 3631 uiout->field_skip ("func"); 3632 3633 if (sal.symtab != NULL) 3634 { 3635 uiout->field_string ("file", 3636 symtab_to_filename_for_display (sal.symtab), 3637 file_name_style.style ()); 3638 uiout->text (":"); 3639 3640 if (uiout->is_mi_like_p ()) 3641 { 3642 const char *fullname = symtab_to_fullname (sal.symtab); 3643 3644 uiout->field_string ("fullname", fullname); 3645 } 3646 else 3647 uiout->field_skip ("fullname"); 3648 3649 uiout->field_signed ("line", sal.line, line_number_style.style ()); 3650 } 3651 else 3652 { 3653 uiout->field_skip ("fullname"); 3654 uiout->field_skip ("line"); 3655 } 3656 3657 uiout->text ("\n"); 3658 uiout->text (extra_field_indent); 3659 uiout->text (_("Data: \"")); 3660 uiout->field_string ("extra-data", marker.extra); 3661 uiout->text ("\"\n"); 3662 3663 if (!tracepoints.empty ()) 3664 { 3665 int ix; 3666 3667 { 3668 ui_out_emit_tuple inner_tuple_emitter (uiout, "tracepoints-at"); 3669 3670 uiout->text (extra_field_indent); 3671 uiout->text (_("Probed by static tracepoints: ")); 3672 for (ix = 0; ix < tracepoints.size (); ix++) 3673 { 3674 if (ix > 0) 3675 uiout->text (", "); 3676 uiout->text ("#"); 3677 uiout->field_signed ("tracepoint-id", tracepoints[ix]->number); 3678 } 3679 } 3680 3681 if (uiout->is_mi_like_p ()) 3682 uiout->field_signed ("number-of-tracepoints", tracepoints.size ()); 3683 else 3684 uiout->text ("\n"); 3685 } 3686 } 3687 3688 static void 3689 info_static_tracepoint_markers_command (const char *arg, int from_tty) 3690 { 3691 struct ui_out *uiout = current_uiout; 3692 std::vector<static_tracepoint_marker> markers 3693 = target_static_tracepoint_markers_by_strid (NULL); 3694 3695 /* We don't have to check target_can_use_agent and agent's capability on 3696 static tracepoint here, in order to be compatible with older GDBserver. 3697 We don't check USE_AGENT is true or not, because static tracepoints 3698 don't work without in-process agent, so we don't bother users to type 3699 `set agent on' when to use static tracepoint. */ 3700 3701 ui_out_emit_table table_emitter (uiout, 5, -1, 3702 "StaticTracepointMarkersTable"); 3703 3704 uiout->table_header (7, ui_left, "counter", "Cnt"); 3705 3706 uiout->table_header (40, ui_left, "marker-id", "ID"); 3707 3708 uiout->table_header (3, ui_left, "enabled", "Enb"); 3709 if (gdbarch_addr_bit (current_inferior ()->arch ()) <= 32) 3710 uiout->table_header (10, ui_left, "addr", "Address"); 3711 else 3712 uiout->table_header (18, ui_left, "addr", "Address"); 3713 uiout->table_header (40, ui_noalign, "what", "What"); 3714 3715 uiout->table_body (); 3716 3717 for (int i = 0; i < markers.size (); i++) 3718 print_one_static_tracepoint_marker (i + 1, markers[i]); 3719 } 3720 3721 /* The $_sdata convenience variable is a bit special. We don't know 3722 for sure type of the value until we actually have a chance to fetch 3723 the data --- the size of the object depends on what has been 3724 collected. We solve this by making $_sdata be an internalvar that 3725 creates a new value on access. */ 3726 3727 /* Return a new value with the correct type for the sdata object of 3728 the current trace frame. Return a void value if there's no object 3729 available. */ 3730 3731 static struct value * 3732 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var, 3733 void *ignore) 3734 { 3735 /* We need to read the whole object before we know its size. */ 3736 std::optional<gdb::byte_vector> buf 3737 = target_read_alloc (current_inferior ()->top_target (), 3738 TARGET_OBJECT_STATIC_TRACE_DATA, 3739 NULL); 3740 if (buf) 3741 { 3742 struct value *v; 3743 struct type *type; 3744 3745 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char, 3746 buf->size ()); 3747 v = value::allocate (type); 3748 memcpy (v->contents_raw ().data (), buf->data (), buf->size ()); 3749 return v; 3750 } 3751 else 3752 return value::allocate (builtin_type (gdbarch)->builtin_void); 3753 } 3754 3755 #if !defined(HAVE_LIBEXPAT) 3756 3757 struct std::unique_ptr<traceframe_info> 3758 parse_traceframe_info (const char *tframe_info) 3759 { 3760 static int have_warned; 3761 3762 if (!have_warned) 3763 { 3764 have_warned = 1; 3765 warning (_("Can not parse XML trace frame info; XML support " 3766 "was disabled at compile time")); 3767 } 3768 3769 return NULL; 3770 } 3771 3772 #else /* HAVE_LIBEXPAT */ 3773 3774 #include "xml-support.h" 3775 3776 /* Handle the start of a <memory> element. */ 3777 3778 static void 3779 traceframe_info_start_memory (struct gdb_xml_parser *parser, 3780 const struct gdb_xml_element *element, 3781 void *user_data, 3782 std::vector<gdb_xml_value> &attributes) 3783 { 3784 struct traceframe_info *info = (struct traceframe_info *) user_data; 3785 ULONGEST *start_p, *length_p; 3786 3787 start_p 3788 = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get (); 3789 length_p 3790 = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get (); 3791 3792 info->memory.emplace_back (*start_p, *length_p); 3793 } 3794 3795 /* Handle the start of a <tvar> element. */ 3796 3797 static void 3798 traceframe_info_start_tvar (struct gdb_xml_parser *parser, 3799 const struct gdb_xml_element *element, 3800 void *user_data, 3801 std::vector<gdb_xml_value> &attributes) 3802 { 3803 struct traceframe_info *info = (struct traceframe_info *) user_data; 3804 const char *id_attrib 3805 = (const char *) xml_find_attribute (attributes, "id")->value.get (); 3806 int id = gdb_xml_parse_ulongest (parser, id_attrib); 3807 3808 info->tvars.push_back (id); 3809 } 3810 3811 /* The allowed elements and attributes for an XML memory map. */ 3812 3813 static const struct gdb_xml_attribute memory_attributes[] = { 3814 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 3815 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 3816 { NULL, GDB_XML_AF_NONE, NULL, NULL } 3817 }; 3818 3819 static const struct gdb_xml_attribute tvar_attributes[] = { 3820 { "id", GDB_XML_AF_NONE, NULL, NULL }, 3821 { NULL, GDB_XML_AF_NONE, NULL, NULL } 3822 }; 3823 3824 static const struct gdb_xml_element traceframe_info_children[] = { 3825 { "memory", memory_attributes, NULL, 3826 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, 3827 traceframe_info_start_memory, NULL }, 3828 { "tvar", tvar_attributes, NULL, 3829 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, 3830 traceframe_info_start_tvar, NULL }, 3831 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 3832 }; 3833 3834 static const struct gdb_xml_element traceframe_info_elements[] = { 3835 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE, 3836 NULL, NULL }, 3837 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 3838 }; 3839 3840 /* Parse a traceframe-info XML document. */ 3841 3842 traceframe_info_up 3843 parse_traceframe_info (const char *tframe_info) 3844 { 3845 traceframe_info_up result (new traceframe_info); 3846 3847 if (gdb_xml_parse_quick (_("trace frame info"), 3848 "traceframe-info.dtd", traceframe_info_elements, 3849 tframe_info, result.get ()) == 0) 3850 return result; 3851 3852 return NULL; 3853 } 3854 3855 #endif /* HAVE_LIBEXPAT */ 3856 3857 /* Returns the traceframe_info object for the current traceframe. 3858 This is where we avoid re-fetching the object from the target if we 3859 already have it cached. */ 3860 3861 struct traceframe_info * 3862 get_traceframe_info (void) 3863 { 3864 if (current_traceframe_info == NULL) 3865 current_traceframe_info = target_traceframe_info (); 3866 3867 return current_traceframe_info.get (); 3868 } 3869 3870 /* If the target supports the query, return in RESULT the set of 3871 collected memory in the current traceframe, found within the LEN 3872 bytes range starting at MEMADDR. Returns true if the target 3873 supports the query, otherwise returns false, and RESULT is left 3874 undefined. */ 3875 3876 int 3877 traceframe_available_memory (std::vector<mem_range> *result, 3878 CORE_ADDR memaddr, ULONGEST len) 3879 { 3880 struct traceframe_info *info = get_traceframe_info (); 3881 3882 if (info != NULL) 3883 { 3884 result->clear (); 3885 3886 for (mem_range &r : info->memory) 3887 if (mem_ranges_overlap (r.start, r.length, memaddr, len)) 3888 { 3889 ULONGEST lo1, hi1, lo2, hi2; 3890 3891 lo1 = memaddr; 3892 hi1 = memaddr + len; 3893 3894 lo2 = r.start; 3895 hi2 = r.start + r.length; 3896 3897 CORE_ADDR start = std::max (lo1, lo2); 3898 int length = std::min (hi1, hi2) - start; 3899 3900 result->emplace_back (start, length); 3901 } 3902 3903 normalize_mem_ranges (result); 3904 return 1; 3905 } 3906 3907 return 0; 3908 } 3909 3910 /* Implementation of `sdata' variable. */ 3911 3912 static const struct internalvar_funcs sdata_funcs = 3913 { 3914 sdata_make_value, 3915 NULL 3916 }; 3917 3918 /* See tracepoint.h. */ 3919 cmd_list_element *while_stepping_cmd_element = nullptr; 3920 3921 /* module initialization */ 3922 void _initialize_tracepoint (); 3923 void 3924 _initialize_tracepoint () 3925 { 3926 struct cmd_list_element *c; 3927 3928 /* Explicitly create without lookup, since that tries to create a 3929 value with a void typed value, and when we get here, gdbarch 3930 isn't initialized yet. At this point, we're quite sure there 3931 isn't another convenience variable of the same name. */ 3932 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL); 3933 3934 traceframe_number = -1; 3935 tracepoint_number = -1; 3936 3937 add_info ("scope", info_scope_command, 3938 _("List the variables local to a scope.")); 3939 3940 add_cmd ("tracepoints", class_trace, 3941 _("Tracing of program execution without stopping the program."), 3942 &cmdlist); 3943 3944 add_com ("tdump", class_trace, tdump_command, 3945 _("Print everything collected at the current tracepoint.")); 3946 3947 c = add_com ("tvariable", class_trace, trace_variable_command,_("\ 3948 Define a trace state variable.\n\ 3949 Argument is a $-prefixed name, optionally followed\n\ 3950 by '=' and an expression that sets the initial value\n\ 3951 at the start of tracing.")); 3952 set_cmd_completer (c, expression_completer); 3953 3954 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\ 3955 Delete one or more trace state variables.\n\ 3956 Arguments are the names of the variables to delete.\n\ 3957 If no arguments are supplied, delete all variables."), &deletelist); 3958 /* FIXME add a trace variable completer. */ 3959 3960 add_info ("tvariables", info_tvariables_command, _("\ 3961 Status of trace state variables and their values.")); 3962 3963 add_info ("static-tracepoint-markers", 3964 info_static_tracepoint_markers_command, _("\ 3965 List target static tracepoints markers.")); 3966 3967 add_prefix_cmd ("tfind", class_trace, tfind_command, _("\ 3968 Select a trace frame.\n\ 3969 No argument means forward by one frame; '-' means backward by one frame."), 3970 &tfindlist, 1, &cmdlist); 3971 3972 add_cmd ("outside", class_trace, tfind_outside_command, _("\ 3973 Select a trace frame whose PC is outside the given range (exclusive).\n\ 3974 Usage: tfind outside ADDR1, ADDR2"), 3975 &tfindlist); 3976 3977 add_cmd ("range", class_trace, tfind_range_command, _("\ 3978 Select a trace frame whose PC is in the given range (inclusive).\n\ 3979 Usage: tfind range ADDR1, ADDR2"), 3980 &tfindlist); 3981 3982 add_cmd ("line", class_trace, tfind_line_command, _("\ 3983 Select a trace frame by source line.\n\ 3984 Argument can be a line number (with optional source file),\n\ 3985 a function name, or '*' followed by an address.\n\ 3986 Default argument is 'the next source line that was traced'."), 3987 &tfindlist); 3988 3989 add_cmd ("tracepoint", class_trace, tfind_tracepoint_command, _("\ 3990 Select a trace frame by tracepoint number.\n\ 3991 Default is the tracepoint for the current trace frame."), 3992 &tfindlist); 3993 3994 add_cmd ("pc", class_trace, tfind_pc_command, _("\ 3995 Select a trace frame by PC.\n\ 3996 Default is the current PC, or the PC of the current trace frame."), 3997 &tfindlist); 3998 3999 cmd_list_element *tfind_end_cmd 4000 = add_cmd ("end", class_trace, tfind_end_command, _("\ 4001 De-select any trace frame and resume 'live' debugging."), &tfindlist); 4002 4003 add_alias_cmd ("none", tfind_end_cmd, class_trace, 0, &tfindlist); 4004 4005 add_cmd ("start", class_trace, tfind_start_command, 4006 _("Select the first trace frame in the trace buffer."), 4007 &tfindlist); 4008 4009 add_com ("tstatus", class_trace, tstatus_command, 4010 _("Display the status of the current trace data collection.")); 4011 4012 add_com ("tstop", class_trace, tstop_command, _("\ 4013 Stop trace data collection.\n\ 4014 Usage: tstop [NOTES]...\n\ 4015 Any arguments supplied are recorded with the trace as a stop reason and\n\ 4016 reported by tstatus (if the target supports trace notes).")); 4017 4018 add_com ("tstart", class_trace, tstart_command, _("\ 4019 Start trace data collection.\n\ 4020 Usage: tstart [NOTES]...\n\ 4021 Any arguments supplied are recorded with the trace as a note and\n\ 4022 reported by tstatus (if the target supports trace notes).")); 4023 4024 add_com ("end", class_trace, end_actions_pseudocommand, _("\ 4025 Ends a list of commands or actions.\n\ 4026 Several GDB commands allow you to enter a list of commands or actions.\n\ 4027 Entering \"end\" on a line by itself is the normal way to terminate\n\ 4028 such a list.\n\n\ 4029 Note: the \"end\" command cannot be used at the gdb prompt.")); 4030 4031 while_stepping_cmd_element = add_com ("while-stepping", class_trace, 4032 while_stepping_pseudocommand, _("\ 4033 Specify single-stepping behavior at a tracepoint.\n\ 4034 Argument is number of instructions to trace in single-step mode\n\ 4035 following the tracepoint. This command is normally followed by\n\ 4036 one or more \"collect\" commands, to specify what to collect\n\ 4037 while single-stepping.\n\n\ 4038 Note: this command can only be used in a tracepoint \"actions\" list.")); 4039 4040 add_com_alias ("ws", while_stepping_cmd_element, class_trace, 0); 4041 add_com_alias ("stepping", while_stepping_cmd_element, class_trace, 0); 4042 4043 add_com ("collect", class_trace, collect_pseudocommand, _("\ 4044 Specify one or more data items to be collected at a tracepoint.\n\ 4045 Accepts a comma-separated list of (one or more) expressions. GDB will\n\ 4046 collect all data (variables, registers) referenced by that expression.\n\ 4047 Also accepts the following special arguments:\n\ 4048 $regs -- all registers.\n\ 4049 $args -- all function arguments.\n\ 4050 $locals -- all variables local to the block/function scope.\n\ 4051 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\ 4052 Note: this command can only be used in a tracepoint \"actions\" list.")); 4053 4054 add_com ("teval", class_trace, teval_pseudocommand, _("\ 4055 Specify one or more expressions to be evaluated at a tracepoint.\n\ 4056 Accepts a comma-separated list of (one or more) expressions.\n\ 4057 The result of each evaluation will be discarded.\n\ 4058 Note: this command can only be used in a tracepoint \"actions\" list.")); 4059 4060 add_com ("actions", class_trace, actions_command, _("\ 4061 Specify the actions to be taken at a tracepoint.\n\ 4062 Tracepoint actions may include collecting of specified data,\n\ 4063 single-stepping, or enabling/disabling other tracepoints,\n\ 4064 depending on target's capabilities.")); 4065 4066 add_setshow_string_cmd ("default-collect", class_trace, 4067 &default_collect, _("\ 4068 Set the list of expressions to collect by default."), _("\ 4069 Show the list of expressions to collect by default."), NULL, 4070 NULL, NULL, 4071 &setlist, &showlist); 4072 4073 add_setshow_boolean_cmd ("disconnected-tracing", no_class, 4074 &disconnected_tracing, _("\ 4075 Set whether tracing continues after GDB disconnects."), _("\ 4076 Show whether tracing continues after GDB disconnects."), _("\ 4077 Use this to continue a tracing run even if GDB disconnects\n\ 4078 or detaches from the target. You can reconnect later and look at\n\ 4079 trace data collected in the meantime."), 4080 set_disconnected_tracing, 4081 NULL, 4082 &setlist, 4083 &showlist); 4084 4085 add_setshow_boolean_cmd ("circular-trace-buffer", no_class, 4086 &circular_trace_buffer, _("\ 4087 Set target's use of circular trace buffer."), _("\ 4088 Show target's use of circular trace buffer."), _("\ 4089 Use this to make the trace buffer into a circular buffer,\n\ 4090 which will discard traceframes (oldest first) instead of filling\n\ 4091 up and stopping the trace run."), 4092 set_circular_trace_buffer, 4093 NULL, 4094 &setlist, 4095 &showlist); 4096 4097 add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class, 4098 &trace_buffer_size, _("\ 4099 Set requested size of trace buffer."), _("\ 4100 Show requested size of trace buffer."), _("\ 4101 Use this to choose a size for the trace buffer. Some targets\n\ 4102 may have fixed or limited buffer sizes. Specifying \"unlimited\" or -1\n\ 4103 disables any attempt to set the buffer size and lets the target choose."), 4104 set_trace_buffer_size, NULL, 4105 &setlist, &showlist); 4106 4107 add_setshow_string_cmd ("trace-user", class_trace, 4108 &trace_user, _("\ 4109 Set the user name to use for current and future trace runs."), _("\ 4110 Show the user name to use for current and future trace runs."), NULL, 4111 set_trace_user, NULL, 4112 &setlist, &showlist); 4113 4114 add_setshow_string_cmd ("trace-notes", class_trace, 4115 &trace_notes, _("\ 4116 Set notes string to use for current and future trace runs."), _("\ 4117 Show the notes string to use for current and future trace runs."), NULL, 4118 set_trace_notes, NULL, 4119 &setlist, &showlist); 4120 4121 add_setshow_string_cmd ("trace-stop-notes", class_trace, 4122 &trace_stop_notes, _("\ 4123 Set notes string to use for future tstop commands."), _("\ 4124 Show the notes string to use for future tstop commands."), NULL, 4125 set_trace_stop_notes, NULL, 4126 &setlist, &showlist); 4127 } 4128