diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/gdbserver/ChangeLog | 21 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 20 | ||||
-rw-r--r-- | gdb/gdbserver/lynx-low.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 22 | ||||
-rw-r--r-- | gdb/gdbserver/target.h | 14 | ||||
-rw-r--r-- | gdb/gdbserver/win32-low.c | 2 | ||||
-rw-r--r-- | gdb/nat/linux-ptrace.c | 2 | ||||
-rw-r--r-- | gdb/nat/linux-ptrace.h | 1 | ||||
-rw-r--r-- | gdb/remote.c | 26 |
10 files changed, 120 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7f4b457..be75baf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2015-05-12 Don Breazeal <donb@codesourcery.com> + + * nat/linux-ptrace.c (linux_check_ptrace_features): Change + from static to extern. + * nat/linux-ptrace.h (linux_check_ptrace_features): Declare. + * remote.c (anonymous enum): <PACKET_fork_event_feature, + * PACKET_vfork_event_feature>: New enumeration constants. + (remote_protocol_features): Add table entries for new packets. + (remote_query_supported): Add new feature queries to qSupported + packet. + 2015-05-12 Gary Benson <gbenson@redhat.com> * remote.c (remote_add_inferior): Call exec_file_locate_attach diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 94146b8..a37051d 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,24 @@ +2015-05-12 Don Breazeal <donb@codesourcery.com> + + * linux-low.c (linux_supports_fork_events): New function. + (linux_supports_vfork_events): New function. + (linux_target_ops): Initialize new structure members. + (initialize_low): Call linux_check_ptrace_features. + * lynx-low.c (lynx_target_ops): Initialize new structure + members. + * server.c (report_fork_events, report_vfork_events): + New global flags. + (handle_query): Add new features to qSupported packet and + response. + (captured_main): Initialize new global variables. + * target.h (struct target_ops) <supports_fork_events>: + New member. + <supports_vfork_events>: New member. + (target_supports_fork_events): New macro. + (target_supports_vfork_events): New macro. + * win32-low.c (win32_target_ops): Initialize new structure + members. + 2015-05-12 Gary Benson <gbenson@redhat.com> * server.c (handle_qxfer_exec_file): Use current process diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index bc76ffc..1724b54 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5438,6 +5438,22 @@ linux_supports_multi_process (void) return 1; } +/* Check if fork events are supported. */ + +static int +linux_supports_fork_events (void) +{ + return linux_supports_tracefork (); +} + +/* Check if vfork events are supported. */ + +static int +linux_supports_vfork_events (void) +{ + return linux_supports_tracefork (); +} + static int linux_supports_disable_randomization (void) { @@ -6411,6 +6427,8 @@ static struct target_ops linux_target_ops = { linux_async, linux_start_non_stop, linux_supports_multi_process, + linux_supports_fork_events, + linux_supports_vfork_events, #ifdef USE_THREAD_DB thread_db_handle_monitor_command, #else @@ -6488,4 +6506,6 @@ initialize_low (void) sigaction (SIGCHLD, &sigchld_action, NULL); initialize_low_arch (); + + linux_check_ptrace_features (); } diff --git a/gdb/gdbserver/lynx-low.c b/gdb/gdbserver/lynx-low.c index 364c79f..f087416 100644 --- a/gdb/gdbserver/lynx-low.c +++ b/gdb/gdbserver/lynx-low.c @@ -762,6 +762,8 @@ static struct target_ops lynx_target_ops = { NULL, /* async */ NULL, /* start_non_stop */ NULL, /* supports_multi_process */ + NULL, /* supports_fork_events */ + NULL, /* supports_vfork_events */ NULL, /* handle_monitor_command */ }; diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 174ab39..1544e99 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -57,6 +57,8 @@ static int exit_requested; int run_once; int multi_process; +int report_fork_events; +int report_vfork_events; int non_stop; int swbreak_feature; int hwbreak_feature; @@ -2046,6 +2048,18 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (target_supports_stopped_by_hw_breakpoint ()) hwbreak_feature = 1; } + else if (strcmp (p, "fork-events+") == 0) + { + /* GDB supports and wants fork events if possible. */ + if (target_supports_fork_events ()) + report_fork_events = 1; + } + else if (strcmp (p, "vfork-events+") == 0) + { + /* GDB supports and wants vfork events if possible. */ + if (target_supports_vfork_events ()) + report_vfork_events = 1; + } else target_process_qsupported (p); @@ -2096,6 +2110,12 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (target_supports_multi_process ()) strcat (own_buf, ";multiprocess+"); + if (target_supports_fork_events ()) + strcat (own_buf, ";fork-events+"); + + if (target_supports_vfork_events ()) + strcat (own_buf, ";vfork-events+"); + if (target_supports_non_stop ()) strcat (own_buf, ";QNonStop+"); @@ -3472,6 +3492,8 @@ captured_main (int argc, char *argv[]) noack_mode = 0; multi_process = 0; + report_fork_events = 0; + report_vfork_events = 0; /* Be sure we're out of tfind mode. */ current_traceframe = -1; cont_thread = null_ptid; diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index b3d08cd..697b223 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -281,6 +281,12 @@ struct target_ops /* Returns true if the target supports multi-process debugging. */ int (*supports_multi_process) (void); + /* Returns true if fork events are supported. */ + int (*supports_fork_events) (void); + + /* Returns true if vfork events are supported. */ + int (*supports_vfork_events) (void); + /* If not NULL, target-specific routine to process monitor command. Returns 1 if handled, or 0 to perform default processing. */ int (*handle_monitor_command) (char *); @@ -420,6 +426,14 @@ void set_target_ops (struct target_ops *); int kill_inferior (int); +#define target_supports_fork_events() \ + (the_target->supports_fork_events ? \ + (*the_target->supports_fork_events) () : 0) + +#define target_supports_vfork_events() \ + (the_target->supports_vfork_events ? \ + (*the_target->supports_vfork_events) () : 0) + #define detach_inferior(pid) \ (*the_target->detach) (pid) diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 6cf56bd..a58f963 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -1831,6 +1831,8 @@ static struct target_ops win32_target_ops = { NULL, /* async */ NULL, /* start_non_stop */ NULL, /* supports_multi_process */ + NULL, /* supports_fork_events */ + NULL, /* supports_vfork_events */ NULL, /* handle_monitor_command */ NULL, /* core_of_thread */ NULL, /* read_loadmap */ diff --git a/gdb/nat/linux-ptrace.c b/gdb/nat/linux-ptrace.c index 2244d9d..aba3da8 100644 --- a/gdb/nat/linux-ptrace.c +++ b/gdb/nat/linux-ptrace.c @@ -337,7 +337,7 @@ static void linux_test_for_exitkill (int child_pid); /* Determine ptrace features available on this target. */ -static void +void linux_check_ptrace_features (void) { int child_pid, ret, status; diff --git a/gdb/nat/linux-ptrace.h b/gdb/nat/linux-ptrace.h index 8354a4d..03d98c9 100644 --- a/gdb/nat/linux-ptrace.h +++ b/gdb/nat/linux-ptrace.h @@ -149,6 +149,7 @@ extern void linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer); extern char *linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err); extern void linux_ptrace_init_warnings (void); +extern void linux_check_ptrace_features (void); extern void linux_enable_event_reporting (pid_t pid, int attached); extern void linux_disable_event_reporting (pid_t pid); extern int linux_supports_tracefork (void); diff --git a/gdb/remote.c b/gdb/remote.c index 02c8371..6dae920 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1342,6 +1342,12 @@ enum { /* Support for hwbreak+ feature. */ PACKET_hwbreak_feature, + /* Support for fork events. */ + PACKET_fork_event_feature, + + /* Support for vfork events. */ + PACKET_vfork_event_feature, + PACKET_MAX }; @@ -4051,6 +4057,10 @@ static const struct protocol_feature remote_protocol_features[] = { PACKET_Qbtrace_conf_bts_size }, { "swbreak", PACKET_DISABLE, remote_supported_packet, PACKET_swbreak_feature }, { "hwbreak", PACKET_DISABLE, remote_supported_packet, PACKET_hwbreak_feature }, + { "fork-events", PACKET_DISABLE, remote_supported_packet, + PACKET_fork_event_feature }, + { "vfork-events", PACKET_DISABLE, remote_supported_packet, + PACKET_vfork_event_feature }, }; static char *remote_support_xml; @@ -4129,6 +4139,16 @@ remote_query_supported (void) q = remote_query_supported_append (q, "qRelocInsn+"); + if (rs->extended) + { + if (packet_set_cmd_state (PACKET_fork_event_feature) + != AUTO_BOOLEAN_FALSE) + q = remote_query_supported_append (q, "fork-events+"); + if (packet_set_cmd_state (PACKET_vfork_event_feature) + != AUTO_BOOLEAN_FALSE) + q = remote_query_supported_append (q, "vfork-events+"); + } + q = reconcat (q, "qSupported:", q, (char *) NULL); putpkt (q); @@ -12434,6 +12454,12 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, add_packet_config_cmd (&remote_protocol_packets[PACKET_hwbreak_feature], "hwbreak-feature", "hwbreak-feature", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_fork_event_feature], + "fork-event-feature", "fork-event-feature", 0); + + add_packet_config_cmd (&remote_protocol_packets[PACKET_vfork_event_feature], + "vfork-event-feature", "vfork-event-feature", 0); + /* Assert that we've registered "set remote foo-packet" commands for all packet configs. */ { |