You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.6 KiB
75 lines
2.6 KiB
6 years ago
|
commit 416f679e68468ea6dd7384213994ce74201f82e7
|
||
|
Author: Sergio Durigan Junior <sergiodj@redhat.com>
|
||
|
Date: Tue Mar 31 19:17:23 2015 -0400
|
||
|
|
||
|
Catch exception on solib_svr4_r_ldsomap
|
||
|
|
||
|
When loading a corefile that has some inaccessible memory region(s),
|
||
|
GDB complains about it:
|
||
|
|
||
|
(gdb) core /my/corefile
|
||
|
[New LWP 28468]
|
||
|
Cannot access memory at address 0x355fc21148
|
||
|
Cannot access memory at address 0x355fc21140
|
||
|
(gdb)
|
||
|
|
||
|
However, despite not seeing the message "Core was generated by...", it
|
||
|
is still possible to inspect the corefile using regular GDB commands.
|
||
|
The reason for that is because read_memory_unsigned_integer throws an
|
||
|
exception when it cannot read the memory region, but
|
||
|
solib_svr4_r_ldsomap was not catching it. The fix is to catch the
|
||
|
exception and act accordingly.
|
||
|
|
||
|
Tested on Fedora 20 x86_64, no regressions found.
|
||
|
|
||
|
gdb/ChangeLog:
|
||
|
2015-03-31 Sergio Durigan Junior <sergiodj@redhat.com>
|
||
|
|
||
|
* solib-svr4.c (solib_svr4_r_ldsomap): Catch possible exception by
|
||
|
read_memory_unsigned_integer.
|
||
|
|
||
|
### a/gdb/ChangeLog
|
||
|
### b/gdb/ChangeLog
|
||
|
## -1,3 +1,8 @@
|
||
|
+2015-03-31 Sergio Durigan Junior <sergiodj@redhat.com>
|
||
|
+
|
||
|
+ * solib-svr4.c (solib_svr4_r_ldsomap): Catch possible exception by
|
||
|
+ read_memory_unsigned_integer.
|
||
|
+
|
||
|
2015-03-31 H.J. Lu <hongjiu.lu@intel.com>
|
||
|
|
||
|
* Makefile.in (ZLIB): New.
|
||
|
Index: gdb-7.6.1/gdb/solib-svr4.c
|
||
|
===================================================================
|
||
|
--- gdb-7.6.1.orig/gdb/solib-svr4.c 2015-11-27 22:31:12.059831214 +0100
|
||
|
+++ gdb-7.6.1/gdb/solib-svr4.c 2015-11-27 22:35:17.641182004 +0100
|
||
|
@@ -912,13 +912,22 @@
|
||
|
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
|
||
|
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
|
||
|
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
||
|
- ULONGEST version;
|
||
|
+ ULONGEST version = 0;
|
||
|
+ volatile struct gdb_exception ex;
|
||
|
+
|
||
|
+ TRY_CATCH (ex, RETURN_MASK_ERROR)
|
||
|
+ {
|
||
|
+ /* Check version, and return zero if `struct r_debug' doesn't have
|
||
|
+ the r_ldsomap member. */
|
||
|
+ version
|
||
|
+ = read_memory_unsigned_integer (info->debug_base + lmo->r_version_offset,
|
||
|
+ lmo->r_version_size, byte_order);
|
||
|
+ }
|
||
|
+ if (ex.reason < 0)
|
||
|
+ {
|
||
|
+ exception_print (gdb_stderr, ex);
|
||
|
+ }
|
||
|
|
||
|
- /* Check version, and return zero if `struct r_debug' doesn't have
|
||
|
- the r_ldsomap member. */
|
||
|
- version
|
||
|
- = read_memory_unsigned_integer (info->debug_base + lmo->r_version_offset,
|
||
|
- lmo->r_version_size, byte_order);
|
||
|
if (version < 2 || lmo->r_ldsomap_offset == -1)
|
||
|
return 0;
|
||
|
|