1 /* Debug logging for the symbol file functions for the GNU debugger, GDB. 2 3 Copyright (C) 2013-2020 Free Software Foundation, Inc. 4 5 Contributed by Cygnus Support, using pieces from other GDB modules. 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 /* Note: Be careful with functions that can throw errors. 23 We want to see a logging message regardless of whether an error was thrown. 24 This typically means printing a message before calling the real function 25 and then if the function returns a result printing a message after it 26 returns. */ 27 28 #include "defs.h" 29 #include "gdbcmd.h" 30 #include "objfiles.h" 31 #include "observable.h" 32 #include "source.h" 33 #include "symtab.h" 34 #include "symfile.h" 35 36 /* We need to save a pointer to the real symbol functions. 37 Plus, the debug versions are malloc'd because we have to NULL out the 38 ones that are NULL in the real copy. */ 39 40 struct debug_sym_fns_data 41 { 42 const struct sym_fns *real_sf = nullptr; 43 struct sym_fns debug_sf {}; 44 }; 45 46 /* We need to record a pointer to the real set of functions for each 47 objfile. */ 48 static const struct objfile_key<debug_sym_fns_data> 49 symfile_debug_objfile_data_key; 50 51 /* If true all calls to the symfile functions are logged. */ 52 static bool debug_symfile = false; 53 54 /* Return non-zero if symfile debug logging is installed. */ 55 56 static int 57 symfile_debug_installed (struct objfile *objfile) 58 { 59 return (objfile->sf != NULL 60 && symfile_debug_objfile_data_key.get (objfile) != NULL); 61 } 62 63 /* Utility return the name to print for SYMTAB. */ 64 65 static const char * 66 debug_symtab_name (struct symtab *symtab) 67 { 68 return symtab_to_filename_for_display (symtab); 69 } 70 71 /* Debugging version of struct quick_symbol_functions. */ 72 73 static int 74 debug_qf_has_symbols (struct objfile *objfile) 75 { 76 const struct debug_sym_fns_data *debug_data 77 = symfile_debug_objfile_data_key.get (objfile); 78 int retval; 79 80 retval = debug_data->real_sf->qf->has_symbols (objfile); 81 82 fprintf_filtered (gdb_stdlog, "qf->has_symbols (%s) = %d\n", 83 objfile_debug_name (objfile), retval); 84 85 return retval; 86 } 87 88 static struct symtab * 89 debug_qf_find_last_source_symtab (struct objfile *objfile) 90 { 91 const struct debug_sym_fns_data *debug_data 92 = symfile_debug_objfile_data_key.get (objfile); 93 struct symtab *retval; 94 95 fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (%s)\n", 96 objfile_debug_name (objfile)); 97 98 retval = debug_data->real_sf->qf->find_last_source_symtab (objfile); 99 100 fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (...) = %s\n", 101 retval ? debug_symtab_name (retval) : "NULL"); 102 103 return retval; 104 } 105 106 static void 107 debug_qf_forget_cached_source_info (struct objfile *objfile) 108 { 109 const struct debug_sym_fns_data *debug_data 110 = symfile_debug_objfile_data_key.get (objfile); 111 112 fprintf_filtered (gdb_stdlog, "qf->forget_cached_source_info (%s)\n", 113 objfile_debug_name (objfile)); 114 115 debug_data->real_sf->qf->forget_cached_source_info (objfile); 116 } 117 118 static bool 119 debug_qf_map_symtabs_matching_filename 120 (struct objfile *objfile, const char *name, const char *real_path, 121 gdb::function_view<bool (symtab *)> callback) 122 { 123 const struct debug_sym_fns_data *debug_data 124 = symfile_debug_objfile_data_key.get (objfile); 125 126 fprintf_filtered (gdb_stdlog, 127 "qf->map_symtabs_matching_filename (%s, \"%s\", \"%s\", %s)\n", 128 objfile_debug_name (objfile), name, 129 real_path ? real_path : NULL, 130 host_address_to_string (&callback)); 131 132 bool retval = (debug_data->real_sf->qf->map_symtabs_matching_filename 133 (objfile, name, real_path, callback)); 134 135 fprintf_filtered (gdb_stdlog, 136 "qf->map_symtabs_matching_filename (...) = %d\n", 137 retval); 138 139 return retval; 140 } 141 142 static struct compunit_symtab * 143 debug_qf_lookup_symbol (struct objfile *objfile, block_enum kind, 144 const char *name, domain_enum domain) 145 { 146 const struct debug_sym_fns_data *debug_data 147 = symfile_debug_objfile_data_key.get (objfile); 148 struct compunit_symtab *retval; 149 150 fprintf_filtered (gdb_stdlog, 151 "qf->lookup_symbol (%s, %d, \"%s\", %s)\n", 152 objfile_debug_name (objfile), kind, name, 153 domain_name (domain)); 154 155 retval = debug_data->real_sf->qf->lookup_symbol (objfile, kind, name, 156 domain); 157 158 fprintf_filtered (gdb_stdlog, "qf->lookup_symbol (...) = %s\n", 159 retval 160 ? debug_symtab_name (compunit_primary_filetab (retval)) 161 : "NULL"); 162 163 return retval; 164 } 165 166 static void 167 debug_qf_print_stats (struct objfile *objfile) 168 { 169 const struct debug_sym_fns_data *debug_data 170 = symfile_debug_objfile_data_key.get (objfile); 171 172 fprintf_filtered (gdb_stdlog, "qf->print_stats (%s)\n", 173 objfile_debug_name (objfile)); 174 175 debug_data->real_sf->qf->print_stats (objfile); 176 } 177 178 static void 179 debug_qf_dump (struct objfile *objfile) 180 { 181 const struct debug_sym_fns_data *debug_data 182 = symfile_debug_objfile_data_key.get (objfile); 183 184 fprintf_filtered (gdb_stdlog, "qf->dump (%s)\n", 185 objfile_debug_name (objfile)); 186 187 debug_data->real_sf->qf->dump (objfile); 188 } 189 190 static void 191 debug_qf_expand_symtabs_for_function (struct objfile *objfile, 192 const char *func_name) 193 { 194 const struct debug_sym_fns_data *debug_data 195 = symfile_debug_objfile_data_key.get (objfile); 196 197 fprintf_filtered (gdb_stdlog, 198 "qf->expand_symtabs_for_function (%s, \"%s\")\n", 199 objfile_debug_name (objfile), func_name); 200 201 debug_data->real_sf->qf->expand_symtabs_for_function (objfile, func_name); 202 } 203 204 static void 205 debug_qf_expand_all_symtabs (struct objfile *objfile) 206 { 207 const struct debug_sym_fns_data *debug_data 208 = symfile_debug_objfile_data_key.get (objfile); 209 210 fprintf_filtered (gdb_stdlog, "qf->expand_all_symtabs (%s)\n", 211 objfile_debug_name (objfile)); 212 213 debug_data->real_sf->qf->expand_all_symtabs (objfile); 214 } 215 216 static void 217 debug_qf_expand_symtabs_with_fullname (struct objfile *objfile, 218 const char *fullname) 219 { 220 const struct debug_sym_fns_data *debug_data 221 = symfile_debug_objfile_data_key.get (objfile); 222 223 fprintf_filtered (gdb_stdlog, 224 "qf->expand_symtabs_with_fullname (%s, \"%s\")\n", 225 objfile_debug_name (objfile), fullname); 226 227 debug_data->real_sf->qf->expand_symtabs_with_fullname (objfile, fullname); 228 } 229 230 static void 231 debug_qf_map_matching_symbols 232 (struct objfile *objfile, 233 const lookup_name_info &name, domain_enum domain, 234 int global, 235 gdb::function_view<symbol_found_callback_ftype> callback, 236 symbol_compare_ftype *ordered_compare) 237 { 238 const struct debug_sym_fns_data *debug_data 239 = symfile_debug_objfile_data_key.get (objfile); 240 241 fprintf_filtered (gdb_stdlog, 242 "qf->map_matching_symbols (%s, %s, %d, %s)\n", 243 objfile_debug_name (objfile), 244 domain_name (domain), global, 245 host_address_to_string (ordered_compare)); 246 247 debug_data->real_sf->qf->map_matching_symbols (objfile, name, 248 domain, global, 249 callback, 250 ordered_compare); 251 } 252 253 static void 254 debug_qf_expand_symtabs_matching 255 (struct objfile *objfile, 256 gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, 257 const lookup_name_info *lookup_name, 258 gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, 259 gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, 260 enum search_domain kind) 261 { 262 const struct debug_sym_fns_data *debug_data 263 = symfile_debug_objfile_data_key.get (objfile); 264 265 fprintf_filtered (gdb_stdlog, 266 "qf->expand_symtabs_matching (%s, %s, %s, %s, %s)\n", 267 objfile_debug_name (objfile), 268 host_address_to_string (&file_matcher), 269 host_address_to_string (&symbol_matcher), 270 host_address_to_string (&expansion_notify), 271 search_domain_name (kind)); 272 273 debug_data->real_sf->qf->expand_symtabs_matching (objfile, 274 file_matcher, 275 lookup_name, 276 symbol_matcher, 277 expansion_notify, 278 kind); 279 } 280 281 static struct compunit_symtab * 282 debug_qf_find_pc_sect_compunit_symtab (struct objfile *objfile, 283 struct bound_minimal_symbol msymbol, 284 CORE_ADDR pc, 285 struct obj_section *section, 286 int warn_if_readin) 287 { 288 const struct debug_sym_fns_data *debug_data 289 = symfile_debug_objfile_data_key.get (objfile); 290 struct compunit_symtab *retval; 291 292 fprintf_filtered (gdb_stdlog, 293 "qf->find_pc_sect_compunit_symtab (%s, %s, %s, %s, %d)\n", 294 objfile_debug_name (objfile), 295 host_address_to_string (msymbol.minsym), 296 hex_string (pc), 297 host_address_to_string (section), 298 warn_if_readin); 299 300 retval 301 = debug_data->real_sf->qf->find_pc_sect_compunit_symtab (objfile, msymbol, 302 pc, section, 303 warn_if_readin); 304 305 fprintf_filtered (gdb_stdlog, 306 "qf->find_pc_sect_compunit_symtab (...) = %s\n", 307 retval 308 ? debug_symtab_name (compunit_primary_filetab (retval)) 309 : "NULL"); 310 311 return retval; 312 } 313 314 static void 315 debug_qf_map_symbol_filenames (struct objfile *objfile, 316 symbol_filename_ftype *fun, void *data, 317 int need_fullname) 318 { 319 const struct debug_sym_fns_data *debug_data 320 = symfile_debug_objfile_data_key.get (objfile); 321 fprintf_filtered (gdb_stdlog, 322 "qf->map_symbol_filenames (%s, %s, %s, %d)\n", 323 objfile_debug_name (objfile), 324 host_address_to_string (fun), 325 host_address_to_string (data), 326 need_fullname); 327 328 debug_data->real_sf->qf->map_symbol_filenames (objfile, fun, data, 329 need_fullname); 330 } 331 332 static struct compunit_symtab * 333 debug_qf_find_compunit_symtab_by_address (struct objfile *objfile, 334 CORE_ADDR address) 335 { 336 const struct debug_sym_fns_data *debug_data 337 = symfile_debug_objfile_data_key.get (objfile); 338 fprintf_filtered (gdb_stdlog, 339 "qf->find_compunit_symtab_by_address (%s, %s)\n", 340 objfile_debug_name (objfile), 341 hex_string (address)); 342 343 struct compunit_symtab *result = NULL; 344 if (debug_data->real_sf->qf->map_symbol_filenames != NULL) 345 result 346 = debug_data->real_sf->qf->find_compunit_symtab_by_address (objfile, 347 address); 348 349 fprintf_filtered (gdb_stdlog, 350 "qf->find_compunit_symtab_by_address (...) = %s\n", 351 result 352 ? debug_symtab_name (compunit_primary_filetab (result)) 353 : "NULL"); 354 355 return result; 356 } 357 358 static const struct quick_symbol_functions debug_sym_quick_functions = 359 { 360 debug_qf_has_symbols, 361 debug_qf_find_last_source_symtab, 362 debug_qf_forget_cached_source_info, 363 debug_qf_map_symtabs_matching_filename, 364 debug_qf_lookup_symbol, 365 NULL, 366 debug_qf_print_stats, 367 debug_qf_dump, 368 debug_qf_expand_symtabs_for_function, 369 debug_qf_expand_all_symtabs, 370 debug_qf_expand_symtabs_with_fullname, 371 debug_qf_map_matching_symbols, 372 debug_qf_expand_symtabs_matching, 373 debug_qf_find_pc_sect_compunit_symtab, 374 debug_qf_find_compunit_symtab_by_address, 375 debug_qf_map_symbol_filenames 376 }; 377 378 /* Debugging version of struct sym_probe_fns. */ 379 380 static const std::vector<std::unique_ptr<probe>> & 381 debug_sym_get_probes (struct objfile *objfile) 382 { 383 const struct debug_sym_fns_data *debug_data 384 = symfile_debug_objfile_data_key.get (objfile); 385 386 const std::vector<std::unique_ptr<probe>> &retval 387 = debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile); 388 389 fprintf_filtered (gdb_stdlog, 390 "probes->sym_get_probes (%s) = %s\n", 391 objfile_debug_name (objfile), 392 host_address_to_string (retval.data ())); 393 394 return retval; 395 } 396 397 static const struct sym_probe_fns debug_sym_probe_fns = 398 { 399 debug_sym_get_probes, 400 }; 401 402 /* Debugging version of struct sym_fns. */ 403 404 static void 405 debug_sym_new_init (struct objfile *objfile) 406 { 407 const struct debug_sym_fns_data *debug_data 408 = symfile_debug_objfile_data_key.get (objfile); 409 410 fprintf_filtered (gdb_stdlog, "sf->sym_new_init (%s)\n", 411 objfile_debug_name (objfile)); 412 413 debug_data->real_sf->sym_new_init (objfile); 414 } 415 416 static void 417 debug_sym_init (struct objfile *objfile) 418 { 419 const struct debug_sym_fns_data *debug_data 420 = symfile_debug_objfile_data_key.get (objfile); 421 422 fprintf_filtered (gdb_stdlog, "sf->sym_init (%s)\n", 423 objfile_debug_name (objfile)); 424 425 debug_data->real_sf->sym_init (objfile); 426 } 427 428 static void 429 debug_sym_read (struct objfile *objfile, symfile_add_flags symfile_flags) 430 { 431 const struct debug_sym_fns_data *debug_data 432 = symfile_debug_objfile_data_key.get (objfile); 433 434 fprintf_filtered (gdb_stdlog, "sf->sym_read (%s, 0x%x)\n", 435 objfile_debug_name (objfile), (unsigned) symfile_flags); 436 437 debug_data->real_sf->sym_read (objfile, symfile_flags); 438 } 439 440 static void 441 debug_sym_read_psymbols (struct objfile *objfile) 442 { 443 const struct debug_sym_fns_data *debug_data 444 = symfile_debug_objfile_data_key.get (objfile); 445 446 fprintf_filtered (gdb_stdlog, "sf->sym_read_psymbols (%s)\n", 447 objfile_debug_name (objfile)); 448 449 debug_data->real_sf->sym_read_psymbols (objfile); 450 } 451 452 static void 453 debug_sym_finish (struct objfile *objfile) 454 { 455 const struct debug_sym_fns_data *debug_data 456 = symfile_debug_objfile_data_key.get (objfile); 457 458 fprintf_filtered (gdb_stdlog, "sf->sym_finish (%s)\n", 459 objfile_debug_name (objfile)); 460 461 debug_data->real_sf->sym_finish (objfile); 462 } 463 464 static void 465 debug_sym_offsets (struct objfile *objfile, 466 const section_addr_info &info) 467 { 468 const struct debug_sym_fns_data *debug_data 469 = symfile_debug_objfile_data_key.get (objfile); 470 471 fprintf_filtered (gdb_stdlog, "sf->sym_offsets (%s, %s)\n", 472 objfile_debug_name (objfile), 473 host_address_to_string (&info)); 474 475 debug_data->real_sf->sym_offsets (objfile, info); 476 } 477 478 static symfile_segment_data_up 479 debug_sym_segments (bfd *abfd) 480 { 481 /* This API function is annoying, it doesn't take a "this" pointer. 482 Fortunately it is only used in one place where we (re-)lookup the 483 sym_fns table to use. Thus we will never be called. */ 484 gdb_assert_not_reached ("debug_sym_segments called"); 485 } 486 487 static void 488 debug_sym_read_linetable (struct objfile *objfile) 489 { 490 const struct debug_sym_fns_data *debug_data 491 = symfile_debug_objfile_data_key.get (objfile); 492 493 fprintf_filtered (gdb_stdlog, "sf->sym_read_linetable (%s)\n", 494 objfile_debug_name (objfile)); 495 496 debug_data->real_sf->sym_read_linetable (objfile); 497 } 498 499 static bfd_byte * 500 debug_sym_relocate (struct objfile *objfile, asection *sectp, bfd_byte *buf) 501 { 502 const struct debug_sym_fns_data *debug_data 503 = symfile_debug_objfile_data_key.get (objfile); 504 bfd_byte *retval; 505 506 retval = debug_data->real_sf->sym_relocate (objfile, sectp, buf); 507 508 fprintf_filtered (gdb_stdlog, 509 "sf->sym_relocate (%s, %s, %s) = %s\n", 510 objfile_debug_name (objfile), 511 host_address_to_string (sectp), 512 host_address_to_string (buf), 513 host_address_to_string (retval)); 514 515 return retval; 516 } 517 518 /* Template of debugging version of struct sym_fns. 519 A copy is made, with sym_flavour updated, and a pointer to the real table 520 installed in real_sf, and then a pointer to the copy is installed in the 521 objfile. */ 522 523 static const struct sym_fns debug_sym_fns = 524 { 525 debug_sym_new_init, 526 debug_sym_init, 527 debug_sym_read, 528 debug_sym_read_psymbols, 529 debug_sym_finish, 530 debug_sym_offsets, 531 debug_sym_segments, 532 debug_sym_read_linetable, 533 debug_sym_relocate, 534 &debug_sym_probe_fns, 535 &debug_sym_quick_functions 536 }; 537 538 /* Install the debugging versions of the symfile functions for OBJFILE. 539 Do not call this if the debug versions are already installed. */ 540 541 static void 542 install_symfile_debug_logging (struct objfile *objfile) 543 { 544 const struct sym_fns *real_sf; 545 struct debug_sym_fns_data *debug_data; 546 547 /* The debug versions should not already be installed. */ 548 gdb_assert (!symfile_debug_installed (objfile)); 549 550 real_sf = objfile->sf; 551 552 /* Alas we have to preserve NULL entries in REAL_SF. */ 553 debug_data = new struct debug_sym_fns_data; 554 555 #define COPY_SF_PTR(from, to, name, func) \ 556 do { \ 557 if ((from)->name) \ 558 (to)->debug_sf.name = func; \ 559 } while (0) 560 561 COPY_SF_PTR (real_sf, debug_data, sym_new_init, debug_sym_new_init); 562 COPY_SF_PTR (real_sf, debug_data, sym_init, debug_sym_init); 563 COPY_SF_PTR (real_sf, debug_data, sym_read, debug_sym_read); 564 COPY_SF_PTR (real_sf, debug_data, sym_read_psymbols, 565 debug_sym_read_psymbols); 566 COPY_SF_PTR (real_sf, debug_data, sym_finish, debug_sym_finish); 567 COPY_SF_PTR (real_sf, debug_data, sym_offsets, debug_sym_offsets); 568 COPY_SF_PTR (real_sf, debug_data, sym_segments, debug_sym_segments); 569 COPY_SF_PTR (real_sf, debug_data, sym_read_linetable, 570 debug_sym_read_linetable); 571 COPY_SF_PTR (real_sf, debug_data, sym_relocate, debug_sym_relocate); 572 if (real_sf->sym_probe_fns) 573 debug_data->debug_sf.sym_probe_fns = &debug_sym_probe_fns; 574 debug_data->debug_sf.qf = &debug_sym_quick_functions; 575 576 #undef COPY_SF_PTR 577 578 debug_data->real_sf = real_sf; 579 symfile_debug_objfile_data_key.set (objfile, debug_data); 580 objfile->sf = &debug_data->debug_sf; 581 } 582 583 /* Uninstall the debugging versions of the symfile functions for OBJFILE. 584 Do not call this if the debug versions are not installed. */ 585 586 static void 587 uninstall_symfile_debug_logging (struct objfile *objfile) 588 { 589 struct debug_sym_fns_data *debug_data; 590 591 /* The debug versions should be currently installed. */ 592 gdb_assert (symfile_debug_installed (objfile)); 593 594 debug_data = symfile_debug_objfile_data_key.get (objfile); 595 596 objfile->sf = debug_data->real_sf; 597 symfile_debug_objfile_data_key.clear (objfile); 598 } 599 600 /* Call this function to set OBJFILE->SF. 601 Do not set OBJFILE->SF directly. */ 602 603 void 604 objfile_set_sym_fns (struct objfile *objfile, const struct sym_fns *sf) 605 { 606 if (symfile_debug_installed (objfile)) 607 { 608 gdb_assert (debug_symfile); 609 /* Remove the current one, and reinstall a new one later. */ 610 uninstall_symfile_debug_logging (objfile); 611 } 612 613 /* Assume debug logging is disabled. */ 614 objfile->sf = sf; 615 616 /* Turn debug logging on if enabled. */ 617 if (debug_symfile) 618 install_symfile_debug_logging (objfile); 619 } 620 621 static void 622 set_debug_symfile (const char *args, int from_tty, struct cmd_list_element *c) 623 { 624 for (struct program_space *pspace : program_spaces) 625 for (objfile *objfile : pspace->objfiles ()) 626 { 627 if (debug_symfile) 628 { 629 if (!symfile_debug_installed (objfile)) 630 install_symfile_debug_logging (objfile); 631 } 632 else 633 { 634 if (symfile_debug_installed (objfile)) 635 uninstall_symfile_debug_logging (objfile); 636 } 637 } 638 } 639 640 static void 641 show_debug_symfile (struct ui_file *file, int from_tty, 642 struct cmd_list_element *c, const char *value) 643 { 644 fprintf_filtered (file, _("Symfile debugging is %s.\n"), value); 645 } 646 647 void _initialize_symfile_debug (); 648 void 649 _initialize_symfile_debug () 650 { 651 add_setshow_boolean_cmd ("symfile", no_class, &debug_symfile, _("\ 652 Set debugging of the symfile functions."), _("\ 653 Show debugging of the symfile functions."), _("\ 654 When enabled, all calls to the symfile functions are logged."), 655 set_debug_symfile, show_debug_symfile, 656 &setdebuglist, &showdebuglist); 657 658 /* Note: We don't need a new-objfile observer because debug logging 659 will be installed when objfile init'n calls objfile_set_sym_fns. */ 660 } 661