]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Make the backtrace-data test helper more robust
authorUlf Hermann <ulf.hermann@qt.io>
Fri, 10 Feb 2017 14:19:01 +0000 (15:19 +0100)
committerMark Wielaard <mark@klomp.org>
Tue, 14 Feb 2017 09:24:36 +0000 (10:24 +0100)
When unwinding by frame pointer the unwinder might ask for invalid
addresses. We don't have to fail the test in this case. In fact
any broken dwarf information can lead to requests for invalid
addresses, also without frame pointer unwinding.

Signed-off-by: Ulf Hermann <ulf.hermann@qt.io>
tests/ChangeLog
tests/backtrace-data.c

index 7031cf575fd3f7c65cb57cbfa3b3dff611e56a40..7040ac843446c6c21e0017cf46ec7f82d5ec8704 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-09  Ulf Hermann  <ulf.hermann@qt.io>
+
+       * backtrace-data.c: Don't assert that symbols are found.
+       The unwinder is allowed to ask for invalid addresses. We deny
+       such requests, rather than make the test fail.
+
 2016-11-17  Mark Wielaard  <mjw@redhat.com>
 
        * run-readelf-s.sh: Add --symbols=.dynsym and --symbols=.symtab tests.
index b7158dae8fb8062ad892dfadd525cbc1aab5fc59..a387d8ff9ad73a1a355482a82dde74b1f077ebaf 100644 (file)
@@ -76,10 +76,15 @@ memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result,
 
   errno = 0;
   long l = ptrace (PTRACE_PEEKDATA, child, (void *) (uintptr_t) addr, NULL);
-  assert (errno == 0);
+
+  // The unwinder can ask for an invalid address.
+  // Don't assert on that but just politely refuse.
+  if (errno != 0) {
+      errno = 0;
+      return false;
+  }
   *result = l;
 
-  /* We could also return false for failed ptrace.  */
   return true;
 }
 
@@ -103,7 +108,8 @@ maps_lookup (pid_t pid, Dwarf_Addr addr, GElf_Addr *basep)
       unsigned long start, end, offset;
       i = fscanf (f, "%lx-%lx %*s %lx %*x:%*x %*x", &start, &end, &offset);
       assert (errno == 0);
-      assert (i == 3);
+      if (i != 3)
+          break;
       char *filename = strdup ("");
       assert (filename);
       size_t filename_len = 0;
@@ -131,6 +137,8 @@ maps_lookup (pid_t pid, Dwarf_Addr addr, GElf_Addr *basep)
        }
       free (filename);
     }
+  *basep = 0;
+  return NULL;
 }
 
 /* Add module containing ADDR to the DWFL address space.
@@ -145,6 +153,8 @@ report_module (Dwfl *dwfl, pid_t child, Dwarf_Addr addr)
 {
   GElf_Addr base;
   char *long_name = maps_lookup (child, addr, &base);
+  if (!long_name)
+      return NULL; // not found
   Dwfl_Module *mod = dwfl_report_elf (dwfl, long_name, long_name, -1,
                                      base, false /* add_p_vaddr */);
   assert (mod);