This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gdb and binutils branch master updated. 0fec99e8be72b091618862eafc14e2741f0ff0d5


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gdb and binutils".

The branch, master has been updated
       via  0fec99e8be72b091618862eafc14e2741f0ff0d5 (commit)
      from  2ddf4301102f7a78a03bccf86051a63111b1fcc1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0fec99e8be72b091618862eafc14e2741f0ff0d5

commit 0fec99e8be72b091618862eafc14e2741f0ff0d5
Author: Pedro Alves <palves@redhat.com>
Date:   Wed Oct 1 23:31:55 2014 +0100

    Really fail inserting software breakpoints on read-only regions
    
    Currently, with "set breakpoint auto-hw off", we'll still try to
    insert a software breakpoint at addresses covered by supposedly
    read-only or inacessible regions:
    
     (top-gdb) mem 0x443000 0x450000 ro
     (top-gdb) set mem inaccessible-by-default off
     (top-gdb) disassemble
     Dump of assembler code for function main:
        0x0000000000443956 <+34>:    movq   $0x0,0x10(%rax)
     => 0x000000000044395e <+42>:    movq   $0x0,0x18(%rax)
        0x0000000000443966 <+50>:    mov    -0x24(%rbp),%eax
        0x0000000000443969 <+53>:    mov    %eax,-0x20(%rbp)
     End of assembler dump.
     (top-gdb) b *0x0000000000443969
     Breakpoint 5 at 0x443969: file ../../src/gdb/gdb.c, line 29.
     (top-gdb) c
     Continuing.
     warning: cannot set software breakpoint at readonly address 0x443969
    
     Breakpoint 5, 0x0000000000443969 in main (argc=1, argv=0x7fffffffd918) at ../../src/gdb/gdb.c:29
     29        args.argc = argc;
     (top-gdb)
    
    We warn, saying that the insertion can't be done, but then proceed
    attempting the insertion anyway, and in case of manually added
    regions, the insert actually succeeds.
    
    This is a regression; GDB used to fail inserting the breakpoint.  More
    below.
    
    I stumbled on this as I wrote a test that manually sets up a read-only
    memory region with the "mem" command, in order to test GDB's behavior
    with breakpoints set on read-only regions, even when the real memory
    the breakpoints are set at isn't really read-only.  I wanted that in
    order to add a test that exercises software single-stepping through
    read-only regions.
    
    Note that the memory regions that target_memory_map returns aren't
    like e.g., what would expect to see in /proc/PID/maps on Linux.
    Instead, they're the physical memory map from the _debuggers_
    perspective.  E.g., a read-only region would be real ROM or flash
    memory, while a read-only+execute mapping in /proc/PID/maps is still
    read-write to the debugger (otherwise the debugger wouldn't be able to
    set software breakpoints in the code segment).
    
    If one tries to manually write to memory that falls within a memory
    region that is known to be read-only, with e.g., "p foo = 1", then we
    hit a check in memory_xfer_partial_1 before the write mananges to make
    it to the target side.
    
    But writing a software/memory breakpoint nowadays goes through
    target_write_raw_memory, and unlike when writing memory with
    TARGET_OBJECT_MEMORY, nothing on the TARGET_OBJECT_RAW_MEMORY path
    checks whether we're trying to write to a read-only region.
    
    At the time "breakpoint auto-hw" was added, we didn't have the
    TARGET_OBJECT_MEMORY vs TARGET_OBJECT_RAW_MEMORY target object
    distinction yet, and the code path in memory_xfer_partial that blocks
    writes to read-only memory was hit for memory breakpoints too.  With
    GDB 6.8 we had:
    
     warning: cannot set software breakpoint at readonly address 0000000000443943
     Warning:
     Cannot insert breakpoint 1.
     Error accessing memory address 0x443943: Input/output error.
    
    So I started out by fixing this by adding the memory region validation
    to TARGET_OBJECT_RAW_MEMORY too.
    
    But later, when testing against GDBserver, I realized that that would
    only block software/memory breakpoints GDB itself inserts with
    gdb/mem-break.c.  If a target has a to_insert_breakpoint method, the
    insertion request will still pass through to the target.  So I ended
    up converting the "cannot set breakpoint" warning in breakpoint.c to a
    real error return, thus blocking the insertion sooner.
    
    With that, we'll end up no longer needing the TARGET_OBJECT_RAW_MEMORY
    changes once software single-step breakpoints are converted to real
    breakpoints.  We need them today as software single-step breakpoints
    bypass insert_bp_location.  But, it'll be best to leave that in as
    safeguard anyway, for other direct uses of TARGET_OBJECT_RAW_MEMORY.
    
    Tested on x86_64 Fedora 20, native and gdbserver.
    
    gdb/
    2014-10-01  Pedro Alves  <palves@redhat.com>
    
    	* breakpoint.c (insert_bp_location): Error out if inserting a
    	software breakpoint at a read-only address.
    	* target.c (memory_xfer_check_region): New function, factored out
    	from ...
    	(memory_xfer_partial_1): ... this.  Make the 'reg_len' local a
    	ULONGEST.
    	(target_xfer_partial) <TARGET_OBJECT_RAW_MEMORY>: Check the access
    	against the memory region attributes.
    
    gdb/testsuite/
    2014-10-01  Pedro Alves  <palves@redhat.com>
    
    	* gdb.base/breakpoint-in-ro-region.c: New file.
    	* gdb.base/breakpoint-in-ro-region.exp: New file.

-----------------------------------------------------------------------

Summary of changes:
 gdb/ChangeLog                                      |   11 ++
 gdb/breakpoint.c                                   |   14 ++-
 gdb/target.c                                       |   95 +++++++++----
 gdb/testsuite/ChangeLog                            |    5 +
 gdb/testsuite/gdb.base/breakpoint-in-ro-region.c   |   28 ++++
 gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp |  142 ++++++++++++++++++++
 6 files changed, 263 insertions(+), 32 deletions(-)
 create mode 100644 gdb/testsuite/gdb.base/breakpoint-in-ro-region.c
 create mode 100644 gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp


hooks/post-receive
-- 
gdb and binutils


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]