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