1 /* Generate a core file for the inferior process. 2 3 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 4 Free Software Foundation, Inc. 5 6 This file is part of GDB. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21 #include "defs.h" 22 #include "elf-bfd.h" 23 #include "infcall.h" 24 #include "inferior.h" 25 #include "gdbcore.h" 26 #include "objfiles.h" 27 #include "symfile.h" 28 29 #include "cli/cli-decode.h" 30 31 #include "gdb_assert.h" 32 33 /* The largest amount of memory to read from the target at once. We 34 must throttle it to limit the amount of memory used by GDB during 35 generate-core-file for programs with large resident data. */ 36 #define MAX_COPY_BYTES (1024 * 1024) 37 38 static const char *default_gcore_target (void); 39 static enum bfd_architecture default_gcore_arch (void); 40 static unsigned long default_gcore_mach (void); 41 static int gcore_memory_sections (bfd *); 42 43 /* Generate a core file from the inferior process. */ 44 45 static void 46 gcore_command (char *args, int from_tty) 47 { 48 struct cleanup *old_chain; 49 char *corefilename, corefilename_buffer[40]; 50 asection *note_sec = NULL; 51 bfd *obfd; 52 void *note_data = NULL; 53 int note_size = 0; 54 55 /* No use generating a corefile without a target process. */ 56 if (!target_has_execution) 57 noprocess (); 58 59 if (args && *args) 60 corefilename = args; 61 else 62 { 63 /* Default corefile name is "core.PID". */ 64 sprintf (corefilename_buffer, "core.%d", PIDGET (inferior_ptid)); 65 corefilename = corefilename_buffer; 66 } 67 68 if (info_verbose) 69 fprintf_filtered (gdb_stdout, 70 "Opening corefile '%s' for output.\n", corefilename); 71 72 /* Open the output file. */ 73 obfd = bfd_openw (corefilename, default_gcore_target ()); 74 if (!obfd) 75 error (_("Failed to open '%s' for output."), corefilename); 76 77 /* Need a cleanup that will close the file (FIXME: delete it?). */ 78 old_chain = make_cleanup_bfd_close (obfd); 79 80 bfd_set_format (obfd, bfd_core); 81 bfd_set_arch_mach (obfd, default_gcore_arch (), default_gcore_mach ()); 82 83 /* An external target method must build the notes section. */ 84 note_data = target_make_corefile_notes (obfd, ¬e_size); 85 86 /* Create the note section. */ 87 if (note_data != NULL && note_size != 0) 88 { 89 note_sec = bfd_make_section_anyway_with_flags (obfd, "note0", 90 SEC_HAS_CONTENTS 91 | SEC_READONLY 92 | SEC_ALLOC); 93 if (note_sec == NULL) 94 error (_("Failed to create 'note' section for corefile: %s"), 95 bfd_errmsg (bfd_get_error ())); 96 97 bfd_set_section_vma (obfd, note_sec, 0); 98 bfd_set_section_alignment (obfd, note_sec, 0); 99 bfd_set_section_size (obfd, note_sec, note_size); 100 } 101 102 /* Now create the memory/load sections. */ 103 if (gcore_memory_sections (obfd) == 0) 104 error (_("gcore: failed to get corefile memory sections from target.")); 105 106 /* Write out the contents of the note section. */ 107 if (note_data != NULL && note_size != 0) 108 { 109 if (!bfd_set_section_contents (obfd, note_sec, note_data, 0, note_size)) 110 warning (_("writing note section (%s)"), bfd_errmsg (bfd_get_error ())); 111 } 112 113 /* Succeeded. */ 114 fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename); 115 116 /* Clean-ups will close the output file and free malloc memory. */ 117 do_cleanups (old_chain); 118 return; 119 } 120 121 static unsigned long 122 default_gcore_mach (void) 123 { 124 #if 1 /* See if this even matters... */ 125 return 0; 126 #else 127 128 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch); 129 130 if (bfdarch != NULL) 131 return bfdarch->mach; 132 if (exec_bfd == NULL) 133 error (_("Can't find default bfd machine type (need execfile).")); 134 135 return bfd_get_mach (exec_bfd); 136 #endif /* 1 */ 137 } 138 139 static enum bfd_architecture 140 default_gcore_arch (void) 141 { 142 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch); 143 144 if (bfdarch != NULL) 145 return bfdarch->arch; 146 if (exec_bfd == NULL) 147 error (_("Can't find bfd architecture for corefile (need execfile).")); 148 149 return bfd_get_arch (exec_bfd); 150 } 151 152 static const char * 153 default_gcore_target (void) 154 { 155 /* The gdbarch may define a target to use for core files. */ 156 if (gdbarch_gcore_bfd_target_p (target_gdbarch)) 157 return gdbarch_gcore_bfd_target (target_gdbarch); 158 159 /* Otherwise, try to fall back to the exec_bfd target. This will probably 160 not work for non-ELF targets. */ 161 if (exec_bfd == NULL) 162 return NULL; 163 else 164 return bfd_get_target (exec_bfd); 165 } 166 167 /* Derive a reasonable stack segment by unwinding the target stack, 168 and store its limits in *BOTTOM and *TOP. Return non-zero if 169 successful. */ 170 171 static int 172 derive_stack_segment (bfd_vma *bottom, bfd_vma *top) 173 { 174 struct frame_info *fi, *tmp_fi; 175 176 gdb_assert (bottom); 177 gdb_assert (top); 178 179 /* Can't succeed without stack and registers. */ 180 if (!target_has_stack || !target_has_registers) 181 return 0; 182 183 /* Can't succeed without current frame. */ 184 fi = get_current_frame (); 185 if (fi == NULL) 186 return 0; 187 188 /* Save frame pointer of TOS frame. */ 189 *top = get_frame_base (fi); 190 /* If current stack pointer is more "inner", use that instead. */ 191 if (gdbarch_inner_than (get_frame_arch (fi), get_frame_sp (fi), *top)) 192 *top = get_frame_sp (fi); 193 194 /* Find prev-most frame. */ 195 while ((tmp_fi = get_prev_frame (fi)) != NULL) 196 fi = tmp_fi; 197 198 /* Save frame pointer of prev-most frame. */ 199 *bottom = get_frame_base (fi); 200 201 /* Now canonicalize their order, so that BOTTOM is a lower address 202 (as opposed to a lower stack frame). */ 203 if (*bottom > *top) 204 { 205 bfd_vma tmp_vma; 206 207 tmp_vma = *top; 208 *top = *bottom; 209 *bottom = tmp_vma; 210 } 211 212 return 1; 213 } 214 215 /* Derive a reasonable heap segment for ABFD by looking at sbrk and 216 the static data sections. Store its limits in *BOTTOM and *TOP. 217 Return non-zero if successful. */ 218 219 static int 220 derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top) 221 { 222 struct objfile *sbrk_objf; 223 struct gdbarch *gdbarch; 224 bfd_vma top_of_data_memory = 0; 225 bfd_vma top_of_heap = 0; 226 bfd_size_type sec_size; 227 struct value *zero, *sbrk; 228 bfd_vma sec_vaddr; 229 asection *sec; 230 231 gdb_assert (bottom); 232 gdb_assert (top); 233 234 /* This function depends on being able to call a function in the 235 inferior. */ 236 if (!target_has_execution) 237 return 0; 238 239 /* The following code assumes that the link map is arranged as 240 follows (low to high addresses): 241 242 --------------------------------- 243 | text sections | 244 --------------------------------- 245 | data sections (including bss) | 246 --------------------------------- 247 | heap | 248 --------------------------------- */ 249 250 for (sec = abfd->sections; sec; sec = sec->next) 251 { 252 if (bfd_get_section_flags (abfd, sec) & SEC_DATA 253 || strcmp (".bss", bfd_section_name (abfd, sec)) == 0) 254 { 255 sec_vaddr = bfd_get_section_vma (abfd, sec); 256 sec_size = bfd_get_section_size (sec); 257 if (sec_vaddr + sec_size > top_of_data_memory) 258 top_of_data_memory = sec_vaddr + sec_size; 259 } 260 } 261 262 /* Now get the top-of-heap by calling sbrk in the inferior. */ 263 if (lookup_minimal_symbol ("sbrk", NULL, NULL) != NULL) 264 { 265 sbrk = find_function_in_inferior ("sbrk", &sbrk_objf); 266 if (sbrk == NULL) 267 return 0; 268 } 269 else if (lookup_minimal_symbol ("_sbrk", NULL, NULL) != NULL) 270 { 271 sbrk = find_function_in_inferior ("_sbrk", &sbrk_objf); 272 if (sbrk == NULL) 273 return 0; 274 } 275 else 276 return 0; 277 278 gdbarch = get_objfile_arch (sbrk_objf); 279 zero = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); 280 gdb_assert (zero); 281 sbrk = call_function_by_hand (sbrk, 1, &zero); 282 if (sbrk == NULL) 283 return 0; 284 top_of_heap = value_as_long (sbrk); 285 286 /* Return results. */ 287 if (top_of_heap > top_of_data_memory) 288 { 289 *bottom = top_of_data_memory; 290 *top = top_of_heap; 291 return 1; 292 } 293 294 /* No additional heap space needs to be saved. */ 295 return 0; 296 } 297 298 static void 299 make_output_phdrs (bfd *obfd, asection *osec, void *ignored) 300 { 301 int p_flags = 0; 302 int p_type; 303 304 /* FIXME: these constants may only be applicable for ELF. */ 305 if (strncmp (bfd_section_name (obfd, osec), "load", 4) == 0) 306 p_type = PT_LOAD; 307 else 308 p_type = PT_NOTE; 309 310 p_flags |= PF_R; /* Segment is readable. */ 311 if (!(bfd_get_section_flags (obfd, osec) & SEC_READONLY)) 312 p_flags |= PF_W; /* Segment is writable. */ 313 if (bfd_get_section_flags (obfd, osec) & SEC_CODE) 314 p_flags |= PF_X; /* Segment is executable. */ 315 316 bfd_record_phdr (obfd, p_type, 1, p_flags, 0, 0, 0, 0, 1, &osec); 317 } 318 319 static int 320 gcore_create_callback (CORE_ADDR vaddr, unsigned long size, 321 int read, int write, int exec, void *data) 322 { 323 bfd *obfd = data; 324 asection *osec; 325 flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD; 326 327 /* If the memory segment has no permissions set, ignore it, otherwise 328 when we later try to access it for read/write, we'll get an error 329 or jam the kernel. */ 330 if (read == 0 && write == 0 && exec == 0) 331 { 332 if (info_verbose) 333 { 334 fprintf_filtered (gdb_stdout, "Ignore segment, %s bytes at %s\n", 335 plongest (size), paddress (target_gdbarch, vaddr)); 336 } 337 338 return 0; 339 } 340 341 if (write == 0) 342 { 343 /* See if this region of memory lies inside a known file on disk. 344 If so, we can avoid copying its contents by clearing SEC_LOAD. */ 345 struct objfile *objfile; 346 struct obj_section *objsec; 347 348 ALL_OBJSECTIONS (objfile, objsec) 349 { 350 bfd *abfd = objfile->obfd; 351 asection *asec = objsec->the_bfd_section; 352 bfd_vma align = (bfd_vma) 1 << bfd_get_section_alignment (abfd, 353 asec); 354 bfd_vma start = obj_section_addr (objsec) & -align; 355 bfd_vma end = (obj_section_endaddr (objsec) + align - 1) & -align; 356 /* Match if either the entire memory region lies inside the 357 section (i.e. a mapping covering some pages of a large 358 segment) or the entire section lies inside the memory region 359 (i.e. a mapping covering multiple small sections). 360 361 This BFD was synthesized from reading target memory, 362 we don't want to omit that. */ 363 if (((vaddr >= start && vaddr + size <= end) 364 || (start >= vaddr && end <= vaddr + size)) 365 && !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY)) 366 { 367 flags &= ~SEC_LOAD; 368 flags |= SEC_NEVER_LOAD; 369 goto keep; /* break out of two nested for loops */ 370 } 371 } 372 373 keep: 374 flags |= SEC_READONLY; 375 } 376 377 if (exec) 378 flags |= SEC_CODE; 379 else 380 flags |= SEC_DATA; 381 382 osec = bfd_make_section_anyway_with_flags (obfd, "load", flags); 383 if (osec == NULL) 384 { 385 warning (_("Couldn't make gcore segment: %s"), 386 bfd_errmsg (bfd_get_error ())); 387 return 1; 388 } 389 390 if (info_verbose) 391 { 392 fprintf_filtered (gdb_stdout, "Save segment, %s bytes at %s\n", 393 plongest (size), paddress (target_gdbarch, vaddr)); 394 } 395 396 bfd_set_section_size (obfd, osec, size); 397 bfd_set_section_vma (obfd, osec, vaddr); 398 bfd_section_lma (obfd, osec) = 0; /* ??? bfd_set_section_lma? */ 399 return 0; 400 } 401 402 static int 403 objfile_find_memory_regions (int (*func) (CORE_ADDR, unsigned long, 404 int, int, int, void *), 405 void *obfd) 406 { 407 /* Use objfile data to create memory sections. */ 408 struct objfile *objfile; 409 struct obj_section *objsec; 410 bfd_vma temp_bottom, temp_top; 411 412 /* Call callback function for each objfile section. */ 413 ALL_OBJSECTIONS (objfile, objsec) 414 { 415 bfd *ibfd = objfile->obfd; 416 asection *isec = objsec->the_bfd_section; 417 flagword flags = bfd_get_section_flags (ibfd, isec); 418 int ret; 419 420 if ((flags & SEC_ALLOC) || (flags & SEC_LOAD)) 421 { 422 int size = bfd_section_size (ibfd, isec); 423 int ret; 424 425 ret = (*func) (obj_section_addr (objsec), bfd_section_size (ibfd, isec), 426 1, /* All sections will be readable. */ 427 (flags & SEC_READONLY) == 0, /* Writable. */ 428 (flags & SEC_CODE) != 0, /* Executable. */ 429 obfd); 430 if (ret != 0) 431 return ret; 432 } 433 } 434 435 /* Make a stack segment. */ 436 if (derive_stack_segment (&temp_bottom, &temp_top)) 437 (*func) (temp_bottom, temp_top - temp_bottom, 438 1, /* Stack section will be readable. */ 439 1, /* Stack section will be writable. */ 440 0, /* Stack section will not be executable. */ 441 obfd); 442 443 /* Make a heap segment. */ 444 if (derive_heap_segment (exec_bfd, &temp_bottom, &temp_top)) 445 (*func) (temp_bottom, temp_top - temp_bottom, 446 1, /* Heap section will be readable. */ 447 1, /* Heap section will be writable. */ 448 0, /* Heap section will not be executable. */ 449 obfd); 450 451 return 0; 452 } 453 454 static void 455 gcore_copy_callback (bfd *obfd, asection *osec, void *ignored) 456 { 457 bfd_size_type size, total_size = bfd_section_size (obfd, osec); 458 file_ptr offset = 0; 459 struct cleanup *old_chain = NULL; 460 void *memhunk; 461 462 /* Read-only sections are marked; we don't have to copy their contents. */ 463 if ((bfd_get_section_flags (obfd, osec) & SEC_LOAD) == 0) 464 return; 465 466 /* Only interested in "load" sections. */ 467 if (strncmp ("load", bfd_section_name (obfd, osec), 4) != 0) 468 return; 469 470 size = min (total_size, MAX_COPY_BYTES); 471 memhunk = xmalloc (size); 472 /* ??? This is crap since xmalloc should never return NULL. */ 473 if (memhunk == NULL) 474 error (_("Not enough memory to create corefile.")); 475 old_chain = make_cleanup (xfree, memhunk); 476 477 while (total_size > 0) 478 { 479 if (size > total_size) 480 size = total_size; 481 482 if (target_read_memory (bfd_section_vma (obfd, osec) + offset, 483 memhunk, size) != 0) 484 { 485 warning (_("Memory read failed for corefile section, %s bytes at %s."), 486 plongest (size), 487 paddress (target_gdbarch, bfd_section_vma (obfd, osec))); 488 break; 489 } 490 if (!bfd_set_section_contents (obfd, osec, memhunk, offset, size)) 491 { 492 warning (_("Failed to write corefile contents (%s)."), 493 bfd_errmsg (bfd_get_error ())); 494 break; 495 } 496 497 total_size -= size; 498 offset += size; 499 } 500 501 do_cleanups (old_chain); /* Frees MEMHUNK. */ 502 } 503 504 static int 505 gcore_memory_sections (bfd *obfd) 506 { 507 if (target_find_memory_regions (gcore_create_callback, obfd) != 0) 508 return 0; /* FIXME: error return/msg? */ 509 510 /* Record phdrs for section-to-segment mapping. */ 511 bfd_map_over_sections (obfd, make_output_phdrs, NULL); 512 513 /* Copy memory region contents. */ 514 bfd_map_over_sections (obfd, gcore_copy_callback, NULL); 515 516 return 1; 517 } 518 519 /* Provide a prototype to silence -Wmissing-prototypes. */ 520 extern initialize_file_ftype _initialize_gcore; 521 522 void 523 _initialize_gcore (void) 524 { 525 add_com ("generate-core-file", class_files, gcore_command, _("\ 526 Save a core file with the current state of the debugged process.\n\ 527 Argument is optional filename. Default filename is 'core.<process_id>'.")); 528 529 add_com_alias ("gcore", "generate-core-file", class_files, 1); 530 exec_set_find_memory_regions (objfile_find_memory_regions); 531 } 532