commit 4c8dce9a7319c941542370425070428eb3c807e2 Author: Kamil Rytarowski Date: Tue Jul 28 17:42:03 2020 +0200 gdb: Implement native dumpcore function for NetBSD Define supports_dumpcore and dumpcore for NetBSD, that wraps the ptrace(2) call with the PT_DUMPCORE operation. gdb/ChangeLog: * nbsd-nat.h (nbsd_nat_target::supports_native_dumpcore) (nbsd_nat_target::native_dumpcore): New declarations. * nbsd-nat.c (nbsd_nat_target::supports_native_dumpcore) (nbsd_nat_target::native_dumpcore): New functions. diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 118bb4f89a2..75b9a0bd13d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2020-07-28 Kamil Rytarowski + + * nbsd-nat.h (nbsd_nat_target::supports_native_dumpcore) + (nbsd_nat_target::native_dumpcore): New declarations. + * nbsd-nat.c (nbsd_nat_target::supports_native_dumpcore) + (nbsd_nat_target::native_dumpcore): New functions. + 2020-07-28 Kamil Rytarowski * target.h (supports_native_dumpcore, native_dumpcore): New diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c index a9405ebf862..c893c5498bb 100644 --- a/gdb/nbsd-nat.c +++ b/gdb/nbsd-nat.c @@ -845,3 +845,22 @@ nbsd_nat_target::supports_multi_process () { return true; } + +/* Implement the "supports_dumpcore" target_ops method. */ + +bool +nbsd_nat_target::supports_dumpcore () +{ + return true; +} + +/* Implement the "dumpcore" target_ops method. */ + +bool +nbsd_nat_target::dumpcore (const char *filename) +{ + pid_t pid = inferior_ptid.pid (); + + return ptrace (PT_DUMPCORE, pid, const_cast(filename), + strlen (filename)) != -1; +} diff --git a/gdb/nbsd-nat.h b/gdb/nbsd-nat.h index 0a7048ecf35..550ea6a5d8d 100644 --- a/gdb/nbsd-nat.h +++ b/gdb/nbsd-nat.h @@ -49,6 +49,8 @@ struct nbsd_nat_target : public inf_ptrace_target override; bool supports_multi_process () override; + bool supports_dumpcore () override; + bool dumpcore (const char* filename) override; }; #endif /* nbsd-nat.h */ commit 19dc9713a258aea306cc34da72e80e4e53e49e8f Author: Kamil Rytarowski Date: Tue Jul 28 17:29:35 2020 +0200 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_native_dumpcore, native_dumpcore): New function declarations. * target.c (supports_native_dumpcore, native_dumpcore): New functions. * target-delegates.c: Rebuild. * gcore.c (gcore_command): Use target_supports_native_dumpcore () and target_native_dumpcore (). diff --git a/gdb/ChangeLog b/gdb/ChangeLog index defca83c263..118bb4f89a2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2020-07-28 Kamil Rytarowski + + * target.h (supports_native_dumpcore, native_dumpcore): New + function declarations. + * target.c (supports_native_dumpcore, native_dumpcore): New + functions. + * target-delegates.c: Rebuild. + * gcore.c (gcore_command): Use target_supports_native_dumpcore () + and target_native_dumpcore (). + 2020-07-28 H.J. Lu PR binutils/26301 diff --git a/gdb/gcore.c b/gdb/gcore.c index 7b653fb74e3..d0e36b1a708 100644 --- a/gdb/gcore.c +++ b/gdb/gcore.c @@ -145,17 +145,22 @@ gcore_command (const char *args, int from_tty) "Opening corefile '%s' for output.\n", corefilename.get ()); - /* Open the output file. */ - gdb_bfd_ref_ptr obfd (create_gcore_bfd (corefilename.get ())); + if (target_supports_dumpcore ()) + 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. */ - gdb::unlinker unlink_file (corefilename.get ()); + /* Arrange to unlink the file on failure. */ + gdb::unlinker unlink_file (corefilename.get ()); - /* Call worker function. */ - write_gcore_file (obfd.get ()); + /* Call worker function. */ + write_gcore_file (obfd.get ()); - /* Succeeded. */ - unlink_file.keep (); + /* Succeeded. */ + unlink_file.keep (); + } fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename.get ()); } diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index c28af097183..c7e0811caf2 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -108,6 +108,8 @@ struct dummy_target : public target_ops bool supports_disable_randomization () override; bool supports_string_tracing () override; bool supports_evaluation_of_breakpoint_conditions () override; + bool supports_dumpcore () override; + bool dumpcore (const char *arg0) override; bool can_run_breakpoint_commands () override; struct gdbarch *thread_architecture (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_string_tracing () override; bool supports_evaluation_of_breakpoint_conditions () override; + bool supports_dumpcore () override; + bool dumpcore (const char *arg0) override; bool can_run_breakpoint_commands () override; struct gdbarch *thread_architecture (ptid_t arg0) override; struct address_space *thread_address_space (ptid_t arg0) override; @@ -2825,6 +2829,57 @@ debug_target::supports_evaluation_of_breakpoint_conditions () 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; +} + +bool +target_ops::dumpcore (const char *arg0) +{ + return this->beneath ()->dumpcore (arg0); +} + +bool +dummy_target::dumpcore (const char *arg0) +{ + return false; +} + +bool +debug_target::dumpcore (const char *arg0) +{ + bool result; + fprintf_unfiltered (gdb_stdlog, "-> %s->dumpcore (...)\n", this->beneath ()->shortname ()); + result = this->beneath ()->dumpcore (arg0); + fprintf_unfiltered (gdb_stdlog, "<- %s->dumpcore (", this->beneath ()->shortname ()); + target_debug_print_const_char_p (arg0); + fputs_unfiltered (") = ", gdb_stdlog); + target_debug_print_bool (result); + fputs_unfiltered ("\n", gdb_stdlog); + return result; +} + bool target_ops::can_run_breakpoint_commands () { diff --git a/gdb/target.h b/gdb/target.h index 4e8d4cccd5c..85a03ed5be8 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -881,6 +881,14 @@ struct target_ops virtual bool supports_evaluation_of_breakpoint_conditions () 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 bool dumpcore (const char *filename) + TARGET_DEFAULT_RETURN (false); + /* Does this target support evaluation of breakpoint commands on its end? */ virtual bool can_run_breakpoint_commands () @@ -1499,6 +1507,16 @@ int target_supports_disable_randomization (void); #define 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 on its end. */