diff options
author | Michael Snyder <msnyder@vmware.com> | 2002-01-09 00:37:02 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 2002-01-09 00:37:02 +0000 |
commit | be4d1333163c056f725fbbb96b400ce3d22802a7 (patch) | |
tree | b20c9b67c29126bd6eb838a22fa55c87a8eaf629 /gdb/exec.c | |
parent | 30070dac97fea15a420b3f3930b5a20535279ea7 (diff) | |
download | gdb-be4d1333163c056f725fbbb96b400ce3d22802a7.zip gdb-be4d1333163c056f725fbbb96b400ce3d22802a7.tar.gz gdb-be4d1333163c056f725fbbb96b400ce3d22802a7.tar.bz2 |
2002-01-03 Michael Snyder <msnyder@redhat.com>
Implement a "generate-core-file" command in gdb, save target state.
* gcore.c: New file. Implement new command 'generate-core-file'.
Save a corefile image of the current state of the inferior.
* linux-proc.c: Add linux-specific code for saving corefiles.
* target.h (struct target_ops): Add new target vectors for saving
corefiles; to_find_memory_regions and to_make_corefile_notes.
(target_find_memory_regions): New macro.
(target_make_corefile_notes): New macro.
* target.c (update_current_target): Inherit new target methods.
(dummy_find_memory_regions): New place-holder method.
(dummy_make_corefile_notes): New place-holder method.
(init_dummy_target): Initialize new dummy target vectors.
* exec.c (exec_set_find_memory_regions): New function.
Allow the exec_ops vector for memory regions to be taken over.
(exec_make_note_section): New function, target vector method.
* defs.h (exec_set_find_memory_regions): Export prototype.
* procfs.c (proc_find_memory_regions): New function, corefile method.
(procfs_make_note_section): New function, corefile method.
(init_procfs_ops): Set new target vector pointers.
(find_memory_regions_callback): New function.
(procfs_do_thread_registers): New function.
(procfs_corefile_thread_callback): New function.
* sol-thread.c (sol_find_memory_regions): New function.
(sol_make_note_section): New function.
(init_sol_thread_ops): Initialize new target vectors.
* inftarg.c (inftarg_set_find_memory_regions): New function.
Allow to_find_memory_regions vector to be taken over.
(inftarg_set_make_corefile_notes): New function.
Allow to_make_corefile_notes vector to be taken over.
* thread-db.c (thread_db_new_objfile): Don't activate thread-db
interface layer if not target_has_execution (may be a corefile).
* config/i386/linux.mh: Add gcore.o to NATDEPFILES.
* config/sparc/sun4sol2.mh: Ditto.
* config/alpha/alpha-linux.mh: Ditto.
* config/arm/linux.mh: Ditto.
* config/i386/x86-64linux.mh: Ditto.
* config/ia64/linux.mh: Ditto.
* config/m68k/linux.mh: Ditto.
* config/mips/linux.mh: Ditto.
* config/powerpc/linux.mh: Ditto.
* config/sparc/linux.mh: Ditto.
Diffstat (limited to 'gdb/exec.c')
-rw-r--r-- | gdb/exec.c | 50 |
1 files changed, 48 insertions, 2 deletions
@@ -1,6 +1,6 @@ /* Work with executable files, for GDB. Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, - 1998, 1999, 2000, 2001 + 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GDB. @@ -685,10 +685,24 @@ ignore (CORE_ADDR addr, char *contents) return 0; } +/* Find mapped memory. */ + +extern void +exec_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR, + unsigned long, + int, int, int, + void *), + void *)) +{ + exec_ops.to_find_memory_regions = func; +} + +static char *exec_make_note_section (bfd *, int *); + /* Fill in the exec file target vector. Very few entries need to be defined. */ -void +static void init_exec_ops (void) { exec_ops.to_shortname = "exec"; @@ -708,6 +722,7 @@ Specify the filename of the executable file."; exec_ops.to_clone_and_follow_inferior = find_default_clone_and_follow_inferior; exec_ops.to_stratum = file_stratum; exec_ops.to_has_memory = 1; + exec_ops.to_make_corefile_notes = exec_make_note_section; exec_ops.to_magic = OPS_MAGIC; } @@ -752,3 +767,34 @@ file itself are wrong. Each section must be changed separately. The\n\ add_target (&exec_ops); } + +static char * +exec_make_note_section (bfd *obfd, int *note_size) +{ + struct cleanup *old_chain; + char fname[16] = {'\0'}; + char psargs[80] = {'\0'}; + char *note_data = NULL; + + if (get_exec_file (0)) + { + strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname)); + strncpy (psargs, get_exec_file (0), + sizeof (psargs)); + if (get_inferior_args ()) + { + strncat (psargs, " ", + sizeof (psargs) - strlen (psargs)); + strncat (psargs, get_inferior_args (), + sizeof (psargs) - strlen (psargs)); + } + + note_data = (char *) elfcore_write_prpsinfo (obfd, + note_data, + note_size, + fname, + psargs); + make_cleanup (xfree, note_data); + } + return note_data; +} |