aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-04-13 14:34:00 +0100
committerPedro Alves <palves@redhat.com>2016-04-13 14:34:00 +0100
commit3a00c80277a54abe0b286a6e8babc8fe50120205 (patch)
treec8747b5a7de51c8d1f402f8bd8840c302ae03493 /gdb/remote.c
parente26b7e41652e288dfdb4c48121bba470c4774150 (diff)
downloadgdb-3a00c80277a54abe0b286a6e8babc8fe50120205.zip
gdb-3a00c80277a54abe0b286a6e8babc8fe50120205.tar.gz
gdb-3a00c80277a54abe0b286a6e8babc8fe50120205.tar.bz2
Fix PR remote/19840: gdb crashes on reverse-stepi
Reverse debugging against a remote target that does reverse debugging itself (with the bs/bc packets) always trips on: (gdb) target remote localhost:... (gdb) reverse-stepi ../../gdb/target.c:602: internal-error: default_execution_direction: to_execution_direction must be implemented for reverse async I missed adding a to_execution_direction method to remote.c in commit 3223143295b5 (Adds target_execution_direction to make record targets support async mode), GDB 7.4 time. Later, GDB 7.8 switched to target-async on by default, making the regression user-visible by default too. Fix is simply to add the missing to_execution_direction implementation to target remote. Tested by Andi Kleen against Simics. gdb/ChangeLog: 2016-04-13 Pedro Alves <palves@redhat.com> PR remote/19840 * remote.c (struct remote_state) <last_resume_exec_dir>: New field. (new_remote_state): Default last_resume_exec_dir to EXEC_FORWARD. (remote_open_1): Reset last_resume_exec_dir to EXEC_FORWARD. (remote_resume): Store the last execution direction. (remote_execution_direction): New function. (init_remote_ops): Install it as to_execution_direction target_ops method.
Diffstat (limited to 'gdb/remote.c')
-rw-r--r--gdb/remote.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gdb/remote.c b/gdb/remote.c
index b7ff7bf..4c18b4f 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -393,6 +393,9 @@ struct remote_state
int last_sent_step;
+ /* The execution direction of the last resume we got. */
+ enum exec_direction_kind last_resume_exec_dir;
+
char *finished_object;
char *finished_annex;
ULONGEST finished_offset;
@@ -481,6 +484,7 @@ new_remote_state (void)
result->buf = (char *) xmalloc (result->buf_size);
result->remote_traceframe_number = -1;
result->last_sent_signal = GDB_SIGNAL_0;
+ result->last_resume_exec_dir = EXEC_FORWARD;
result->fs_pid = -1;
return result;
@@ -4999,6 +5003,8 @@ remote_open_1 (const char *name, int from_tty,
rs->continue_thread = not_sent_ptid;
rs->remote_traceframe_number = -1;
+ rs->last_resume_exec_dir = EXEC_FORWARD;
+
/* Probe for ability to use "ThreadInfo" query, as required. */
rs->use_threadinfo_query = 1;
rs->use_threadextra_query = 1;
@@ -5634,6 +5640,8 @@ remote_resume (struct target_ops *ops,
rs->last_sent_signal = siggnal;
rs->last_sent_step = step;
+ rs->last_resume_exec_dir = execution_direction;
+
/* The vCont packet doesn't need to specify threads via Hc. */
/* No reverse support (yet) for vCont. */
if (execution_direction != EXEC_REVERSE)
@@ -12985,6 +12993,17 @@ remote_can_do_single_step (struct target_ops *ops)
return 0;
}
+/* Implementation of the to_execution_direction method for the remote
+ target. */
+
+static enum exec_direction_kind
+remote_execution_direction (struct target_ops *self)
+{
+ struct remote_state *rs = get_remote_state ();
+
+ return rs->last_resume_exec_dir;
+}
+
static void
init_remote_ops (void)
{
@@ -13130,6 +13149,7 @@ Specify the serial device it is connected to\n\
remote_ops.to_remove_vfork_catchpoint = remote_remove_vfork_catchpoint;
remote_ops.to_insert_exec_catchpoint = remote_insert_exec_catchpoint;
remote_ops.to_remove_exec_catchpoint = remote_remove_exec_catchpoint;
+ remote_ops.to_execution_direction = remote_execution_direction;
}
/* Set up the extended remote vector by making a copy of the standard