diff options
author | Joel Brobecker <brobecker@gnat.com> | 2010-04-20 22:38:54 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2010-04-20 22:38:54 +0000 |
commit | 2971b56ba623542a0232473f110922758588fe2c (patch) | |
tree | eb2b11cd92c97f976a6f09eb7fe31c7a2eb17244 | |
parent | be9425454f2d15a1c2512faa81de8777731aa4af (diff) | |
download | fsf-binutils-gdb-2971b56ba623542a0232473f110922758588fe2c.zip fsf-binutils-gdb-2971b56ba623542a0232473f110922758588fe2c.tar.gz fsf-binutils-gdb-2971b56ba623542a0232473f110922758588fe2c.tar.bz2 |
[AIX] Memory error while checking if pointer is descriptor.
A long time ago (Oct 2009), I noticed a problem on AIX, where something
failed with an error while the debugger was checking whether an address
was a descriptor or not. Unfortunately, like an idiot, I forgot to write
notes about the scenario where the problem occured - I am usually pretty
meticulous about that because my memory of these things is really bad.
I hope you'll forgive me for not providing a solid testcase - if it's
any consolation, I've searched for a long time before giving up :-(.
Based on the testsuite reports that I have, I think that this happened
while inserting a breakpoint, as follow:
(gdb) break x
Cannot access memory at address 0x200093b4
What happened is that rs6000_convert_from_func_ptr_addr tried to read
the memory at the given address, and fail because of an exception.
It seems pretty clear that, if the address was in fact a descriptor,
GDB would have been able to read the target memory region.
So this patch protects the memory-read against exceptions, and treats
such exceptions as an indication that our address is not a descriptor.
gdb/ChangeLog:
* rs6000-aix-tdep.c: #include exceptions.h.
(rs6000_convert_from_func_ptr_addr): If an exception is thrown
while reading the memory at ADDR, then ADDR cannot be a function
descriptor.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/rs6000-aix-tdep.c | 20 |
2 files changed, 24 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fe8bcb7..e56a6a1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2010-04-20 Joel Brobecker <brobecker@adacore.com> + * rs6000-aix-tdep.c: #include exceptions.h. + (rs6000_convert_from_func_ptr_addr): If an exception is thrown + while reading the memory at ADDR, then ADDR cannot be a function + descriptor. + +2010-04-20 Joel Brobecker <brobecker@adacore.com> + * ada-typeprint.c (ada_print_typedef): New function. * ada-lang.h (ada_print_typedef): Add declaration. * ada-lang.c (ada_language_defn): set la_print_typdef field diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 530c12e..927cfe2 100644 --- a/gdb/rs6000-aix-tdep.c +++ b/gdb/rs6000-aix-tdep.c @@ -34,6 +34,7 @@ #include "breakpoint.h" #include "rs6000-tdep.h" #include "ppc-tdep.h" +#include "exceptions.h" /* Hook for determining the TOC address when calling functions in the inferior under AIX. The initialization code in rs6000-nat.c sets @@ -582,9 +583,22 @@ rs6000_convert_from_func_ptr_addr (struct gdbarch *gdbarch, the target address itself points to a section that is executable. */ if (s && (s->the_bfd_section->flags & SEC_CODE) == 0) { - CORE_ADDR pc = - read_memory_unsigned_integer (addr, tdep->wordsize, byte_order); - struct obj_section *pc_section = find_pc_section (pc); + CORE_ADDR pc; + struct obj_section *pc_section; + struct gdb_exception e; + + TRY_CATCH (e, RETURN_MASK_ERROR) + { + pc = read_memory_unsigned_integer (addr, tdep->wordsize, byte_order); + } + if (e.reason < 0) + { + /* An error occured during reading. Probably a memory error + due to the section not being loaded yet. This address + cannot be a function descriptor. */ + return addr; + } + pc_section = find_pc_section (pc); if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE)) return pc; |