public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-pmuldoon-python-backtrace: Account for set print frame-arguments none. Fix several bugs relating to printing frame variables.
@ 2012-09-05 15:56 pmuldoon
0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-09-05 15:56 UTC (permalink / raw)
To: archer-commits
The branch, archer-pmuldoon-python-backtrace has been updated
via 4682515b26543db5b2319e75b64a0c404a054629 (commit)
from a55f52d41be94f4da9b701175aa4d14e1175be21 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 4682515b26543db5b2319e75b64a0c404a054629
Author: Phil Muldoon <pmuldoon@redhat.com>
Date: Wed Sep 5 16:56:12 2012 +0100
Account for set print frame-arguments none. Fix several bugs relating
to printing frame variables.
-----------------------------------------------------------------------
Summary of changes:
gdb/python/lib/gdb/BaseFrameWrapper.py | 75 +++++++++++++++++++++++++------
gdb/python/py-framefilter.c | 77 +++++++++++++++++++++++++++----
2 files changed, 128 insertions(+), 24 deletions(-)
First 500 lines of diff:
diff --git a/gdb/python/lib/gdb/BaseFrameWrapper.py b/gdb/python/lib/gdb/BaseFrameWrapper.py
index aa49ad1..0ddeb55 100644
--- a/gdb/python/lib/gdb/BaseFrameWrapper.py
+++ b/gdb/python/lib/gdb/BaseFrameWrapper.py
@@ -27,6 +27,20 @@ class BaseFrameWrapper (FrameWrapper):
super(BaseFrameWrapper, self).__init__(base)
self.base = base
+ # Determine if this a library or limited frame
+ frame = self.inferior_frame()
+
+ def is_limited_frame (self, frame):
+ sal = frame.find_sal()
+
+ if (not sal.symtab or not sal.symtab.filename
+ or frame == gdb.DUMMY_FRAME
+ or frame == gdb.SIGTRAMP_FRAME):
+
+ return True
+
+ return False
+
def elided (self):
if hasattr(self.base, "elided"):
return self.base.elided()
@@ -34,14 +48,32 @@ class BaseFrameWrapper (FrameWrapper):
return None
def function (self):
- if hasattr(self.base, "function"):
- return str(self.base.function())
-
- fname = str (self.base.function())
- if (fname == ""):
- return None
+ # As this is the base wrapper, "base" can either be a gdb.Frame,
+ # or a another frame wrapper object (another filter may extend
+ # this object, but not implement "function". So in this case
+ # we must instance check what "base" is, as later there is
+ # some work to be done on solib names.
+ if isinstance(self.base, gdb.Frame):
+ name = self.base.name()
else:
- return fname
+ if hasattr(self.base, "function"):
+ return str(self.base.function())
+
+ frame = self.inferior_frame()
+
+ if frame == gdb.DUMMY_FRAME:
+ return "<function called from gdb>"
+ elif frame == gdb.SIGTRAMP_FRAME:
+ return "<signal handler called>"
+
+ sal = frame.find_sal ()
+ pc = frame.pc ()
+
+ if not name and not sal.symtab:
+ unknown = format (" 0x%08x in" % pc)
+ return unknown
+
+ return name
def address (self):
if hasattr(self.base, "address"):
@@ -54,15 +86,19 @@ class BaseFrameWrapper (FrameWrapper):
return self.base.filename()
sal = self.base.find_sal()
- if (sal):
- return sal.symtab.filename
+ if (not sal.symtab or not sal.symtab.filename):
+ pc = self.inferior_frame().pc()
+ return gdb.solib_name (pc)
else:
- return None
+ return sal.symtab.filename
def frame_args (self):
if hasattr(self.base, "frame_args"):
return self.base.frame_args()
+ if self.is_limited_frame (self.base):
+ return None
+
args = FrameVars (self.base)
return args.fetch_frame_args()
@@ -70,6 +106,9 @@ class BaseFrameWrapper (FrameWrapper):
if hasattr(self.base, "frame_locals"):
return self.base.frame_locals()
+ if self.is_limited_frame (self.base):
+ return None
+
args = FrameVars (self.base)
return args.fetch_frame_locals()
@@ -77,6 +116,9 @@ class BaseFrameWrapper (FrameWrapper):
if hasattr(self.base, "line"):
return self.base.line()
+ if self.is_limited_frame (self.base):
+ return None
+
sal = self.base.find_sal()
if (sal):
return sal.line
@@ -127,7 +169,10 @@ class FrameVars ():
def fetch_frame_locals (self):
lvars = []
- block = self.frame.block()
+ try:
+ block = self.frame.block()
+ except:
+ return None
for sym in block:
if sym.is_argument:
@@ -142,13 +187,15 @@ class FrameVars ():
def fetch_frame_args (self):
args = []
- block = self.frame.block()
+ try:
+ block = self.frame.block()
+ except:
+ return None
for sym in block:
if not sym.is_argument:
continue;
- if self.fetch_b (sym):
- args.append(BaseSymValueWrapper(sym,None))
+ args.append(BaseSymValueWrapper(sym,None))
if len(args) == 0:
return None
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 65bb62b..31384f8 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -153,6 +153,42 @@ extract_value (PyObject *obj, struct value **value)
return 1;
}
+static int
+mi_should_print (struct symbol *sym, const char *type)
+{
+ int print_me = 0;
+
+ switch (SYMBOL_CLASS (sym))
+ {
+ default:
+ case LOC_UNDEF: /* catches errors */
+ case LOC_CONST: /* constant */
+ case LOC_TYPEDEF: /* local typedef */
+ case LOC_LABEL: /* local label */
+ case LOC_BLOCK: /* local function */
+ case LOC_CONST_BYTES: /* loc. byte seq. */
+ case LOC_UNRESOLVED: /* unresolved static */
+ case LOC_OPTIMIZED_OUT: /* optimized out */
+ print_me = 0;
+ break;
+
+ case LOC_ARG: /* argument */
+ case LOC_REF_ARG: /* reference arg */
+ case LOC_REGPARM_ADDR: /* indirect register arg */
+ case LOC_LOCAL: /* stack local */
+ case LOC_STATIC: /* static */
+ case LOC_REGISTER: /* register */
+ case LOC_COMPUTED: /* computed location */
+ if (strcmp (type, "all"))
+ print_me = 1;
+ else if (strcmp (type, "locals"))
+ print_me = !SYMBOL_IS_ARGUMENT (sym);
+ else
+ print_me = SYMBOL_IS_ARGUMENT (sym);
+ }
+ return print_me;
+}
+
/* Helper function which outputs a type name to a "type" field in a
stream. OUT is the ui-out structure the type name will be output
too, and VAL is the value that the type will be extracted from.
@@ -315,6 +351,7 @@ py_print_single_arg (struct ui_out *out,
struct value_print_options opts,
int mi_print_type,
int print_mi_args_flag,
+ const char *cli_print_frame_args_type,
const struct language_defn *language)
{
struct value *val;
@@ -389,15 +426,26 @@ py_print_single_arg (struct ui_out *out,
annotate_arg_value (value_type (val));
- /* If CLI, always print values. For MI do not print values if the
- enumerator is PRINT_NO_VALUES. */
+ /* If the output is to the CLI, and the user option set print
+ frame-arguments is set to none, just output "...". */
if (! ui_out_is_mi_like_p (out)
- || (ui_out_is_mi_like_p (out)
- && mi_print_type != PRINT_NO_VALUES))
- {
+ && ! strcmp (cli_print_frame_args_type, "none"))
- if (! py_print_value (out, val, opts, mi_print_type, language))
- goto error;
+ {
+ ui_out_field_string (out, "value", "...");
+ }
+ else
+ {
+ /* If CLI, and the first if condition above not true always
+ print values. For MI do not print values if the enumerator
+ is PRINT_NO_VALUES. */
+ if (! ui_out_is_mi_like_p (out)
+ || (ui_out_is_mi_like_p (out)
+ && mi_print_type != PRINT_NO_VALUES))
+ {
+ if (! py_print_value (out, val, opts, mi_print_type, language))
+ goto error;
+ }
}
do_cleanups (inner_cleanup);
@@ -481,6 +529,9 @@ enumerate_args (PyObject *iter,
Py_DECREF (item);
item = NULL;
+ if (sym && ui_out_is_mi_like_p (out) && ! mi_should_print (sym, "args"))
+ continue;
+
/* If the object did not provide a value, read it using
read_frame_args and account for entry values, if any. */
if (! val)
@@ -516,7 +567,8 @@ enumerate_args (PyObject *iter,
if (arg.entry_kind != print_entry_values_only)
py_print_single_arg (out, NULL, &arg, NULL, opts,
mi_print_type,
- print_mi_args_flag, NULL);
+ print_mi_args_flag,
+ cli_print_frame_args_type, NULL);
if (entryarg.entry_kind != print_entry_values_no)
{
@@ -528,7 +580,8 @@ enumerate_args (PyObject *iter,
py_print_single_arg (out, NULL, &entryarg, NULL, opts,
mi_print_type,
- print_mi_args_flag, NULL);
+ print_mi_args_flag,
+ cli_print_frame_args_type, NULL);
}
xfree (arg.error);
@@ -540,7 +593,9 @@ enumerate_args (PyObject *iter,
if (val)
py_print_single_arg (out, sym_name, NULL, val, opts,
mi_print_type,
- print_mi_args_flag, language);
+ print_mi_args_flag,
+ cli_print_frame_args_type,
+ language);
}
xfree (sym_name);
@@ -617,6 +672,8 @@ enumerate_locals (PyObject *iter,
Py_DECREF (item);
+ if (sym && ui_out_is_mi_like_p (out) && ! mi_should_print (sym, "locals"))
+ continue;
/* If the object did not provide a value, read it. */
if (! val)
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-09-05 15:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-05 15:56 [SCM] archer-pmuldoon-python-backtrace: Account for set print frame-arguments none. Fix several bugs relating to printing frame variables 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).