diff mbox

Improve "set debug separate-debug-file"

Message ID a483c1c8-97f6-5129-0c20-80a05c94cb26@polymtl.ca
State New
Headers show

Commit Message

Simon Marchi Dec. 26, 2018, 4:52 p.m. UTC
On 2018-12-24 15:53, Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi <simon.marchi@ericsson.com> writes:
> 
> Simon> "set debug separate-debug-file" shows which candidates are 
> considered,
> Simon> when trying to find separate debug info.  But it's not clear if 
> GDB used
> Simon> a certain candidate, and if not, why not.  This patch adds some
> Simon> precision:
> 
> This seems good to me.
> 
> Simon>        if (separate_debug_file_debug)
> Simon> -	printf_unfiltered (_("  Trying %s\n"), link.c_str ());
> Simon> +	printf_unfiltered (_("  Trying %s..."), link.c_str ());
> 
> It probably (?) doesn't matter here but normally there should be a call
> to gdb_flush as well.

Yeah, I didn't add it because I know it was always going to be following with another
printf with a \n.  And there should not be significant time between both are printed.
I was going to add a comment explaining why there was no flush, but at this point I
thought it would just be simpler to add the flush :).

Here's what I pushed:

From 50794b45a2a7330fc32b118bff584a3a2e649ac5 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@ericsson.com>
Date: Wed, 26 Dec 2018 11:49:51 -0500
Subject: [PATCH] Improve "set debug separate-debug-file"

"set debug separate-debug-file" shows which candidates are considered,
when trying to find separate debug info.  But it's not clear if GDB used
a certain candidate, and if not, why not.  This patch adds some
precision:

Before:

  Looking for separate debug info (debug link) for /lib/x86_64-linux-gnu/libc.so.6
    Trying /lib/x86_64-linux-gnu/libc-2.23.so
    Trying /lib/x86_64-linux-gnu/.debug/libc-2.23.so
    Trying /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.23.so

After:

  Looking for separate debug info (debug link) for /lib/x86_64-linux-gnu/libc.so.6
    Trying /lib/x86_64-linux-gnu/libc-2.23.so... no, same file as the objfile.
    Trying /lib/x86_64-linux-gnu/.debug/libc-2.23.so... no, unable to open.
    Trying /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.23.so... yes!

gdb/ChangeLog:

	* build-id.c (build_id_to_debug_bfd): Enhance debug output.
	* symfile.c (separate_debug_file_exists): Likewise.
---
 gdb/ChangeLog  |  5 +++++
 gdb/build-id.c | 31 +++++++++++++++++++++++++++----
 gdb/symfile.c  | 39 ++++++++++++++++++++++++++++++++++-----
 3 files changed, 66 insertions(+), 9 deletions(-)
diff mbox

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c37e281740b5..425429e07f86 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@ 
+2018-12-26  Simon Marchi  <simon.marchi@ericsson.com>
+
+	* build-id.c (build_id_to_debug_bfd): Enhance debug output.
+	* symfile.c (separate_debug_file_exists): Likewise.
+
 2018-12-24  Andrew Burgess  <andrew.burgess@embecosm.com>

 	* c-exp.y (field_name): Allow DOUBLE_KEYWORD, INT_KEYWORD, LONG,
diff --git a/gdb/build-id.c b/gdb/build-id.c
index c8eacbd1e81c..ea6b61db0abd 100644
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -98,7 +98,10 @@  build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
       link += ".debug";

       if (separate_debug_file_debug)
-	printf_unfiltered (_("  Trying %s\n"), link.c_str ());
+	{
+	  printf_unfiltered (_("  Trying %s..."), link.c_str ());
+	  gdb_flush (gdb_stdout);
+	}

       /* lrealpath() is expensive even for the usually non-existent files.  */
       gdb::unique_xmalloc_ptr<char> filename;
@@ -106,16 +109,36 @@  build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
 	filename.reset (lrealpath (link.c_str ()));

       if (filename == NULL)
-	continue;
+	{
+	  if (separate_debug_file_debug)
+	    printf_unfiltered (_(" no, unable to compute real path\n"));
+
+	  continue;
+	}

       /* We expect to be silent on the non-existing files.  */
       abfd = gdb_bfd_open (filename.get (), gnutarget, -1);

       if (abfd == NULL)
-	continue;
+	{
+	  if (separate_debug_file_debug)
+	    printf_unfiltered (_(" no, unable to open.\n"));
+
+	  continue;
+	}

       if (build_id_verify (abfd.get(), build_id_len, build_id))
-	break;
+	{
+	  if (separate_debug_file_debug)
+	    printf_unfiltered (_(" yes!\n"));
+
+	  break;
+	}
+      else
+	{
+	  if (separate_debug_file_debug)
+	    printf_unfiltered (_(" no, build-id does not match.\n"));
+	}

       abfd.release ();
     }
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 8ab6a25de7c3..991b71fc7727 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1285,12 +1285,20 @@  separate_debug_file_exists (const std::string &name, unsigned long crc,
     return 0;

   if (separate_debug_file_debug)
-    printf_filtered (_("  Trying %s\n"), name.c_str ());
+    {
+      printf_filtered (_("  Trying %s..."), name.c_str ());
+      gdb_flush (gdb_stdout);
+    }

   gdb_bfd_ref_ptr abfd (gdb_bfd_open (name.c_str (), gnutarget, -1));

   if (abfd == NULL)
-    return 0;
+    {
+      if (separate_debug_file_debug)
+	printf_filtered (_(" no, unable to open.\n"));
+
+      return 0;
+    }

   /* Verify symlinks were not the cause of filename_cmp name difference above.

@@ -1309,7 +1317,12 @@  separate_debug_file_exists (const std::string &name, unsigned long crc,
     {
       if (abfd_stat.st_dev == parent_stat.st_dev
 	  && abfd_stat.st_ino == parent_stat.st_ino)
-	return 0;
+	{
+	  if (separate_debug_file_debug)
+	    printf_filtered (_(" no, same file as the objfile.\n"));
+
+	  return 0;
+	}
       verified_as_different = 1;
     }
   else
@@ -1318,7 +1331,12 @@  separate_debug_file_exists (const std::string &name, unsigned long crc,
   file_crc_p = gdb_bfd_crc (abfd.get (), &file_crc);

   if (!file_crc_p)
-    return 0;
+    {
+      if (separate_debug_file_debug)
+	printf_filtered (_(" no, error computing CRC.\n"));
+
+      return 0;
+    }

   if (crc != file_crc)
     {
@@ -1331,7 +1349,12 @@  separate_debug_file_exists (const std::string &name, unsigned long crc,
       if (!verified_as_different)
 	{
 	  if (!gdb_bfd_crc (parent_objfile->obfd, &parent_crc))
-	    return 0;
+	    {
+	      if (separate_debug_file_debug)
+		printf_filtered (_(" no, error computing CRC.\n"));
+
+	      return 0;
+	    }
 	}

       if (verified_as_different || parent_crc != file_crc)
@@ -1339,9 +1362,15 @@  separate_debug_file_exists (const std::string &name, unsigned long crc,
 		   " does not match \"%s\" (CRC mismatch).\n"),
 		 name.c_str (), objfile_name (parent_objfile));

+      if (separate_debug_file_debug)
+	printf_filtered (_(" no, CRC doesn't match.\n"));
+
       return 0;
     }

+  if (separate_debug_file_debug)
+    printf_filtered (_(" yes!\n"));
+
   return 1;
 }