public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-pmuldoon-python-backtrace: Add show python frame-filter priority. Convert set/show frame-filter enable to enable/disable frame-filter. Clean up some interface changes to internal workers, and add tests. Fix non Python compile issue.
@ 2012-10-22 13:01 pmuldoon
0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-10-22 13:01 UTC (permalink / raw)
To: archer-commits
The branch, archer-pmuldoon-python-backtrace has been updated
via 04437f1d987cf165f40a57449fe1de78041bb9eb (commit)
from c77c423e819ce42fc776b3ada0cb369f17312c30 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 04437f1d987cf165f40a57449fe1de78041bb9eb
Author: Phil Muldoon <pmuldoon@redhat.com>
Date: Mon Oct 22 13:59:25 2012 +0100
Add show python frame-filter priority. Convert set/show frame-filter
enable to enable/disable frame-filter. Clean up some interface
changes to internal workers, and add tests. Fix non Python compile
issue.
-----------------------------------------------------------------------
Summary of changes:
gdb/gdb-gdb.gdb.in | 10 --
gdb/python/lib/gdb/command/frame_filters.py | 184 +++++++++++++++++++++------
gdb/python/py-framefilter.c | 10 +-
gdb/testsuite/gdb.python/py-framefilter.exp | 24 +++-
gdb/testsuite/gdb.python/py-framefilter.py | 2 +-
5 files changed, 174 insertions(+), 56 deletions(-)
First 500 lines of diff:
diff --git a/gdb/gdb-gdb.gdb.in b/gdb/gdb-gdb.gdb.in
index a2e7e94..ffb7f53 100644
--- a/gdb/gdb-gdb.gdb.in
+++ b/gdb/gdb-gdb.gdb.in
@@ -1,15 +1,5 @@
echo Setting up the environment for debugging gdb.\n
-# Set up the Python library and "require" command.
-python
-from os.path import abspath
-gdb.datadir = abspath ('@srcdir@/python/lib')
-gdb.pythonlibdir = gdb.datadir
-gdb.__path__ = [gdb.datadir + '/gdb']
-sys.path.insert(0, gdb.datadir)
-end
-source @srcdir@/python/lib/gdb/__init__.py
-
set complaints 1
b internal_error
diff --git a/gdb/python/lib/gdb/command/frame_filters.py b/gdb/python/lib/gdb/command/frame_filters.py
index c6992da..42a994f 100644
--- a/gdb/python/lib/gdb/command/frame_filters.py
+++ b/gdb/python/lib/gdb/command/frame_filters.py
@@ -43,24 +43,39 @@ def _parse_arg (cmd_name, arg):
return (object_list, argument)
-def _get_priority(filter_item):
- """ Internal Worker function to return the frame-filter's priority.
+def _get_sort_priority(filter_item):
+ """ Internal Worker function to return the frame-filter's priority
+ for a List's sort function
Arguments:
filter_item: A tuple, with the first element being the name,
and the second being the frame-filter object.
"""
+ # Do not fail here, as the sort will fail. If a filter has not
+ # (incorrectly) set a priority, set it to zero.
if hasattr(filter_item[1], "priority"):
return filter_item[1].priority
else:
- return 1000
+ return 0
+
+def _get_priority(filter_item):
+ """ Internal Worker function to return the frame-filter's priority.
+
+ Arguments:
+ filter_item: An object conforming to the frame filter
+ interface.
+ """
+ if hasattr(filter_item, "priority"):
+ return filter_item.priority
+ else:
+ raise gdb.GdbError("Cannot find class attribute 'priority'")
def _set_priority(filter_item, priority):
""" Internal Worker function to set the frame-filter's priority.
Arguments:
- filter_item: A tuple, with the first element being the name,
- and the second being the frame-filter object.
+ filter_item: An object conforming to the frame filter
+ interface.
priority: The priority to assign as an integer.
"""
@@ -74,22 +89,39 @@ def _get_enabled(filter_item):
state.
Arguments:
- filter_item: A tuple, with the first element being the name,
- and the second being the frame-filter object.
+ filter_item: An object conforming to the frame filter
+ interface.
"""
- if hasattr(filter_item[1], "enabled"):
- return filter_item[1].enabled
+ if hasattr(filter_item, "enabled"):
+ return filter_item.enabled
else:
raise gdb.GdbError("Cannot find class attribute 'enabled'")
+def _get_filter_enabled (filter_item):
+ """ Internal Worker function to return the frame-filter's enabled
+ state for filter operations.
+
+ Arguments:
+ filter_item: A tuple, with the first element being the name,
+ and the second being the frame-filter object.
+ """
+ # If the filter class is badly implemented, do not cease filter
+ # operations, just set enabled to False.
+ try:
+ enabled = _get_enabled (filter_item[1])
+ except gdbError as e:
+ enabled = False
+
+ return enabled
+
def _set_enabled(filter_item, state):
""" Internal Worker function to set the frame-filter's enabled
state.
Arguments:
- filter_item: A tuple, with the first element being the name,
- and the second being the frame-filter object.
+ filter_item: An object conforming to the frame filter
+ interface.
state: True or False, depending on desired state.
"""
if hasattr(filter_item, "enabled"):
@@ -102,8 +134,8 @@ def _get_name (frame_filter):
frame-filter.
Arguments:
- filter_item: A tuple, with the first element being the name,
- and the second being the frame-filter object.
+ filter_item: An object conforming to the frame filter
+ interface.
"""
if hasattr(frame_filter, "name"):
return frame_filter.name
@@ -147,9 +179,9 @@ def _sort_list ():
all_filters = all_filters + gdb.frame_filters.items()
sorted_frame_filters = copy.copy(all_filters)
- sorted_frame_filters.sort(key = _get_priority,
+ sorted_frame_filters.sort(key = _get_sort_priority,
reverse = True)
- sorted_frame_filters = filter (_get_enabled, sorted_frame_filters)
+ sorted_frame_filters = filter (_get_filter_enabled, sorted_frame_filters)
return sorted_frame_filters
def invoke (frame):
@@ -194,19 +226,29 @@ class InfoFrameFilter(gdb.Command):
def __init__ (self):
super(InfoFrameFilter, self).__init__("info frame-filter",
gdb.COMMAND_DATA)
+
def list_frame_filters(self, frame_filters):
"""Print a list of frame_filters."""
sorted_frame_filters = frame_filters.items()
- sorted_frame_filters.sort(key = _get_priority, reverse = True)
+ sorted_frame_filters.sort(key = _get_sort_priority, reverse = True)
print " Priority Enabled Name"
print " ======== ======= ===="
- for frame_filter in sorted_frame_filters:
- priority = '{:<8}'.format(str(_get_priority (frame_filter)))
- name = frame_filter[0]
- enabled = '{:<7}'.format(self.enabled_string(_get_enabled(frame_filter)))
- print " %s %s %s" % (priority, enabled, name)
+ if len(sorted_frame_filters) == 0:
+ print " No frame filters registered."
+ else:
+ for frame_filter in sorted_frame_filters:
+ name = frame_filter[0]
+ try:
+ priority = '{:<8}'.format(
+ str(_get_priority (frame_filter[1])))
+ enabled = '{:<7}'.format(
+ self.enabled_string(_get_enabled(frame_filter[1])))
+ except Exception as e:
+ print " Error printing filter '"+name+"': ",e
+ else:
+ print " %s %s %s" % (priority, enabled, name)
def print_list(self, title, filter_list):
"""Print a list."""
@@ -251,16 +293,21 @@ def do_enable_frame_filter (command_tuple, flag):
op_list = _return_list(list_op)
do_enable_frame_filter_1(op_list, frame_filter, flag)
-class FilterPrefixCmd (gdb.Command):
+class SetFilterPrefixCmd (gdb.Command):
def __init__ (self):
- super (FilterPrefixCmd, self).__init__ ("set python frame-filter",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_COMMAND, True)
+ super (SetFilterPrefixCmd, self).__init__ ("set python frame-filter",
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_COMMAND, True)
+class ShowFilterPrefixCmd (gdb.Command):
+ def __init__ (self):
+ super (ShowFilterPrefixCmd, self).__init__ ("show python frame-filter",
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_COMMAND, True)
class EnableFrameFilter (gdb.Command):
"""GDB command to disable the specified frame-filter.
- Usage: set python frame-filter enable [list] [name]
+ Usage: enable frame-filter enable [list] [name]
LIST is the name of the frame-filter list to operate. Named lists
are: "global" for the global frame-filter list, "progspace" for
@@ -271,20 +318,19 @@ class EnableFrameFilter (gdb.Command):
NAME matches the name of the frame-filter to operate on.
"""
def __init__(self):
- super(EnableFrameFilter, self).__init__("set python frame-filter " \
- "enable", gdb.COMMAND_DATA,
- gdb.COMPLETE_COMMAND)
+ super(EnableFrameFilter, self).__init__("enable frame-filter",
+ gdb.COMMAND_DATA)
def invoke(self, arg, from_tty):
"""GDB calls this to perform the command."""
- command_tuple = _parse_arg("set python frame-filter disable", arg)
+ command_tuple = _parse_arg("enable frame-filter", arg)
do_enable_frame_filter(command_tuple, True)
class DisableFrameFilter (gdb.Command):
"""GDB command to disable the specified frame-filter.
- Usage: set python frame-filter disable [list] [name]
+ Usage: disable frame-filter disable [list] [name]
LIST is the name of the frame-filter list to operate. Named lists
are: "global" for the global frame-filter list, "progspace" for
@@ -295,19 +341,18 @@ class DisableFrameFilter (gdb.Command):
NAME matches the name of the frame-filter to operate on.
"""
def __init__(self):
- super(DisableFrameFilter, self).__init__("set python frame-filter " \
- "disable", gdb.COMMAND_DATA,
- gdb.COMPLETE_COMMAND)
+ super(DisableFrameFilter, self).__init__("disable frame-filter",
+ gdb.COMMAND_DATA)
def invoke(self, arg, from_tty):
"""GDB calls this to perform the command."""
- command_tuple = _parse_arg("set python frame-filter disable", arg)
+ command_tuple = _parse_arg("disable frame-filter", arg)
do_enable_frame_filter(command_tuple, False)
class SetFrameFilterPriority (gdb.Command):
- """GDB command to set the priority of the specified frame-filter.
+ """GDB command to set the priority of the specified frame-filter.
- Usage: set python frame-filter priority [list] [name] [priority]
+ Usage: set python frame-filter priority list name priority
LIST is the name of the frame-filter list to operate. Named lists
are: "global" for the global frame-filter list, "progspace" for
@@ -370,12 +415,75 @@ class SetFrameFilterPriority (gdb.Command):
command_tuple = self._parse_pri_arg(arg)
self._set_filter_priority (command_tuple)
+class ShowFrameFilterPriority (gdb.Command):
+ """GDB command to show the priority of the specified frame-filter.
+
+ Usage: show python frame-filter priority list name
+
+ LIST is the name of the frame-filter list to operate. Named lists
+ are: "global" for the global frame-filter list, "progspace" for
+ the program space's file frame-filter list. If either of these
+ two are not specified, the list name is assumed to be the name of
+ the object-file name.
+
+ NAME matches the name of the frame-filter to operate on.
+ """
+
+ def __init__(self):
+ super(ShowFrameFilterPriority, self).__init__("show python " \
+ "frame-filter priority",
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_COMMAND)
+ def _parse_pri_arg (self, arg):
+ argv = gdb.string_to_argv(arg);
+ argc = len(argv)
+ if argc != 2:
+ raise SyntaxError("show python frame-filter priority " \
+ "takes exactly two arguments.")
+
+ object_list = argv[0]
+ name = argv[1]
+ return (object_list, name)
+
+ def get_filter_priority (self, frame_filters, name):
+ """Worker for retrieving the priority of frame_filters.
+
+ Arguments:
+
+ frame_filters: name of frame filter list.
+ name: object to select printers.
+ """
+ op_list = _return_list (frame_filters)
+
+ try:
+ ff = op_list[name]
+ except KeyError:
+ msg = "frame-filter '" + str(name) + "' not found."
+ raise gdb.GdbError(msg)
+
+ return _get_priority(ff)
+
+ def invoke(self, arg, from_tty):
+ """GDB calls this to perform the command."""
+ command_tuple = self._parse_pri_arg(arg)
+ filter_name = command_tuple[1]
+ list_name = command_tuple[0]
+ try:
+ priority = self.get_filter_priority (list_name, filter_name);
+ except Exception as e:
+ print "Error printing filter priority for '"+name+"':",e
+ else:
+ print "Priority of filter '" + filter_name + "' in list '" \
+ + list_name + "' is: " + str(priority)
+
def register_frame_filter_commands():
"""Call from a top level script to install the frame-filter commands."""
InfoFrameFilter()
- FilterPrefixCmd()
+ SetFilterPrefixCmd()
+ ShowFilterPrefixCmd()
EnableFrameFilter()
DisableFrameFilter()
SetFrameFilterPriority ()
+ ShowFrameFilterPriority ()
register_frame_filter_commands()
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index d806ceb..a508a4b 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -1315,7 +1315,7 @@ int apply_frame_filter (struct frame_info *frame, int flags,
else
{
Py_DECREF (iterable);
- error (_("Frame filter must support iteration protocol"));
+ error (_("Frame filter must support iteration protocol."));
}
done:
@@ -1327,10 +1327,10 @@ int apply_frame_filter (struct frame_info *frame, int flags,
#else /* HAVE_PYTHON */
int
-int apply_frame_filter (struct frame_info *frame, int flags,
- enum print_values mi_print_args_type,
- const char *cli_print_args_type,
- struct ui_out *out, int count)
+apply_frame_filter (struct frame_info *frame, int flags,
+ enum print_values mi_print_args_type,
+ const char *cli_print_args_type,
+ struct ui_out *out, int count)
{
return PY_BT_NO_FILTERS;
}
diff --git a/gdb/testsuite/gdb.python/py-framefilter.exp b/gdb/testsuite/gdb.python/py-framefilter.exp
index d3da491..98f2d79 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.exp
+++ b/gdb/testsuite/gdb.python/py-framefilter.exp
@@ -52,7 +52,7 @@ if ![runto_main ] then {
perror "couldn't run to breakpoint"
return
}
-
+gdb_test_no_output "set python print-stack full"
# Load global frame-filters
set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
gdb_test_no_output "python execfile ('${remote_python_file}')"
@@ -61,7 +61,27 @@ gdb_breakpoint [gdb_get_line_number "Backtrace end breakpoint"]
gdb_continue_to_breakpoint "Backtrace end breakpoint"
gdb_test "info frame-filter" \
+ ".*900.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+
+# Test set/show
+gdb_test "show python frame-filter priority global Elider" \
+ "Priority of filter 'Elider' in list 'global' is: 900"
+gdb_test_no_output "set python frame-filter priority global Elider 1000"
+gdb_test "show python frame-filter priority global Elider" \
+ "Priority of filter 'Elider' in list 'global' is: 1000"
+gdb_test "info frame-filter" \
+ ".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+
+# Test enable/disable
+gdb_test "info frame-filter" \
".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+gdb_test_no_output "disable frame-filter global Elider"
+gdb_test "info frame-filter" \
+ ".*1000.*No.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+gdb_test_no_output "enable frame-filter global Elider"
+gdb_test "info frame-filter" \
+ ".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+
# Test raw
gdb_test "bt raw" \
".*#0.*end_func.*#22.*in func1.*#27.*in main \\(\\).*"
@@ -71,7 +91,7 @@ gdb_test "bt" \
".*#0.*cnuf_dne.*#22.*in 1cnuf.*#27.*in niam \\(\\).*"
# Disable Reverse
-gdb_test_no_output "set python frame-filter disable global Reverse"
+gdb_test_no_output "disable frame-filter global Reverse"
gdb_test "bt" \
".*#0.*end_func.*#22.*in func1.*#27.*in main \\(\\).*"
diff --git a/gdb/testsuite/gdb.python/py-framefilter.py b/gdb/testsuite/gdb.python/py-framefilter.py
index d44cb84..86cb017 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.py
+++ b/gdb/testsuite/gdb.python/py-framefilter.py
@@ -107,7 +107,7 @@ class FrameElider ():
def __init__ (self):
self.name = "Elider"
- self.priority = 1000
+ self.priority = 900
self.enabled = True
gdb.frame_filters [self.name] = self
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-10-22 13:01 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-22 13:01 [SCM] archer-pmuldoon-python-backtrace: Add show python frame-filter priority. Convert set/show frame-filter enable to enable/disable frame-filter. Clean up some interface changes to internal workers, and add tests. Fix non Python compile issue pmuldoon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).