diff options
author | Yao Qi <yao.qi@linaro.org> | 2015-04-16 13:48:10 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2015-04-16 13:48:10 +0100 |
commit | 8550d3b32f4ac17bdb9e4768bb905da181b77ded (patch) | |
tree | 3303973717852fa89065f5c04974bbac18a3dcce /gdb | |
parent | af9fd6f863c9f184e2c84d8a4707b3ec7b8ca67b (diff) | |
download | gdb-8550d3b32f4ac17bdb9e4768bb905da181b77ded.zip gdb-8550d3b32f4ac17bdb9e4768bb905da181b77ded.tar.gz gdb-8550d3b32f4ac17bdb9e4768bb905da181b77ded.tar.bz2 |
Honour software single step in fallback of displaced stepping
Hi,
When I run gdb.threads/non-stop-fair-events.exp on arm-linux target,
I see the following message in the debugging log,
displaced: breakpoint is gone: Thread 22518, step(1)^M
Sending packet: $vCont;s:p57f3.57f6#9d...
^^^^^^^^^
GDB sends vCont;s by mistake, and GDBserver fails on assert. GDB
doesn't consider software single step in infrun.c:displaced_step_fixup,
/* Go back to what we were trying to do. */
step = currently_stepping (tp);
if (debug_displaced)
fprintf_unfiltered (gdb_stdlog,
"displaced: breakpoint is gone: %s, step(%d)\n",
target_pid_to_str (tp->ptid), step);
target_resume (ptid, step, GDB_SIGNAL_0);
The patch is to let GDB consider software single step here. It fixes
fails in gdb.threads/non-stop-fair-events.exp on arm.
gdb:
2015-04-16 Yao Qi <yao.qi@linaro.org>
* infrun.c (maybe_software_singlestep): Declare.
(displaced_step_fixup): Call maybe_software_singlestep.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/infrun.c | 8 |
2 files changed, 11 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index efee416..7f9c96a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-04-16 Yao Qi <yao.qi@linaro.org> + + * infrun.c (maybe_software_singlestep): Declare. + (displaced_step_fixup): Call maybe_software_singlestep. + 2015-04-15 Doug Evans <dje@google.com> * psymtab.c (psym_expand_symtabs_matching): Add QUIT call. diff --git a/gdb/infrun.c b/gdb/infrun.c index 4164a00..7870f70 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -98,6 +98,8 @@ static void insert_step_resume_breakpoint_at_caller (struct frame_info *); static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR); +static int maybe_software_singlestep (struct gdbarch *gdbarch, CORE_ADDR pc); + /* When set, stop the 'step' command if we enter a function which has no line number information. The normal behavior is that we step over such function. */ @@ -1863,6 +1865,7 @@ displaced_step_fixup (ptid_t event_ptid, enum gdb_signal signal) regcache = get_thread_regcache (ptid); actual_pc = regcache_read_pc (regcache); aspace = get_regcache_aspace (regcache); + gdbarch = get_regcache_arch (regcache); if (breakpoint_here_p (aspace, actual_pc)) { @@ -1873,8 +1876,6 @@ displaced_step_fixup (ptid_t event_ptid, enum gdb_signal signal) displaced_step_prepare (ptid); - gdbarch = get_regcache_arch (regcache); - if (debug_displaced) { CORE_ADDR actual_pc = regcache_read_pc (regcache); @@ -1907,6 +1908,9 @@ displaced_step_fixup (ptid_t event_ptid, enum gdb_signal signal) /* Go back to what we were trying to do. */ step = currently_stepping (tp); + if (step) + step = maybe_software_singlestep (gdbarch, actual_pc); + if (debug_displaced) fprintf_unfiltered (gdb_stdlog, "displaced: breakpoint is gone: %s, step(%d)\n", |