From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26632 invoked by alias); 13 Jun 2012 19:17:48 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 26599 invoked by uid 9514); 13 Jun 2012 19:17:47 -0000 Date: Wed, 13 Jun 2012 19:17:00 -0000 Message-ID: <20120613191747.26584.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-pmuldoon-python-backtrace: Undo accidental file deletion X-Git-Refname: refs/heads/archer-pmuldoon-python-backtrace X-Git-Reftype: branch X-Git-Oldrev: 21b52446556e641bdafebf333a95fabd015ba84f X-Git-Newrev: 14212616ff6b4ac50b9396946dd76bc7ae5acf7c X-SW-Source: 2012-q2/txt/msg00056.txt.bz2 List-Id: The branch, archer-pmuldoon-python-backtrace has been updated via 14212616ff6b4ac50b9396946dd76bc7ae5acf7c (commit) from 21b52446556e641bdafebf333a95fabd015ba84f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 14212616ff6b4ac50b9396946dd76bc7ae5acf7c Author: Phil Muldoon Date: Wed Jun 13 20:17:05 2012 +0100 Undo accidental file deletion Revert "Add Frame filter management and base class" This reverts commit 116249e4bb128d63c6ddfb57b3588e78d454f015. ----------------------------------------------------------------------- Summary of changes: gdb/python/lib/gdb/FrameWrapper.py | 81 ++ gdb/python/lib/gdb/__init__.py | 41 + gdb/python/lib/gdb/command/__init__.py | 16 + gdb/python/lib/gdb/command/explore.py | 755 +++++++++++ gdb/python/lib/gdb/command/pretty_printers.py | 372 ++++++ gdb/python/lib/gdb/command/prompt.py | 66 + gdb/python/lib/gdb/command/upto.py | 128 ++ gdb/python/lib/gdb/printing.py | 258 ++++ gdb/python/lib/gdb/prompt.py | 149 +++ gdb/python/lib/gdb/types.py | 111 ++ gdb/python/py-auto-load.c | 298 +++++ gdb/python/py-block.c | 548 ++++++++ gdb/python/py-bpevent.c | 56 + gdb/python/py-breakpoint.c | 1022 ++++++++++++++ gdb/python/py-cmd.c | 699 ++++++++++ gdb/python/py-continueevent.c | 53 + gdb/python/py-event.c | 182 +++ gdb/python/py-event.h | 122 ++ gdb/python/py-events.h | 60 + gdb/python/py-evtregistry.c | 172 +++ gdb/python/py-evts.c | 74 + gdb/python/py-exitedevent.c | 79 ++ gdb/python/py-finishbreakpoint.c | 467 +++++++ gdb/python/py-frame.c | 1082 +++++++++++++++ gdb/python/py-framefilter.c | 825 ++++++++++++ gdb/python/py-function.c | 249 ++++ gdb/python/py-inferior.c | 870 ++++++++++++ gdb/python/py-infthread.c | 342 +++++ gdb/python/py-lazy-string.c | 250 ++++ gdb/python/py-newobjfileevent.c | 70 + gdb/python/py-objfile.c | 318 +++++ gdb/python/py-param.c | 814 +++++++++++ gdb/python/py-prettyprint.c | 836 ++++++++++++ gdb/python/py-progspace.c | 306 +++++ gdb/python/py-signalevent.c | 53 + gdb/python/py-stopevent.c | 117 ++ gdb/python/py-stopevent.h | 36 + gdb/python/py-symbol.c | 595 +++++++++ gdb/python/py-symtab.c | 603 +++++++++ gdb/python/py-threadevent.c | 78 ++ gdb/python/py-type.c | 1777 +++++++++++++++++++++++++ gdb/python/py-utils.c | 395 ++++++ gdb/python/py-value.c | 1521 +++++++++++++++++++++ gdb/python/python-config.py | 77 ++ gdb/python/python-internal.h | 349 +++++ gdb/python/python.c | 1513 +++++++++++++++++++++ gdb/python/python.h | 57 + 47 files changed, 18942 insertions(+), 0 deletions(-) create mode 100644 gdb/python/lib/gdb/FrameWrapper.py create mode 100644 gdb/python/lib/gdb/__init__.py create mode 100644 gdb/python/lib/gdb/command/__init__.py create mode 100644 gdb/python/lib/gdb/command/explore.py create mode 100644 gdb/python/lib/gdb/command/pretty_printers.py create mode 100644 gdb/python/lib/gdb/command/prompt.py create mode 100644 gdb/python/lib/gdb/command/upto.py create mode 100644 gdb/python/lib/gdb/printing.py create mode 100644 gdb/python/lib/gdb/prompt.py create mode 100644 gdb/python/lib/gdb/types.py create mode 100644 gdb/python/py-auto-load.c create mode 100644 gdb/python/py-block.c create mode 100644 gdb/python/py-bpevent.c create mode 100644 gdb/python/py-breakpoint.c create mode 100644 gdb/python/py-cmd.c create mode 100644 gdb/python/py-continueevent.c create mode 100644 gdb/python/py-event.c create mode 100644 gdb/python/py-event.h create mode 100644 gdb/python/py-events.h create mode 100644 gdb/python/py-evtregistry.c create mode 100644 gdb/python/py-evts.c create mode 100644 gdb/python/py-exitedevent.c create mode 100644 gdb/python/py-finishbreakpoint.c create mode 100644 gdb/python/py-frame.c create mode 100644 gdb/python/py-framefilter.c create mode 100644 gdb/python/py-function.c create mode 100644 gdb/python/py-inferior.c create mode 100644 gdb/python/py-infthread.c create mode 100644 gdb/python/py-lazy-string.c create mode 100644 gdb/python/py-newobjfileevent.c create mode 100644 gdb/python/py-objfile.c create mode 100644 gdb/python/py-param.c create mode 100644 gdb/python/py-prettyprint.c create mode 100644 gdb/python/py-progspace.c create mode 100644 gdb/python/py-signalevent.c create mode 100644 gdb/python/py-stopevent.c create mode 100644 gdb/python/py-stopevent.h create mode 100644 gdb/python/py-symbol.c create mode 100644 gdb/python/py-symtab.c create mode 100644 gdb/python/py-threadevent.c create mode 100644 gdb/python/py-type.c create mode 100644 gdb/python/py-utils.c create mode 100644 gdb/python/py-value.c create mode 100644 gdb/python/python-config.py create mode 100644 gdb/python/python-internal.h create mode 100644 gdb/python/python.c create mode 100644 gdb/python/python.h First 500 lines of diff: diff --git a/gdb/python/lib/gdb/FrameWrapper.py b/gdb/python/lib/gdb/FrameWrapper.py new file mode 100644 index 0000000..11f69ed --- /dev/null +++ b/gdb/python/lib/gdb/FrameWrapper.py @@ -0,0 +1,81 @@ +# Copyright (C) 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import gdb + +class FrameWrapper: + "Base Frame Wrapper" + + def __init__ (self, frame): + self.frame = frame + + def __new__ (self): + return self + + def omit (self): + return False + + def elide (self): + return False + + def function (self): + fname = str (self.frame.function()) + if (fname == ""): + return "" + else: + return fname + + def level (self, level): + return level + + def address (self): + return self.frame.pc() + + def filename (self): + sal = self.frame.find_sal() + if (sal): + return sal.symtab.filename + else: + return "" + + def frame_args (self): + args = self.frame.arguments() + args_list = [] + if args != None: + for arg in args: + value = arg.value(self.frame) + args_list.append((arg, value)) + + return args_list + + def frame_locals (self): + frame_locals = self.frame.locals() + frame_locals_list = [] + if frame_locals != None: + for frame_local in frame_locals: + value = frame_local.value(self.frame) + frame_locals_list.append((frame_local, value)) + + return frame_locals_list + + def line (self): + sal = self.frame.find_sal() + if (sal): + return sal.line + else: + return "" + + def inferior_frame (self): + return self.frame diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py new file mode 100644 index 0000000..a82e495 --- /dev/null +++ b/gdb/python/lib/gdb/__init__.py @@ -0,0 +1,41 @@ +# Copyright (C) 2010-2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import traceback + +# Auto-load all functions/commands. + +# Modules to auto-load, and the paths where those modules exist. + +module_dict = { + 'gdb.function': os.path.join(gdb.PYTHONDIR, 'gdb', 'function'), + 'gdb.command': os.path.join(gdb.PYTHONDIR, 'gdb', 'command') +} + +# Iterate the dictionary, collating the Python files in each module +# path. Construct the module name, and import. + +for module, location in module_dict.iteritems(): + if os.path.exists(location): + py_files = filter(lambda x: x.endswith('.py') and x != '__init__.py', + os.listdir(location)) + + for py_file in py_files: + # Construct from foo.py, gdb.module.foo + py_file = module + '.' + py_file[:-3] + try: + exec('import ' + py_file) + except: + print >> sys.stderr, traceback.format_exc() diff --git a/gdb/python/lib/gdb/command/__init__.py b/gdb/python/lib/gdb/command/__init__.py new file mode 100644 index 0000000..0eb19f2 --- /dev/null +++ b/gdb/python/lib/gdb/command/__init__.py @@ -0,0 +1,16 @@ +# Copyright (C) 2010-2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + diff --git a/gdb/python/lib/gdb/command/explore.py b/gdb/python/lib/gdb/command/explore.py new file mode 100644 index 0000000..aad3671 --- /dev/null +++ b/gdb/python/lib/gdb/command/explore.py @@ -0,0 +1,755 @@ +# GDB 'explore' command. +# Copyright (C) 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""Implementation of the GDB 'explore' command using the GDB Python API.""" + +import gdb + +class Explorer(object): + """Internal class which invokes other explorers.""" + + # This map is filled by the Explorer.init_env() function + type_code_to_explorer_map = { } + + _SCALAR_TYPE_LIST = ( + gdb.TYPE_CODE_CHAR, + gdb.TYPE_CODE_INT, + gdb.TYPE_CODE_BOOL, + gdb.TYPE_CODE_FLT, + gdb.TYPE_CODE_VOID, + gdb.TYPE_CODE_ENUM, + ) + + @staticmethod + def guard_expr(expr): + length = len(expr) + guard = False + + if expr[0] == '(' and expr[length-1] == ')': + pass + else: + i = 0 + while i < length: + c = expr[i] + if (c == '_' or ('a' <= c and c <= 'z') or + ('A' <= c and c <= 'Z') or ('0' <= c and c <= '9')): + pass + else: + guard = True + break + i += 1 + + if guard: + return "(" + expr + ")" + else: + return expr + + @staticmethod + def explore_expr(expr, value, is_child): + """Main function to explore an expression value. + + Arguments: + expr: The expression string that is being explored. + value: The gdb.Value value of the expression. + is_child: Boolean value to indicate if the expression is a child. + An expression is a child if it is derived from the main + expression entered by the user. For example, if the user + entered an expression which evaluates to a struct, then + when exploring the fields of the struct, is_child is set + to True internally. + + Returns: + No return value. + """ + type_code = value.type.code + if type_code in Explorer.type_code_to_explorer_map: + explorer_class = Explorer.type_code_to_explorer_map[type_code] + while explorer_class.explore_expr(expr, value, is_child): + pass + else: + print ("Explorer for type '%s' not yet available.\n" % + str(value.type)) + + @staticmethod + def explore_type(name, datatype, is_child): + """Main function to explore a data type. + + Arguments: + name: The string representing the path to the data type being + explored. + datatype: The gdb.Type value of the data type being explored. + is_child: Boolean value to indicate if the name is a child. + A name is a child if it is derived from the main name + entered by the user. For example, if the user entered + the name of struct type, then when exploring the fields + of the struct, is_child is set to True internally. + + Returns: + No return value. + """ + type_code = datatype.code + if type_code in Explorer.type_code_to_explorer_map: + explorer_class = Explorer.type_code_to_explorer_map[type_code] + while explorer_class.explore_type(name, datatype, is_child): + pass + else: + print ("Explorer for type '%s' not yet available.\n" % + str(datatype)) + + @staticmethod + def init_env(): + """Initializes the Explorer environment. + This function should be invoked before starting any exploration. If + invoked before an exploration, it need not be invoked for subsequent + explorations. + """ + Explorer.type_code_to_explorer_map = { + gdb.TYPE_CODE_CHAR : ScalarExplorer, + gdb.TYPE_CODE_INT : ScalarExplorer, + gdb.TYPE_CODE_BOOL : ScalarExplorer, + gdb.TYPE_CODE_FLT : ScalarExplorer, + gdb.TYPE_CODE_VOID : ScalarExplorer, + gdb.TYPE_CODE_ENUM : ScalarExplorer, + gdb.TYPE_CODE_STRUCT : CompoundExplorer, + gdb.TYPE_CODE_UNION : CompoundExplorer, + gdb.TYPE_CODE_PTR : PointerExplorer, + gdb.TYPE_CODE_REF : ReferenceExplorer, + gdb.TYPE_CODE_TYPEDEF : TypedefExplorer, + gdb.TYPE_CODE_ARRAY : ArrayExplorer + } + + @staticmethod + def is_scalar_type(type): + """Checks whether a type is a scalar type. + A type is a scalar type of its type is + gdb.TYPE_CODE_CHAR or + gdb.TYPE_CODE_INT or + gdb.TYPE_CODE_BOOL or + gdb.TYPE_CODE_FLT or + gdb.TYPE_CODE_VOID or + gdb.TYPE_CODE_ENUM. + + Arguments: + type: The type to be checked. + + Returns: + 'True' if 'type' is a scalar type. 'False' otherwise. + """ + return type.code in Explorer._SCALAR_TYPE_LIST + + @staticmethod + def return_to_parent_value(): + """A utility function which prints that the current exploration session + is returning to the parent value. Useful when exploring values. + """ + print "\nReturning to parent value...\n" + + @staticmethod + def return_to_parent_value_prompt(): + """A utility function which prompts the user to press the 'enter' key + so that the exploration session can shift back to the parent value. + Useful when exploring values. + """ + raw_input("\nPress enter to return to parent value: ") + + @staticmethod + def return_to_enclosing_type(): + """A utility function which prints that the current exploration session + is returning to the enclosing type. Useful when exploring types. + """ + print "\nReturning to enclosing type...\n" + + @staticmethod + def return_to_enclosing_type_prompt(): + """A utility function which prompts the user to press the 'enter' key + so that the exploration session can shift back to the enclosing type. + Useful when exploring types. + """ + raw_input("\nPress enter to return to enclosing type: ") + + +class ScalarExplorer(object): + """Internal class used to explore scalar values.""" + + @staticmethod + def explore_expr(expr, value, is_child): + """Function to explore scalar values. + See Explorer.explore_expr and Explorer.is_scalar_type for more + information. + """ + print ("'%s' is a scalar value of type '%s'." % + (expr, value.type)) + print "%s = %s" % (expr, str(value)) + + if is_child: + Explorer.return_to_parent_value_prompt() + Explorer.return_to_parent_value() + + return False + + @staticmethod + def explore_type(name, datatype, is_child): + """Function to explore scalar types. + See Explorer.explore_type and Explorer.is_scalar_type for more + information. + """ + if datatype.code == gdb.TYPE_CODE_ENUM: + if is_child: + print ("%s is of an enumerated type '%s'." % + (name, str(datatype))) + else: + print "'%s' is an enumerated type." % name + else: + if is_child: + print ("%s is of a scalar type '%s'." % + (name, str(datatype))) + else: + print "'%s' is a scalar type." % name + + if is_child: + Explorer.return_to_enclosing_type_prompt() + Explorer.return_to_enclosing_type() + + return False + + +class PointerExplorer(object): + """Internal class used to explore pointer values.""" + + @staticmethod + def explore_expr(expr, value, is_child): + """Function to explore pointer values. + See Explorer.explore_expr for more information. + """ + print ("'%s' is a pointer to a value of type '%s'" % + (expr, str(value.type.target()))) + option = raw_input("Continue exploring it as a pointer to a single " + "value [y/n]: ") + if option == "y": + deref_value = None + try: + deref_value = value.dereference() + str(deref_value) + except gdb.MemoryError: + print ("'%s' a pointer pointing to an invalid memory " + "location." % expr) + if is_child: + Explorer.return_to_parent_value_prompt() + return False + Explorer.explore_expr("*%s" % Explorer.guard_expr(expr), + deref_value, is_child) + return False + + option = raw_input("Continue exploring it as a pointer to an " + "array [y/n]: ") + if option == "y": + while True: + index = 0 + try: + index = int(raw_input("Enter the index of the element you " + "want to explore in '%s': " % expr)) + except ValueError: + break + element_expr = "%s[%d]" % (Explorer.guard_expr(expr), index) + element = value[index] + try: + str(element) + except gdb.MemoryError: + print "Cannot read value at index %d." % index + continue + Explorer.explore_expr(element_expr, element, True) + return False + + if is_child: + Explorer.return_to_parent_value() + return False + + @staticmethod + def explore_type(name, datatype, is_child): + """Function to explore pointer types. + See Explorer.explore_type for more information. + """ + target_type = datatype.target() + print ("\n%s is a pointer to a value of type '%s'." % + (name, str(target_type))) + + Explorer.explore_type("the pointee type of %s" % name, + target_type, + is_child) + return False + + +class ReferenceExplorer(object): + """Internal class used to explore reference (TYPE_CODE_REF) values.""" + + @staticmethod + def explore_expr(expr, value, is_child): + """Function to explore array values. + See Explorer.explore_expr for more information. + """ + referenced_value = value.referenced_value() + Explorer.explore_expr(expr, referenced_value, is_child) + return False + + @staticmethod + def explore_type(name, datatype, is_child): + """Function to explore pointer types. + See Explorer.explore_type for more information. + """ + target_type = datatype.target() + Explorer.explore_type(name, target_type, is_child) + return False + + +class ArrayExplorer(object): + """Internal class used to explore arrays.""" + + @staticmethod + def explore_expr(expr, value, is_child): + """Function to explore array values. + See Explorer.explore_expr for more information. + """ + target_type = value.type.target() + print ("'%s' is an array of '%s'." % (expr, str(target_type))) + index = 0 + try: + index = int(raw_input("Enter the index of the element you want to " + "explore in '%s': " % expr)) + except ValueError: + if is_child: + Explorer.return_to_parent_value() + return False + + element = None + try: + element = value[index] hooks/post-receive -- Repository for Project Archer.