From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id B568238515D4 for ; Wed, 31 Mar 2021 13:56:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B568238515D4 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D7E38B26E; Wed, 31 Mar 2021 13:56:46 +0000 (UTC) Date: Wed, 31 Mar 2021 15:56:45 +0200 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [RFC][gdb/symtab] Add DEBUG_DEBUGINFOD_CLIENT in debuginfod-support.c Message-ID: <20210331135644.GA13846@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Mar 2021 13:56:49 -0000 Hi, Add an off-by-default debug trace option DEBUG_DEBUGINFOD_CLIENT in debuginfod-support.c. By redefining DEBUG_DEBUGINFOD_CLIENT to 1, we get a trace like this: ... TRYING DEBUGINFO FOR: \ /home/vries/gdb_versions/devel/system-supplied DSO at 0x7ffff7ffa000 BUILDID: 157d01461677175219ab3ccd37454aeb740d2a7e TOOK: 0.699193 seconds RESULT fd: -2 warning: Source file is more recent than executable. TRYING SOURCE: /home/abuild/rpmbuild/BUILD/gcc-7.5.0+r278197/\ obj-x86_64-suse-linux/x86_64-suse-linux/libgcc/../../../libgcc/\ config/i386/sfp-exceptions.c BUILDID: 97481d83f99d6da01138fe4c61114da27e34d17e TOOK: 1.724909 seconds RESULT fd: -2 TRYING SOURCE: /home/abuild/rpmbuild/BUILD/gcc-7.5.0+r278197/\ obj-x86_64-suse-linux/x86_64-suse-linux/libgcc/../../../libgcc/libgcc2.c BUILDID: 97481d83f99d6da01138fe4c61114da27e34d17e TOOK: 0.819237 seconds RESULT fd: -2 ... Any comments? Thanks, - Tom [gdb/symtab] Add DEBUG_DEBUGINFOD_CLIENT in debuginfod-support.c gdb/ChangeLog: 2021-03-31 Tom de Vries * debuginfod-support.c (DEBUG_DEBUGINFOD_CLIENT): New macro. Define to 0. (print_build_id, time_elapsed): New function. (debuginfod_source_query, debuginfod_debuginfo_query) [DEBUG_DEBUGINFOD_CLIENT]: Add tracing code. --- gdb/debuginfod-support.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c index 9778e2e4cfe..30b9f4ad631 100644 --- a/gdb/debuginfod-support.c +++ b/gdb/debuginfod-support.c @@ -23,6 +23,12 @@ #include "debuginfod-support.h" #include "gdbsupport/gdb_optional.h" +#define DEBUG_DEBUGINFOD_CLIENT 0 + +#if DEBUG_DEBUGINFOD_CLIENT +#include +#endif + #ifndef HAVE_LIBDEBUGINFOD scoped_fd debuginfod_source_query (const unsigned char *build_id, @@ -114,6 +120,28 @@ debuginfod_init () return c; } +#if DEBUG_DEBUGINFOD_CLIENT +static void +print_build_id (FILE *stream, const char *prefix, const unsigned char *build_id, + int build_id_len, const char *postfix) +{ + if (prefix) + fprintf (stream, "%s", prefix); + for (int i = 0; i < build_id_len; ++i) + fprintf (stream, "%02x", build_id[i]); + if (postfix) + fprintf (stream, "%s", postfix); +} + +static double +time_elapsed (std::chrono::time_point start) +{ + auto end = std::chrono::high_resolution_clock::now (); + std::chrono::duration diff = end - start; + return diff.count (); +} +#endif + /* See debuginfod-support.h */ scoped_fd @@ -131,14 +159,26 @@ debuginfod_source_query (const unsigned char *build_id, if (c == nullptr) return scoped_fd (-ENOMEM); +#if DEBUG_DEBUGINFOD_CLIENT + fprintf (stderr, "TRYING SOURCE: %s\n", srcpath); + print_build_id (stderr, "BUILDID: ", build_id, build_id_len, "\n"); +#endif + user_data data ("source file", srcpath); debuginfod_set_user_data (c.get (), &data); +#if DEBUG_DEBUGINFOD_CLIENT + auto start = std::chrono::high_resolution_clock::now (); +#endif scoped_fd fd (debuginfod_find_source (c.get (), build_id, build_id_len, srcpath, nullptr)); +#if DEBUG_DEBUGINFOD_CLIENT + fprintf (stderr, "TOOK: %f seconds\n", time_elapsed (start)); + fprintf (stderr, "RESULT fd: %d\n", fd.get ()); +#endif /* TODO: Add 'set debug debuginfod' command to control when error messages are shown. */ if (fd.get () < 0 && fd.get () != -ENOENT) @@ -172,9 +212,21 @@ debuginfod_debuginfo_query (const unsigned char *build_id, char *dname = nullptr; user_data data ("separate debug info for", filename); +#if DEBUG_DEBUGINFOD_CLIENT + fprintf (stderr, "TRYING DEBUGINFO FOR: %s\n", filename); + print_build_id (stderr, "BUILDID: ", build_id, build_id_len, "\n"); +#endif + debuginfod_set_user_data (c.get (), &data); +#if DEBUG_DEBUGINFOD_CLIENT + auto start = std::chrono::high_resolution_clock::now (); +#endif scoped_fd fd (debuginfod_find_debuginfo (c.get (), build_id, build_id_len, &dname)); +#if DEBUG_DEBUGINFOD_CLIENT + fprintf (stderr, "TOOK: %f seconds\n", time_elapsed (start)); + fprintf (stderr, "RESULT fd: %d\n", fd.get ()); +#endif if (fd.get () < 0 && fd.get () != -ENOENT) printf_filtered (_("Download failed: %s. Continuing without debug info for %ps.\n"),