[PATCH 1/3] Fix inferior memory reading in GDBServer for arm/aarch32.
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
> thread 2
> thread 3
> In a similar way as non-stop-fair-events.exp (threads are looping).
> 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
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.
>From 716477ebf1c00c04235953c345a295bb3ea91dd9 Mon Sep 17 00:00:00 2001
From: Yao Qi <email@example.com>
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 <firstname.lastname@example.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
@@ -263,7 +263,7 @@ get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr,
res = 0;
- (*the_target->read_memory) (memaddr, (unsigned char *) &res, len);
+ read_inferior_memory (memaddr, (unsigned char *) &res, len);
More information about the Gdb-patches