This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils 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]

Re: [PATCH] readelf: Print DIE offset in attribute reading error messages.


On Tue, 2017-11-21 at 11:21 +0100, Mark Wielaard wrote:
> On Thu, 2017-11-16 at 15:31 +0100, Mark Wielaard wrote:
> > On Tue, 2017-10-03 at 16:59 +0200, Mark Wielaard wrote:
> > > When processing large files it is useful to know the DIE offset if
> > > printing of attributes fails (especially when redirecting the output).
> > > With this change the error message looks like:
> > > 
> > >   eu-readelf: DIE [2aeb8ef1] cannot get attribute value: invalid DWARF
> > 
> > Got another report about a large debug file where this improved error
> > message would have been really handy. So I pushed it to master now.
> 
> This has been really useful to debug some DWARF format issues, but it
> could be even more useful. Since we know the attribute name and form
> (or we would have generated an error earlier) add those to the error
> message too.

I made one other tweak to not abort, but keep trying to print the other
attributes of the DIE. It might just be this one attribute whose value
cannot be retrieved/resolved. Other errors (like not being able to
decode the attribute code or form still abort because then we really
don't know how to continue and the abbrev is probably bogus.
From 62ac40bfb52df30048e2c3dc64a53296da5eb066 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
Date: Tue, 21 Nov 2017 11:13:00 +0100
Subject: [PATCH] readelf: Print attribute name and form in error message.

Now an error getting the attribute value will not only print the DIE offset
and the reason, but also the attribute name and form. e.g.

  DIE [b] cannot get attribute 'ranges' (sec_offset) value: .debug_ranges
  section missing

Also we don't abort, but try to print the other attributes of the DIE
anyway. It might just be one attribute whose value cannot be resolved.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 src/ChangeLog |  5 +++++
 src/readelf.c | 11 ++++++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index d112cd2..c56c323 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2017-11-21  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (attr_callback): Print attribute name and form in error
+	message. If only the value cannot be retrieved/resolved don't abort.
+
 2017-10-03  Mark Wielaard  <mark@klomp.org>
 
 	* readelf.c (attr_callback): Print DIE offset in error messages.
diff --git a/src/readelf.c b/src/readelf.c
index 9a03af6..ca7a19d 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -6044,9 +6044,14 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
 	    attrval_out:
 	      if (!cbargs->silent)
 		error (0, 0, gettext ("DIE [%" PRIx64 "] "
-				      "cannot get attribute value: %s"),
-		       dwarf_dieoffset (die), dwarf_errmsg (-1));
-	      return DWARF_CB_ABORT;
+				      "cannot get attribute '%s' (%s) value: "
+				      "%s"),
+		       dwarf_dieoffset (die),
+		       dwarf_attr_name (attr),
+		       dwarf_form_name (form),
+		       dwarf_errmsg (-1));
+	      /* Don't ABORT, it might be other attributes can be resolved.  */
+	      return DWARF_CB_OK;
 	    }
 	  char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize,
 				       addr, addr);
-- 
1.8.3.1


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