Catch exception on solib_svr4_r_ldsomap
authorSergio Durigan Junior <sergiodj@redhat.com>
Tue, 31 Mar 2015 23:17:23 +0000 (19:17 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Tue, 31 Mar 2015 23:17:23 +0000 (19:17 -0400)
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.

gdb/ChangeLog
gdb/solib-svr4.c

index 160de2dc493d22d4b7d5707a516dc719e7ae25fb..51135cf0b6a7eac1129ded7784abc29f83f9346e 100644 (file)
@@ -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 0cecc2aec7ec8bdd486f1e4dfe0b93ad57360724..dd93847850a2841d943c6d81dfbaf0c95c770c0f 100644 (file)
@@ -910,13 +910,22 @@ solib_svr4_r_ldsomap (struct svr4_info *info)
   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;
+
+  TRY
+    {
+      /* 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);
+    }
+  CATCH (ex, RETURN_MASK_ERROR)
+    {
+      exception_print (gdb_stderr, ex);
+    }
+  END_CATCH
 
-  /* 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;