[PATCH 1/3] Fix inferior memory reading in GDBServer for arm/aarch32.

Yao Qi qiyaoltc@gmail.com
Fri Dec 9 12:06:00 GMT 2016

On 16-12-01 13:09:56, Antoine Tremblay wrote:
> After some more thought, it can happen even with current code too that
> single step breakpoints are installed without a step-over.
> Consider this situation:
> In non-stop:
> the user issues:
> thread 1
> step&
> thread 2
> step&
> thread 3
> step&
> In a similar way as non-stop-fair-events.exp (threads are looping).
> GDBServer:
>  linux_resume is called
>  GDBServer has pending events,
>  threads are not resumed and single-step breakpoint for thread 1 not installed.
>  linux_wait_1 is called with a pending event on thread 2 at pc A
>  GDBServer handles the event and calls proceed_all_lwps
>  This calls proceed_one_lwp and installs single-step breakpoints on all
>  the threads that need one.
>  Now since thread 1 needs to install a single-step breakpoint and is at pc B
>  (different than thread 2), a step-over is not initiated and get_next_pc
>  is called to figure out the next instruction from pc B.
>  However it may just be that thread 3 as a single step breakpoint at pc
>  B. And thus get_next_pc fails.
> This situation is tested with non-stop-fair-events.exp.
> Sorry for the confusion, you can consider only the two last replies as
> valid.

This helps understanding the problem, and helps me recalling one patch
in my tree, but I didn't submit it (I can't remember why).

Single-step breakpoints are installed in proceed_one_lwp for each thread.
GDBserver proceeds two threads for resume_step, as requested by GDB,
and the thread proceeded later may see the single-step breakpoints
installed for the thread proceeded just now.

Please add these explanations to the commit log.

Yao (齐尧)

>From 716477ebf1c00c04235953c345a295bb3ea91dd9 Mon Sep 17 00:00:00 2001
From: Yao Qi <yao.qi@linaro.org>
Date: Mon, 29 Feb 2016 12:50:58 +0000
Subject: [PATCH] Call check_mem_read in get_next_pcs_read_memory_unsigned_integer

get_next_pcs_read_memory_unsigned_integer only calls
*the_target->read_memory but doesn't call check_mem_read,


2016-03-02  Yao Qi  <yao.qi@linaro.org>

        * linux-arm-low.c (get_next_pcs_read_memory_unsigned_integer):
        Call read_inferior_memory instead of *the_target->read_memory.

diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index ed9b356..a62904a 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -263,7 +263,7 @@ get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr,
   ULONGEST res;
   res = 0;
-  (*the_target->read_memory) (memaddr, (unsigned char *) &res, len);
+  read_inferior_memory (memaddr, (unsigned char *) &res, len);
   return res;

More information about the Gdb-patches mailing list