Eliminate exceptions.c:print_any_exception.
[deliverable/binutils-gdb.git] / gdb / gcore.c
CommitLineData
be4d1333 1/* Generate a core file for the inferior process.
1bac305b 2
ecd75fc8 3 Copyright (C) 2001-2014 Free Software Foundation, Inc.
be4d1333
MS
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
be4d1333
MS
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
be4d1333
MS
19
20#include "defs.h"
d3420b2f
MK
21#include "elf-bfd.h"
22#include "infcall.h"
be4d1333
MS
23#include "inferior.h"
24#include "gdbcore.h"
be4d1333 25#include "objfiles.h"
de18c1d8 26#include "solib.h"
d3420b2f 27#include "symfile.h"
0156b218
MS
28#include "arch-utils.h"
29#include "completer.h"
30#include "gcore.h"
d3420b2f 31#include "cli/cli-decode.h"
d3420b2f 32#include "gdb_assert.h"
0156b218
MS
33#include <fcntl.h>
34#include "regcache.h"
35#include "regset.h"
cbb099e8 36#include "gdb_bfd.h"
47ecca85 37#include "readline/tilde.h"
be4d1333 38
804e0f53
DJ
39/* The largest amount of memory to read from the target at once. We
40 must throttle it to limit the amount of memory used by GDB during
41 generate-core-file for programs with large resident data. */
42#define MAX_COPY_BYTES (1024 * 1024)
43
a78c2d62 44static const char *default_gcore_target (void);
d3420b2f
MK
45static enum bfd_architecture default_gcore_arch (void);
46static unsigned long default_gcore_mach (void);
47static int gcore_memory_sections (bfd *);
48
0156b218
MS
49/* create_gcore_bfd -- helper for gcore_command (exported).
50 Open a new bfd core file for output, and return the handle. */
be4d1333 51
0156b218 52bfd *
85e1311a 53create_gcore_bfd (const char *filename)
be4d1333 54{
1e351ed1 55 bfd *obfd = gdb_bfd_openw (filename, default_gcore_target ());
d8734c88 56
d3420b2f 57 if (!obfd)
0156b218 58 error (_("Failed to open '%s' for output."), filename);
be4d1333
MS
59 bfd_set_format (obfd, bfd_core);
60 bfd_set_arch_mach (obfd, default_gcore_arch (), default_gcore_mach ());
0156b218
MS
61 return obfd;
62}
63
5fff78c4 64/* write_gcore_file_1 -- do the actual work of write_gcore_file. */
0156b218 65
5fff78c4
MM
66static void
67write_gcore_file_1 (bfd *obfd)
0156b218 68{
1d1f1ccb 69 struct cleanup *cleanup;
0156b218
MS
70 void *note_data = NULL;
71 int note_size = 0;
72 asection *note_sec = NULL;
be4d1333 73
d3420b2f 74 /* An external target method must build the notes section. */
6432734d
UW
75 /* FIXME: uweigand/2011-10-06: All architectures that support core file
76 generation should be converted to gdbarch_make_corefile_notes; at that
77 point, the target vector method can be removed. */
f5656ead 78 if (!gdbarch_make_corefile_notes_p (target_gdbarch ()))
6432734d
UW
79 note_data = target_make_corefile_notes (obfd, &note_size);
80 else
f5656ead 81 note_data = gdbarch_make_corefile_notes (target_gdbarch (), obfd, &note_size);
6432734d 82
1d1f1ccb
MM
83 cleanup = make_cleanup (xfree, note_data);
84
6432734d
UW
85 if (note_data == NULL || note_size == 0)
86 error (_("Target does not support core file generation."));
be4d1333 87
d3420b2f 88 /* Create the note section. */
6432734d
UW
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);
be4d1333 100
d3420b2f 101 /* Now create the memory/load sections. */
be4d1333 102 if (gcore_memory_sections (obfd) == 0)
8a3fe4f8 103 error (_("gcore: failed to get corefile memory sections from target."));
be4d1333 104
d3420b2f 105 /* Write out the contents of the note section. */
6432734d
UW
106 if (!bfd_set_section_contents (obfd, note_sec, note_data, 0, note_size))
107 warning (_("writing note section (%s)"), bfd_errmsg (bfd_get_error ()));
1d1f1ccb
MM
108
109 do_cleanups (cleanup);
0156b218
MS
110}
111
5fff78c4
MM
112/* write_gcore_file -- helper for gcore_command (exported).
113 Compose and write the corefile data to the core file. */
114
115void
116write_gcore_file (bfd *obfd)
117{
118 volatile struct gdb_exception except;
119
120 target_prepare_to_generate_core ();
121
122 TRY_CATCH (except, RETURN_MASK_ALL)
123 write_gcore_file_1 (obfd);
124
125 target_done_generating_core ();
126
127 if (except.reason < 0)
128 throw_exception (except);
129}
130
14d1346b
DJ
131static void
132do_bfd_delete_cleanup (void *arg)
133{
134 bfd *obfd = arg;
135 const char *filename = obfd->filename;
136
cbb099e8 137 gdb_bfd_unref (arg);
14d1346b
DJ
138 unlink (filename);
139}
140
0156b218
MS
141/* gcore_command -- implements the 'gcore' command.
142 Generate a core file from the inferior process. */
143
144static void
145gcore_command (char *args, int from_tty)
146{
1e351ed1
PA
147 struct cleanup *filename_chain;
148 struct cleanup *bfd_chain;
149 char *corefilename;
0156b218
MS
150 bfd *obfd;
151
152 /* No use generating a corefile without a target process. */
153 if (!target_has_execution)
154 noprocess ();
155
156 if (args && *args)
1e351ed1 157 corefilename = tilde_expand (args);
0156b218
MS
158 else
159 {
160 /* Default corefile name is "core.PID". */
dfd4cc63 161 corefilename = xstrprintf ("core.%d", ptid_get_pid (inferior_ptid));
be4d1333 162 }
1e351ed1 163 filename_chain = make_cleanup (xfree, corefilename);
be4d1333 164
0156b218
MS
165 if (info_verbose)
166 fprintf_filtered (gdb_stdout,
167 "Opening corefile '%s' for output.\n", corefilename);
168
169 /* Open the output file. */
170 obfd = create_gcore_bfd (corefilename);
171
14d1346b 172 /* Need a cleanup that will close and delete the file. */
1e351ed1 173 bfd_chain = make_cleanup (do_bfd_delete_cleanup, obfd);
0156b218
MS
174
175 /* Call worker function. */
176 write_gcore_file (obfd);
177
d3420b2f 178 /* Succeeded. */
1e351ed1 179 discard_cleanups (bfd_chain);
cbb099e8 180 gdb_bfd_unref (obfd);
1e351ed1
PA
181
182 fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename);
183 do_cleanups (filename_chain);
be4d1333
MS
184}
185
186static unsigned long
187default_gcore_mach (void)
188{
d3420b2f 189#if 1 /* See if this even matters... */
6dbdc4a3
MS
190 return 0;
191#else
1143fffb 192
f5656ead 193 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch ());
be4d1333
MS
194
195 if (bfdarch != NULL)
196 return bfdarch->mach;
be4d1333 197 if (exec_bfd == NULL)
8a3fe4f8 198 error (_("Can't find default bfd machine type (need execfile)."));
be4d1333
MS
199
200 return bfd_get_mach (exec_bfd);
6dbdc4a3 201#endif /* 1 */
be4d1333
MS
202}
203
204static enum bfd_architecture
205default_gcore_arch (void)
206{
f5656ead 207 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch ());
be4d1333
MS
208
209 if (bfdarch != NULL)
210 return bfdarch->arch;
be4d1333 211 if (exec_bfd == NULL)
8a3fe4f8 212 error (_("Can't find bfd architecture for corefile (need execfile)."));
be4d1333
MS
213
214 return bfd_get_arch (exec_bfd);
215}
216
a78c2d62 217static const char *
be4d1333
MS
218default_gcore_target (void)
219{
a78c2d62 220 /* The gdbarch may define a target to use for core files. */
f5656ead
TT
221 if (gdbarch_gcore_bfd_target_p (target_gdbarch ()))
222 return gdbarch_gcore_bfd_target (target_gdbarch ());
a78c2d62
UW
223
224 /* Otherwise, try to fall back to the exec_bfd target. This will probably
225 not work for non-ELF targets. */
be4d1333 226 if (exec_bfd == NULL)
6dbdc4a3
MS
227 return NULL;
228 else
229 return bfd_get_target (exec_bfd);
be4d1333
MS
230}
231
d3420b2f
MK
232/* Derive a reasonable stack segment by unwinding the target stack,
233 and store its limits in *BOTTOM and *TOP. Return non-zero if
234 successful. */
be4d1333 235
cbb83bd1 236static int
69db8bae 237derive_stack_segment (bfd_vma *bottom, bfd_vma *top)
be4d1333 238{
be4d1333
MS
239 struct frame_info *fi, *tmp_fi;
240
d3420b2f
MK
241 gdb_assert (bottom);
242 gdb_assert (top);
be4d1333 243
d3420b2f 244 /* Can't succeed without stack and registers. */
be4d1333 245 if (!target_has_stack || !target_has_registers)
d3420b2f 246 return 0;
be4d1333 247
d3420b2f
MK
248 /* Can't succeed without current frame. */
249 fi = get_current_frame ();
250 if (fi == NULL)
251 return 0;
be4d1333 252
d3420b2f 253 /* Save frame pointer of TOS frame. */
8d357cca 254 *top = get_frame_base (fi);
d3420b2f 255 /* If current stack pointer is more "inner", use that instead. */
40a6adc1 256 if (gdbarch_inner_than (get_frame_arch (fi), get_frame_sp (fi), *top))
fb4443d8 257 *top = get_frame_sp (fi);
be4d1333 258
d3420b2f 259 /* Find prev-most frame. */
be4d1333
MS
260 while ((tmp_fi = get_prev_frame (fi)) != NULL)
261 fi = tmp_fi;
262
d3420b2f 263 /* Save frame pointer of prev-most frame. */
8d357cca 264 *bottom = get_frame_base (fi);
be4d1333 265
d3420b2f
MK
266 /* Now canonicalize their order, so that BOTTOM is a lower address
267 (as opposed to a lower stack frame). */
be4d1333
MS
268 if (*bottom > *top)
269 {
d3420b2f
MK
270 bfd_vma tmp_vma;
271
be4d1333
MS
272 tmp_vma = *top;
273 *top = *bottom;
274 *bottom = tmp_vma;
275 }
276
d3420b2f 277 return 1;
be4d1333
MS
278}
279
0156b218
MS
280/* call_target_sbrk --
281 helper function for derive_heap_segment. */
282
283static bfd_vma
284call_target_sbrk (int sbrk_arg)
285{
286 struct objfile *sbrk_objf;
287 struct gdbarch *gdbarch;
288 bfd_vma top_of_heap;
289 struct value *target_sbrk_arg;
290 struct value *sbrk_fn, *ret;
291 bfd_vma tmp;
292
3b7344d5 293 if (lookup_minimal_symbol ("sbrk", NULL, NULL).minsym != NULL)
0156b218
MS
294 {
295 sbrk_fn = find_function_in_inferior ("sbrk", &sbrk_objf);
296 if (sbrk_fn == NULL)
297 return (bfd_vma) 0;
298 }
3b7344d5 299 else if (lookup_minimal_symbol ("_sbrk", NULL, NULL).minsym != NULL)
0156b218
MS
300 {
301 sbrk_fn = find_function_in_inferior ("_sbrk", &sbrk_objf);
302 if (sbrk_fn == NULL)
303 return (bfd_vma) 0;
304 }
305 else
306 return (bfd_vma) 0;
307
308 gdbarch = get_objfile_arch (sbrk_objf);
309 target_sbrk_arg = value_from_longest (builtin_type (gdbarch)->builtin_int,
310 sbrk_arg);
311 gdb_assert (target_sbrk_arg);
312 ret = call_function_by_hand (sbrk_fn, 1, &target_sbrk_arg);
313 if (ret == NULL)
314 return (bfd_vma) 0;
315
316 tmp = value_as_long (ret);
317 if ((LONGEST) tmp <= 0 || (LONGEST) tmp == 0xffffffff)
318 return (bfd_vma) 0;
319
320 top_of_heap = tmp;
321 return top_of_heap;
322}
323
d3420b2f
MK
324/* Derive a reasonable heap segment for ABFD by looking at sbrk and
325 the static data sections. Store its limits in *BOTTOM and *TOP.
326 Return non-zero if successful. */
be4d1333 327
cbb83bd1 328static int
69db8bae 329derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top)
be4d1333
MS
330{
331 bfd_vma top_of_data_memory = 0;
332 bfd_vma top_of_heap = 0;
333 bfd_size_type sec_size;
be4d1333
MS
334 bfd_vma sec_vaddr;
335 asection *sec;
336
d3420b2f
MK
337 gdb_assert (bottom);
338 gdb_assert (top);
be4d1333 339
d3420b2f
MK
340 /* This function depends on being able to call a function in the
341 inferior. */
be4d1333 342 if (!target_has_execution)
d3420b2f
MK
343 return 0;
344
345 /* The following code assumes that the link map is arranged as
346 follows (low to high addresses):
be4d1333 347
d3420b2f
MK
348 ---------------------------------
349 | text sections |
350 ---------------------------------
351 | data sections (including bss) |
352 ---------------------------------
353 | heap |
354 --------------------------------- */
be4d1333
MS
355
356 for (sec = abfd->sections; sec; sec = sec->next)
357 {
d3420b2f
MK
358 if (bfd_get_section_flags (abfd, sec) & SEC_DATA
359 || strcmp (".bss", bfd_section_name (abfd, sec)) == 0)
be4d1333
MS
360 {
361 sec_vaddr = bfd_get_section_vma (abfd, sec);
2c500098 362 sec_size = bfd_get_section_size (sec);
be4d1333
MS
363 if (sec_vaddr + sec_size > top_of_data_memory)
364 top_of_data_memory = sec_vaddr + sec_size;
365 }
366 }
d3420b2f 367
0156b218
MS
368 top_of_heap = call_target_sbrk (0);
369 if (top_of_heap == (bfd_vma) 0)
be4d1333 370 return 0;
be4d1333 371
d3420b2f 372 /* Return results. */
be4d1333
MS
373 if (top_of_heap > top_of_data_memory)
374 {
375 *bottom = top_of_data_memory;
376 *top = top_of_heap;
d3420b2f 377 return 1;
be4d1333 378 }
d3420b2f
MK
379
380 /* No additional heap space needs to be saved. */
381 return 0;
be4d1333
MS
382}
383
be4d1333
MS
384static void
385make_output_phdrs (bfd *obfd, asection *osec, void *ignored)
386{
387 int p_flags = 0;
0156b218 388 int p_type = 0;
be4d1333
MS
389
390 /* FIXME: these constants may only be applicable for ELF. */
20fe79c8 391 if (strncmp (bfd_section_name (obfd, osec), "load", 4) == 0)
be4d1333 392 p_type = PT_LOAD;
0156b218 393 else if (strncmp (bfd_section_name (obfd, osec), "note", 4) == 0)
be4d1333 394 p_type = PT_NOTE;
0156b218
MS
395 else
396 p_type = PT_NULL;
be4d1333
MS
397
398 p_flags |= PF_R; /* Segment is readable. */
399 if (!(bfd_get_section_flags (obfd, osec) & SEC_READONLY))
400 p_flags |= PF_W; /* Segment is writable. */
401 if (bfd_get_section_flags (obfd, osec) & SEC_CODE)
402 p_flags |= PF_X; /* Segment is executable. */
403
d3420b2f 404 bfd_record_phdr (obfd, p_type, 1, p_flags, 0, 0, 0, 0, 1, &osec);
be4d1333
MS
405}
406
4f69f4c2
JK
407/* find_memory_region_ftype implementation. DATA is 'bfd *' for the core file
408 GDB is creating. */
409
cbb83bd1 410static int
4f69f4c2
JK
411gcore_create_callback (CORE_ADDR vaddr, unsigned long size, int read,
412 int write, int exec, int modified, void *data)
be4d1333 413{
cbb83bd1 414 bfd *obfd = data;
be4d1333 415 asection *osec;
cbb83bd1
RM
416 flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD;
417
86fbe6cc
EZ
418 /* If the memory segment has no permissions set, ignore it, otherwise
419 when we later try to access it for read/write, we'll get an error
420 or jam the kernel. */
4f69f4c2 421 if (read == 0 && write == 0 && exec == 0 && modified == 0)
86fbe6cc
EZ
422 {
423 if (info_verbose)
424 {
5af949e3 425 fprintf_filtered (gdb_stdout, "Ignore segment, %s bytes at %s\n",
f5656ead 426 plongest (size), paddress (target_gdbarch (), vaddr));
86fbe6cc
EZ
427 }
428
429 return 0;
430 }
431
4f69f4c2 432 if (write == 0 && modified == 0 && !solib_keep_data_in_core (vaddr, size))
cbb83bd1
RM
433 {
434 /* See if this region of memory lies inside a known file on disk.
435 If so, we can avoid copying its contents by clearing SEC_LOAD. */
436 struct objfile *objfile;
437 struct obj_section *objsec;
438
439 ALL_OBJSECTIONS (objfile, objsec)
440 {
441 bfd *abfd = objfile->obfd;
442 asection *asec = objsec->the_bfd_section;
443 bfd_vma align = (bfd_vma) 1 << bfd_get_section_alignment (abfd,
444 asec);
f1f6aadf
PA
445 bfd_vma start = obj_section_addr (objsec) & -align;
446 bfd_vma end = (obj_section_endaddr (objsec) + align - 1) & -align;
d8734c88 447
cbb83bd1
RM
448 /* Match if either the entire memory region lies inside the
449 section (i.e. a mapping covering some pages of a large
450 segment) or the entire section lies inside the memory region
451 (i.e. a mapping covering multiple small sections).
452
453 This BFD was synthesized from reading target memory,
454 we don't want to omit that. */
0c013353
JK
455 if (objfile->separate_debug_objfile_backlink == NULL
456 && ((vaddr >= start && vaddr + size <= end)
457 || (start >= vaddr && end <= vaddr + size))
cbb83bd1
RM
458 && !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY))
459 {
349126ea 460 flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
0963b4bd 461 goto keep; /* Break out of two nested for loops. */
cbb83bd1
RM
462 }
463 }
464
4f69f4c2 465 keep:;
cbb83bd1
RM
466 }
467
4f69f4c2
JK
468 if (write == 0)
469 flags |= SEC_READONLY;
470
cbb83bd1
RM
471 if (exec)
472 flags |= SEC_CODE;
473 else
474 flags |= SEC_DATA;
be4d1333 475
52b57208 476 osec = bfd_make_section_anyway_with_flags (obfd, "load", flags);
d3420b2f 477 if (osec == NULL)
be4d1333 478 {
8a3fe4f8 479 warning (_("Couldn't make gcore segment: %s"),
be4d1333 480 bfd_errmsg (bfd_get_error ()));
cbb83bd1 481 return 1;
be4d1333
MS
482 }
483
484 if (info_verbose)
485 {
5af949e3 486 fprintf_filtered (gdb_stdout, "Save segment, %s bytes at %s\n",
f5656ead 487 plongest (size), paddress (target_gdbarch (), vaddr));
be4d1333
MS
488 }
489
490 bfd_set_section_size (obfd, osec, size);
cbb83bd1 491 bfd_set_section_vma (obfd, osec, vaddr);
d3420b2f 492 bfd_section_lma (obfd, osec) = 0; /* ??? bfd_set_section_lma? */
cbb83bd1 493 return 0;
be4d1333
MS
494}
495
b427c1bc
TT
496int
497objfile_find_memory_regions (struct target_ops *self,
498 find_memory_region_ftype func, void *obfd)
be4d1333 499{
d3420b2f 500 /* Use objfile data to create memory sections. */
be4d1333
MS
501 struct objfile *objfile;
502 struct obj_section *objsec;
503 bfd_vma temp_bottom, temp_top;
504
d3420b2f 505 /* Call callback function for each objfile section. */
be4d1333
MS
506 ALL_OBJSECTIONS (objfile, objsec)
507 {
508 bfd *ibfd = objfile->obfd;
509 asection *isec = objsec->the_bfd_section;
510 flagword flags = bfd_get_section_flags (ibfd, isec);
be4d1333 511
4f69f4c2
JK
512 /* Separate debug info files are irrelevant for gcore. */
513 if (objfile->separate_debug_objfile_backlink != NULL)
514 continue;
515
be4d1333
MS
516 if ((flags & SEC_ALLOC) || (flags & SEC_LOAD))
517 {
518 int size = bfd_section_size (ibfd, isec);
519 int ret;
520
c6913b7d 521 ret = (*func) (obj_section_addr (objsec), size,
d3420b2f
MK
522 1, /* All sections will be readable. */
523 (flags & SEC_READONLY) == 0, /* Writable. */
524 (flags & SEC_CODE) != 0, /* Executable. */
4f69f4c2 525 1, /* MODIFIED is unknown, pass it as true. */
d3420b2f
MK
526 obfd);
527 if (ret != 0)
be4d1333
MS
528 return ret;
529 }
530 }
531
d3420b2f 532 /* Make a stack segment. */
be4d1333 533 if (derive_stack_segment (&temp_bottom, &temp_top))
cbb83bd1 534 (*func) (temp_bottom, temp_top - temp_bottom,
d3420b2f
MK
535 1, /* Stack section will be readable. */
536 1, /* Stack section will be writable. */
537 0, /* Stack section will not be executable. */
4f69f4c2 538 1, /* Stack section will be modified. */
be4d1333
MS
539 obfd);
540
0963b4bd 541 /* Make a heap segment. */
be4d1333 542 if (derive_heap_segment (exec_bfd, &temp_bottom, &temp_top))
d3420b2f
MK
543 (*func) (temp_bottom, temp_top - temp_bottom,
544 1, /* Heap section will be readable. */
545 1, /* Heap section will be writable. */
546 0, /* Heap section will not be executable. */
4f69f4c2 547 1, /* Heap section will be modified. */
be4d1333 548 obfd);
d3420b2f 549
be4d1333
MS
550 return 0;
551}
552
553static void
554gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
555{
804e0f53
DJ
556 bfd_size_type size, total_size = bfd_section_size (obfd, osec);
557 file_ptr offset = 0;
be4d1333
MS
558 struct cleanup *old_chain = NULL;
559 void *memhunk;
560
cbb83bd1
RM
561 /* Read-only sections are marked; we don't have to copy their contents. */
562 if ((bfd_get_section_flags (obfd, osec) & SEC_LOAD) == 0)
d3420b2f
MK
563 return;
564
565 /* Only interested in "load" sections. */
20fe79c8 566 if (strncmp ("load", bfd_section_name (obfd, osec), 4) != 0)
d3420b2f 567 return;
be4d1333 568
804e0f53 569 size = min (total_size, MAX_COPY_BYTES);
d3420b2f 570 memhunk = xmalloc (size);
be4d1333
MS
571 old_chain = make_cleanup (xfree, memhunk);
572
804e0f53
DJ
573 while (total_size > 0)
574 {
575 if (size > total_size)
576 size = total_size;
577
578 if (target_read_memory (bfd_section_vma (obfd, osec) + offset,
579 memhunk, size) != 0)
580 {
3e43a32a
MS
581 warning (_("Memory read failed for corefile "
582 "section, %s bytes at %s."),
5af949e3 583 plongest (size),
f5656ead 584 paddress (target_gdbarch (), bfd_section_vma (obfd, osec)));
804e0f53
DJ
585 break;
586 }
587 if (!bfd_set_section_contents (obfd, osec, memhunk, offset, size))
588 {
589 warning (_("Failed to write corefile contents (%s)."),
590 bfd_errmsg (bfd_get_error ()));
591 break;
592 }
593
594 total_size -= size;
595 offset += size;
596 }
be4d1333 597
d3420b2f 598 do_cleanups (old_chain); /* Frees MEMHUNK. */
be4d1333
MS
599}
600
601static int
602gcore_memory_sections (bfd *obfd)
603{
35c2fab7 604 /* Try gdbarch method first, then fall back to target method. */
f5656ead
TT
605 if (!gdbarch_find_memory_regions_p (target_gdbarch ())
606 || gdbarch_find_memory_regions (target_gdbarch (),
35c2fab7
UW
607 gcore_create_callback, obfd) != 0)
608 {
609 if (target_find_memory_regions (gcore_create_callback, obfd) != 0)
610 return 0; /* FIXME: error return/msg? */
611 }
be4d1333 612
d3420b2f 613 /* Record phdrs for section-to-segment mapping. */
be4d1333
MS
614 bfd_map_over_sections (obfd, make_output_phdrs, NULL);
615
d3420b2f 616 /* Copy memory region contents. */
be4d1333
MS
617 bfd_map_over_sections (obfd, gcore_copy_callback, NULL);
618
d3420b2f 619 return 1;
be4d1333
MS
620}
621
2c0b251b
PA
622/* Provide a prototype to silence -Wmissing-prototypes. */
623extern initialize_file_ftype _initialize_gcore;
624
be4d1333
MS
625void
626_initialize_gcore (void)
627{
1bedd215 628 add_com ("generate-core-file", class_files, gcore_command, _("\
d3420b2f 629Save a core file with the current state of the debugged process.\n\
1bedd215 630Argument is optional filename. Default filename is 'core.<process_id>'."));
be4d1333
MS
631
632 add_com_alias ("gcore", "generate-core-file", class_files, 1);
be4d1333 633}
This page took 0.878977 seconds and 4 git commands to generate.