public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Kevin Buettner <kevinb@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/gdb] gdb-17.2-rebase-f44: Catch ModuleNotFoundError in rpm-suggestions.py
Date: Sun, 28 Jun 2026 00:01:42 GMT [thread overview]
Message-ID: <178260490243.1.5192220510708450841.rpms-gdb-16722914d913@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/gdb
Branch : gdb-17.2-rebase-f44
Commit : 16722914d913c6e7475cba5cef63a5e7bd33f29b
Author : Kevin Buettner <kevinb@redhat.com>
Date : 2024-05-23T17:37:53-07:00
Stats : +107/-96 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/gdb/c/16722914d913c6e7475cba5cef63a5e7bd33f29b?branch=gdb-17.2-rebase-f44
Log:
Catch ModuleNotFoundError in rpm-suggestions.py
Revise rpm-suggestions.py script so that a message is printed when the
'rpm' module (found in the python3-rpm package) isn't found. In
particular, the ModuleNotFoundError will be caught, avoiding a
potential python import error. (RHBZ 2275274)
---
diff --git a/gdb-add-rpm-suggestion-script.patch b/gdb-add-rpm-suggestion-script.patch
index 660bc58..1efb387 100644
--- a/gdb-add-rpm-suggestion-script.patch
+++ b/gdb-add-rpm-suggestion-script.patch
@@ -26,7 +26,7 @@ diff --git a/gdb/python/lib/gdb/command/rpm-suggestions.py b/gdb/python/lib/gdb/
new file mode 100644
--- /dev/null
+++ b/gdb/python/lib/gdb/command/rpm-suggestions.py
-@@ -0,0 +1,111 @@
+@@ -0,0 +1,116 @@
+# Copyright 2023 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
@@ -44,100 +44,105 @@ new file mode 100644
+
+import gdb
+import gdb.missing_debug
-+import rpm
-+
-+# Track all the RPMs suggested during a single debug session so we
-+# don't suggest the same RPM twice. This is only cleared when the
-+# main executable is changed.
-+__missing_rpms = {}
-+
-+# Track any missing RPMs that have been discovered since the last time
-+# the prompt was displayed. RPMs in here are also present in the
-+# __MISSING_RPMS dictionary, but this dictionary is cleared each time
-+# the prompt is shown.
-+__suggest_rpms = {}
-+
-+
-+# Lookup RPMs that might provide the debug information for FILENAME,
-+# which is a string containing the path to an object file GDB could
-+# not find any debug information for.
-+#
-+# If a possible RPM is found then this is added to the globals
-+# __MISSING_RPMS and __SUGGEST_RPMS, which are used elsewhere in this
-+# script.
-+def find_suggestions(filename):
-+ ts = rpm.TransactionSet()
-+
-+ mi = ts.dbMatch(rpm.RPMDBI_BASENAMES, filename)
-+ for h in mi:
-+ # Build the debuginfo package name.
-+ obj = h.format("%{name}-debuginfo-%{version}-%{release}.%{arch}")
-+
-+ # Check to see if the package is installed.
-+ mi2 = ts.dbMatch(rpm.RPMDBI_LABEL, str(obj))
-+ if len(mi2) > 0:
-+ continue
-+
-+ # Now build the name of the package FILENAME came from.
-+ obj = h.format("%{name}-%{version}-%{release}.%{arch}")
-+ rpm_name = str(obj)
-+ if not rpm_name in __missing_rpms:
-+ __suggest_rpms[rpm_name] = True
-+ __missing_rpms[rpm_name] = True
-+
-+
-+# A missing debug handler class. Just forwards the name of the
-+# objfile for which we are missing debug information to
-+# find_suggestions.
-+class RPMSuggestionHandler(gdb.missing_debug.MissingDebugHandler):
-+ def __init__(self):
-+ super().__init__("rpm-suggestions")
-+
-+ def __call__(self, objfile):
-+ # Traditionally the 'build-id-verbose' parameter is what
-+ # controlled all RPM suggestion. Maybe once all the RPM
-+ # suggestion is performed via Python extensions then we might
-+ # consider renaming this parameter to something else, but for
-+ # now, for backward compatibility, I've retained this name.
-+ if gdb.parameter("build-id-verbose") > 0:
-+ find_suggestions(objfile.filename)
-+ return False
-+ return None
-+
-+
-+# Called before GDB displays its prompt. If the global __SUGGEST_RPMS
-+# dictionary is not empty, then this hook prints treats the keys of
-+# this dictionary as strings which are the names of RPMs. This hook
-+# formats each RPM name into a suggested debuginfo-install command and
-+# suggests this to the user.
-+def before_prompt():
-+ global __suggest_rpms
-+
-+ if len(__suggest_rpms) > 0:
-+ for p in __suggest_rpms.keys():
-+ print("Missing debuginfo, try: dnf debuginfo-install " + p)
-+ __suggest_rpms = {}
-+
-+
-+# Called when the executable within a progrm space is changed. Clear
-+# the lists of RPM suggestions. We only clear the previous suggestion
-+# list when the executable really changes. If the user simply
-+# recompiles the executable, then we don't both clearing this list.
-+def executable_changed_handler(event):
-+ global __missing_rpms
-+ global __suggest_rpms
-+
-+ if not event.reload:
-+ __missing_rpms = {}
-+ __suggest_rpms = {}
-+
-+
-+# Attach to the required GDB events.
-+gdb.events.executable_changed.connect(executable_changed_handler)
-+gdb.events.before_prompt.connect(before_prompt)
-+
-+# Register the missing debug handler with GDB.
-+gdb.missing_debug.register_handler(None, RPMSuggestionHandler())
++try:
++ import rpm
++except ModuleNotFoundError:
++ print(
++ "Unable to load 'rpm' module. Please install the python3-rpm package."
++ )
++else:
++ # Track all the RPMs suggested during a single debug session so we
++ # don't suggest the same RPM twice. This is only cleared when the
++ # main executable is changed.
++ __missing_rpms = {}
++
++ # Track any missing RPMs that have been discovered since the last time
++ # the prompt was displayed. RPMs in here are also present in the
++ # __MISSING_RPMS dictionary, but this dictionary is cleared each time
++ # the prompt is shown.
++ __suggest_rpms = {}
++
++
++ # Lookup RPMs that might provide the debug information for FILENAME,
++ # which is a string containing the path to an object file GDB could
++ # not find any debug information for.
++ #
++ # If a possible RPM is found then this is added to the globals
++ # __MISSING_RPMS and __SUGGEST_RPMS, which are used elsewhere in this
++ # script.
++ def find_suggestions(filename):
++ ts = rpm.TransactionSet()
++
++ mi = ts.dbMatch(rpm.RPMDBI_BASENAMES, filename)
++ for h in mi:
++ # Build the debuginfo package name.
++ obj = h.format("%{name}-debuginfo-%{version}-%{release}.%{arch}")
++
++ # Check to see if the package is installed.
++ mi2 = ts.dbMatch(rpm.RPMDBI_LABEL, str(obj))
++ if len(mi2) > 0:
++ continue
++
++ # Now build the name of the package FILENAME came from.
++ obj = h.format("%{name}-%{version}-%{release}.%{arch}")
++ rpm_name = str(obj)
++ if not rpm_name in __missing_rpms:
++ __suggest_rpms[rpm_name] = True
++ __missing_rpms[rpm_name] = True
++
++
++ # A missing debug handler class. Just forwards the name of the
++ # objfile for which we are missing debug information to
++ # find_suggestions.
++ class RPMSuggestionHandler(gdb.missing_debug.MissingDebugHandler):
++ def __init__(self):
++ super().__init__("rpm-suggestions")
++
++ def __call__(self, objfile):
++ # Traditionally the 'build-id-verbose' parameter is what
++ # controlled all RPM suggestion. Maybe once all the RPM
++ # suggestion is performed via Python extensions then we might
++ # consider renaming this parameter to something else, but for
++ # now, for backward compatibility, I've retained this name.
++ if gdb.parameter("build-id-verbose") > 0:
++ find_suggestions(objfile.filename)
++ return False
++ return None
++
++
++ # Called before GDB displays its prompt. If the global __SUGGEST_RPMS
++ # dictionary is not empty, then this hook prints treats the keys of
++ # this dictionary as strings which are the names of RPMs. This hook
++ # formats each RPM name into a suggested debuginfo-install command and
++ # suggests this to the user.
++ def before_prompt():
++ global __suggest_rpms
++
++ if len(__suggest_rpms) > 0:
++ for p in __suggest_rpms.keys():
++ print("Missing debuginfo, try: dnf debuginfo-install " + p)
++ __suggest_rpms = {}
++
++
++ # Called when the executable within a progrm space is changed. Clear
++ # the lists of RPM suggestions. We only clear the previous suggestion
++ # list when the executable really changes. If the user simply
++ # recompiles the executable, then we don't both clearing this list.
++ def executable_changed_handler(event):
++ global __missing_rpms
++ global __suggest_rpms
++
++ if not event.reload:
++ __missing_rpms = {}
++ __suggest_rpms = {}
++
++
++ # Attach to the required GDB events.
++ gdb.events.executable_changed.connect(executable_changed_handler)
++ gdb.events.before_prompt.connect(before_prompt)
++
++ # Register the missing debug handler with GDB.
++ gdb.missing_debug.register_handler(None, RPMSuggestionHandler())
diff --git a/gdb/testsuite/gdb.python/py-missing-debug.py b/gdb/testsuite/gdb.python/py-missing-debug.py
--- a/gdb/testsuite/gdb.python/py-missing-debug.py
+++ b/gdb/testsuite/gdb.python/py-missing-debug.py
diff --git a/gdb.spec b/gdb.spec
index 68a993b..4a1c38a 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -45,7 +45,7 @@ Version: 14.2
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 8%{?dist}
+Release: 9%{?dist}
License: GPL-3.0-or-later AND BSD-3-Clause AND FSFAP AND LGPL-2.1-or-later AND GPL-2.0-or-later AND LGPL-2.0-or-later AND LicenseRef-Fedora-Public-Domain AND GFDL-1.3-or-later AND LGPL-2.0-or-later WITH GCC-exception-2.0 AND GPL-3.0-or-later WITH GCC-exception-3.1 AND GPL-2.0-or-later WITH GNU-compiler-exception
# Do not provide URL for snapshots as the file lasts there only for 2 days.
@@ -926,6 +926,12 @@ fi
# endif scl
%changelog
+* Thu May 23 2024 Kevin Buettner <kevinb@redhat.com> - 14.2-9
+- Revise rpm-suggestions.py script so that a message is printed when
+ the 'rpm' module (found in the python3-rpm package) isn't found.
+ In particular, the ModuleNotFoundError will be caught, avoiding
+ a potential python import error. (RHBZ 2275274)
+
* Wed May 22 2024 Guinevere Larsen <blarsen@redhat.com>
- Remove gdb-fedora-libncursesw.patch, this workaround isn't needed
anymore.
reply other threads:[~2026-06-28 0:01 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178260490243.1.5192220510708450841.rpms-gdb-16722914d913@fedoraproject.org \
--to=kevinb@redhat.com \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox