From d46addbb52a1f6d970bcac583b0b00ff4326e116 Mon Sep 17 00:00:00 2001 From: Don Breazeal Date: Fri, 11 Sep 2015 11:06:02 -0700 Subject: [PATCH] Extended-remote catch exec This patch implements exec catchpoints for extended-remote Linux targets. The implementation follows the same approach used for fork catchpoints, implementing extended-remote target routines for inserting and removing the catchpoints by just checking if exec events are supported. Existing host-side code and previous support for extended-remote exec events takes care of the rest. gdb/ChangeLog: * remote.c (remote_exec_event_p): New function. (remote_insert_exec_catchpoint): New function. (remote_remove_exec_catchpoint): New function. (init_extended_remote_ops): Initialize extended_remote_ops members to_insert_exec_catchpoint and to_remove_exec_catchpoint. --- gdb/ChangeLog | 9 +++++++++ gdb/remote.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aa6e5b1aa16..01105282bac 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2015-09-11 Don Breazeal + + * remote.c (remote_exec_event_p): New function. + (remote_insert_exec_catchpoint): New function. + (remote_remove_exec_catchpoint): New function. + (init_extended_remote_ops): Initialize extended_remote_ops + members to_insert_exec_catchpoint and + to_remove_exec_catchpoint. + 2015-09-11 Don Breazeal Luis Machado diff --git a/gdb/remote.c b/gdb/remote.c index 59004f95e76..db83e6b9184 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1596,6 +1596,14 @@ remote_vfork_event_p (struct remote_state *rs) return packet_support (PACKET_vfork_event_feature) == PACKET_ENABLE; } +/* Returns true if exec events are supported. */ + +static int +remote_exec_event_p (struct remote_state *rs) +{ + return packet_support (PACKET_exec_event_feature) == PACKET_ENABLE; +} + /* Insert fork catchpoint target routine. If fork events are enabled then return success, nothing more to do. */ @@ -1636,6 +1644,26 @@ remote_remove_vfork_catchpoint (struct target_ops *ops, int pid) return 0; } +/* Insert exec catchpoint target routine. If exec events are + enabled, just return success. */ + +static int +remote_insert_exec_catchpoint (struct target_ops *ops, int pid) +{ + struct remote_state *rs = get_remote_state (); + + return !remote_exec_event_p (rs); +} + +/* Remove exec catchpoint target routine. Nothing to do, just + return success. */ + +static int +remote_remove_exec_catchpoint (struct target_ops *ops, int pid) +{ + return 0; +} + /* Tokens for use by the asynchronous signal handlers for SIGINT. */ static struct async_signal_handler *async_sigint_remote_twice_token; static struct async_signal_handler *async_sigint_remote_token; @@ -12793,6 +12821,10 @@ Specify the serial device it is connected to (e.g. /dev/ttya)."; = remote_insert_vfork_catchpoint; extended_remote_ops.to_remove_vfork_catchpoint = remote_remove_vfork_catchpoint; + extended_remote_ops.to_insert_exec_catchpoint + = remote_insert_exec_catchpoint; + extended_remote_ops.to_remove_exec_catchpoint + = remote_remove_exec_catchpoint; } static int -- 2.30.2