gdb: Implement native dumpcore function
Add new API for systems with native kernel support for dumping a process on demand. Wire it into the gdb's gcore functionality. gdb/ChangeLog: * target.h (supports_dumpcore, dumpcore): New function declarations. * target.c (supports_dumpcore, dumpcore): New functions. * target-delegates.c: Rebuild. * gcore.c (gcore_command): Use target_supports_dumpcore () and target_dumpcore ().
This commit is contained in:
parent
002a3166d3
commit
b31488a344
@ -1,3 +1,13 @@
|
|||||||
|
2020-08-13 Kamil Rytarowski <n54@gmx.com>
|
||||||
|
|
||||||
|
* target.h (supports_dumpcore, dumpcore): New
|
||||||
|
function declarations.
|
||||||
|
* target.c (supports_dumpcore, dumpcore): New
|
||||||
|
functions.
|
||||||
|
* target-delegates.c: Rebuild.
|
||||||
|
* gcore.c (gcore_command): Use target_supports_dumpcore ()
|
||||||
|
and target_dumpcore ().
|
||||||
|
|
||||||
2020-08-13 Aaron Merey <amerey@redhat.com>
|
2020-08-13 Aaron Merey <amerey@redhat.com>
|
||||||
|
|
||||||
* debuginfod-support.c: Replace global variables with user_data.
|
* debuginfod-support.c: Replace global variables with user_data.
|
||||||
|
21
gdb/gcore.c
21
gdb/gcore.c
@ -145,17 +145,22 @@ gcore_command (const char *args, int from_tty)
|
|||||||
"Opening corefile '%s' for output.\n",
|
"Opening corefile '%s' for output.\n",
|
||||||
corefilename.get ());
|
corefilename.get ());
|
||||||
|
|
||||||
/* Open the output file. */
|
if (target_supports_dumpcore ())
|
||||||
gdb_bfd_ref_ptr obfd (create_gcore_bfd (corefilename.get ()));
|
target_dumpcore (corefilename.get ());
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Open the output file. */
|
||||||
|
gdb_bfd_ref_ptr obfd (create_gcore_bfd (corefilename.get ()));
|
||||||
|
|
||||||
/* Arrange to unlink the file on failure. */
|
/* Arrange to unlink the file on failure. */
|
||||||
gdb::unlinker unlink_file (corefilename.get ());
|
gdb::unlinker unlink_file (corefilename.get ());
|
||||||
|
|
||||||
/* Call worker function. */
|
/* Call worker function. */
|
||||||
write_gcore_file (obfd.get ());
|
write_gcore_file (obfd.get ());
|
||||||
|
|
||||||
/* Succeeded. */
|
/* Succeeded. */
|
||||||
unlink_file.keep ();
|
unlink_file.keep ();
|
||||||
|
}
|
||||||
|
|
||||||
fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename.get ());
|
fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename.get ());
|
||||||
}
|
}
|
||||||
|
@ -108,6 +108,8 @@ struct dummy_target : public target_ops
|
|||||||
bool supports_disable_randomization () override;
|
bool supports_disable_randomization () override;
|
||||||
bool supports_string_tracing () override;
|
bool supports_string_tracing () override;
|
||||||
bool supports_evaluation_of_breakpoint_conditions () override;
|
bool supports_evaluation_of_breakpoint_conditions () override;
|
||||||
|
bool supports_dumpcore () override;
|
||||||
|
void dumpcore (const char *arg0) override;
|
||||||
bool can_run_breakpoint_commands () override;
|
bool can_run_breakpoint_commands () override;
|
||||||
struct gdbarch *thread_architecture (ptid_t arg0) override;
|
struct gdbarch *thread_architecture (ptid_t arg0) override;
|
||||||
struct address_space *thread_address_space (ptid_t arg0) override;
|
struct address_space *thread_address_space (ptid_t arg0) override;
|
||||||
@ -277,6 +279,8 @@ struct debug_target : public target_ops
|
|||||||
bool supports_disable_randomization () override;
|
bool supports_disable_randomization () override;
|
||||||
bool supports_string_tracing () override;
|
bool supports_string_tracing () override;
|
||||||
bool supports_evaluation_of_breakpoint_conditions () override;
|
bool supports_evaluation_of_breakpoint_conditions () override;
|
||||||
|
bool supports_dumpcore () override;
|
||||||
|
void dumpcore (const char *arg0) override;
|
||||||
bool can_run_breakpoint_commands () override;
|
bool can_run_breakpoint_commands () override;
|
||||||
struct gdbarch *thread_architecture (ptid_t arg0) override;
|
struct gdbarch *thread_architecture (ptid_t arg0) override;
|
||||||
struct address_space *thread_address_space (ptid_t arg0) override;
|
struct address_space *thread_address_space (ptid_t arg0) override;
|
||||||
@ -2825,6 +2829,52 @@ debug_target::supports_evaluation_of_breakpoint_conditions ()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
target_ops::supports_dumpcore ()
|
||||||
|
{
|
||||||
|
return this->beneath ()->supports_dumpcore ();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
dummy_target::supports_dumpcore ()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
debug_target::supports_dumpcore ()
|
||||||
|
{
|
||||||
|
bool result;
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "-> %s->supports_dumpcore (...)\n", this->beneath ()->shortname ());
|
||||||
|
result = this->beneath ()->supports_dumpcore ();
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "<- %s->supports_dumpcore (", this->beneath ()->shortname ());
|
||||||
|
fputs_unfiltered (") = ", gdb_stdlog);
|
||||||
|
target_debug_print_bool (result);
|
||||||
|
fputs_unfiltered ("\n", gdb_stdlog);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
target_ops::dumpcore (const char *arg0)
|
||||||
|
{
|
||||||
|
this->beneath ()->dumpcore (arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dummy_target::dumpcore (const char *arg0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
debug_target::dumpcore (const char *arg0)
|
||||||
|
{
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "-> %s->dumpcore (...)\n", this->beneath ()->shortname ());
|
||||||
|
this->beneath ()->dumpcore (arg0);
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "<- %s->dumpcore (", this->beneath ()->shortname ());
|
||||||
|
target_debug_print_const_char_p (arg0);
|
||||||
|
fputs_unfiltered (")\n", gdb_stdlog);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
target_ops::can_run_breakpoint_commands ()
|
target_ops::can_run_breakpoint_commands ()
|
||||||
{
|
{
|
||||||
|
18
gdb/target.h
18
gdb/target.h
@ -881,6 +881,14 @@ struct target_ops
|
|||||||
virtual bool supports_evaluation_of_breakpoint_conditions ()
|
virtual bool supports_evaluation_of_breakpoint_conditions ()
|
||||||
TARGET_DEFAULT_RETURN (false);
|
TARGET_DEFAULT_RETURN (false);
|
||||||
|
|
||||||
|
/* Does this target support native dumpcore API? */
|
||||||
|
virtual bool supports_dumpcore ()
|
||||||
|
TARGET_DEFAULT_RETURN (false);
|
||||||
|
|
||||||
|
/* Generate the core file with native target API. */
|
||||||
|
virtual void dumpcore (const char *filename)
|
||||||
|
TARGET_DEFAULT_IGNORE ();
|
||||||
|
|
||||||
/* Does this target support evaluation of breakpoint commands on its
|
/* Does this target support evaluation of breakpoint commands on its
|
||||||
end? */
|
end? */
|
||||||
virtual bool can_run_breakpoint_commands ()
|
virtual bool can_run_breakpoint_commands ()
|
||||||
@ -1499,6 +1507,16 @@ int target_supports_disable_randomization (void);
|
|||||||
#define target_supports_evaluation_of_breakpoint_conditions() \
|
#define target_supports_evaluation_of_breakpoint_conditions() \
|
||||||
(current_top_target ()->supports_evaluation_of_breakpoint_conditions) ()
|
(current_top_target ()->supports_evaluation_of_breakpoint_conditions) ()
|
||||||
|
|
||||||
|
/* Does this target support dumpcore API? */
|
||||||
|
|
||||||
|
#define target_supports_dumpcore() \
|
||||||
|
(current_top_target ()->supports_dumpcore) ()
|
||||||
|
|
||||||
|
/* Generate the core file with target API. */
|
||||||
|
|
||||||
|
#define target_dumpcore(x) \
|
||||||
|
(current_top_target ()->dumpcore (x))
|
||||||
|
|
||||||
/* Returns true if this target can handle breakpoint commands
|
/* Returns true if this target can handle breakpoint commands
|
||||||
on its end. */
|
on its end. */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user