diff options
author | Tom Tromey <tom@tromey.com> | 2016-06-09 15:20:09 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2016-07-12 13:56:07 -0600 |
commit | e0f3fd7c44cebec7d787893b9c800e7de509cb32 (patch) | |
tree | 482011f3bd7e241f048825d653d56f2ab45a4cd5 | |
parent | cf143069f39b4feeeca175f88b6d1a5c1cb0fee4 (diff) | |
download | gdb-e0f3fd7c44cebec7d787893b9c800e7de509cb32.zip gdb-e0f3fd7c44cebec7d787893b9c800e7de509cb32.tar.gz gdb-e0f3fd7c44cebec7d787893b9c800e7de509cb32.tar.bz2 |
PR python/19293 - invalidate frame cache when unwinders change
PR python/19293 notes that when a Python unwinder is disabled, the
frame cache is not invalidated. This means that disabling an unwinder
doesn't have any immediate effect -- but in my experience it's often
the case that I want to enable or disable an unwinder in order to see
what happens.
This patch adds a new gdb.invalidate_cached_frames function and
arranges for the relevant bits of library code to call it. I've only
partially documented this function, considering a warning sufficient
without going into all the reasons ordinary code should not call it.
The name of the new function was taken from a comment in frame.h next
to reinit_frame_cache.
No new test as I think the updates to the existing test are sufficient
to show that the code is working as intended.
Built and regtested on x86-64 Fedora 23.
2016-07-12 Tom Tromey <tom@tromey.com>
PR python/19293:
* python/lib/gdb/command/unwinders.py (do_enable_unwinder): Call
gdb.invalidate_cached_frames.
* python/lib/gdb/unwinder.py (register_unwinder): Call
gdb.invalidate_cached_frames.
* python/python.c (gdbpy_invalidate_cached_frames): New function.
(python_GdbMethods): Add entry for invalidate_cached_frames.
2016-07-12 Tom Tromey <tom@tromey.com>
PR python/19293:
* python.texi (Frames In Python): Document
gdb.invalidate_cached_frames.
2016-07-12 Tom Tromey <tom@tromey.com>
PR python/19293:
* gdb.python/py-unwind-maint.exp: Update tests.
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/python.texi | 9 | ||||
-rw-r--r-- | gdb/python/lib/gdb/command/unwinders.py | 2 | ||||
-rw-r--r-- | gdb/python/lib/gdb/unwinder.py | 1 | ||||
-rw-r--r-- | gdb/python/python.c | 15 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-unwind-maint.exp | 11 |
8 files changed, 57 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 92c1337..4139a29 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2016-07-12 Tom Tromey <tom@tromey.com> + + PR python/19293: + * python/lib/gdb/command/unwinders.py (do_enable_unwinder): Call + gdb.invalidate_cached_frames. + * python/lib/gdb/unwinder.py (register_unwinder): Call + gdb.invalidate_cached_frames. + * python/python.c (gdbpy_invalidate_cached_frames): New function. + (python_GdbMethods): Add entry for invalidate_cached_frames. + 2016-07-07 Walfred Tedeschi <walfred.tedeschi@intel.com> * cp-namespace.c (cp_lookup_bare_symbol): Initialize diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 3186ff2..385ca41 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2016-07-12 Tom Tromey <tom@tromey.com> + + PR python/19293: + * python.texi (Frames In Python): Document + gdb.invalidate_cached_frames. + 2016-06-21 Pedro Alves <palves@redhat.com> * gdb.texinfo (Interpreters): Update intepreter-exec section, diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 6623d8e..f218ad6 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3838,6 +3838,15 @@ frames, as expressed by the given @var{reason} code (an integer, see the @code{unwind_stop_reason} method further down in this section). @end defun +@findex gdb.invalidate_cached_frames +@defun gdb.invalidate_cached_frames +@value{GDBN} internally keeps a cache of the frames that have been +unwound. This function invalidates this cache. + +This function should not generally be called by ordinary Python code. +It is documented for the sake of completeness. +@end defun + A @code{gdb.Frame} object has the following methods: @defun Frame.is_valid () diff --git a/gdb/python/lib/gdb/command/unwinders.py b/gdb/python/lib/gdb/command/unwinders.py index a9b9d8a..8fd0136 100644 --- a/gdb/python/lib/gdb/command/unwinders.py +++ b/gdb/python/lib/gdb/command/unwinders.py @@ -136,6 +136,8 @@ def do_enable_unwinder(arg, flag): if locus_re.match(objfile.filename): total += do_enable_unwinder1(objfile.frame_unwinders, name_re, flag) + if total > 0: + gdb.invalidate_cached_frames() print("%d unwinder%s %s" % (total, "" if total == 1 else "s", "enabled" if flag else "disabled")) diff --git a/gdb/python/lib/gdb/unwinder.py b/gdb/python/lib/gdb/unwinder.py index 14b2758..67a37cb 100644 --- a/gdb/python/lib/gdb/unwinder.py +++ b/gdb/python/lib/gdb/unwinder.py @@ -92,3 +92,4 @@ def register_unwinder(locus, unwinder, replace=False): unwinder.name) i += 1 locus.frame_unwinders.insert(0, unwinder) + gdb.invalidate_cached_frames() diff --git a/gdb/python/python.c b/gdb/python/python.c index 3a272a9..621e201 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -885,6 +885,15 @@ gdbpy_find_pc_line (PyObject *self, PyObject *args) return result; } +/* Implementation of gdb.invalidate_cached_frames. */ + +static PyObject * +gdbpy_invalidate_cached_frames (PyObject *self, PyObject *args) +{ + reinit_frame_cache (); + Py_RETURN_NONE; +} + /* Read a file as Python code. This is the extension_language_script_ops.script_sourcer "method". FILE is the file to load. FILENAME is name of the file FILE. @@ -2071,6 +2080,12 @@ Return the selected inferior object." }, { "inferiors", gdbpy_inferiors, METH_NOARGS, "inferiors () -> (gdb.Inferior, ...).\n\ Return a tuple containing all inferiors." }, + + { "invalidate_cached_frames", gdbpy_invalidate_cached_frames, METH_NOARGS, + "invalidate_cached_frames () -> None.\n\ +Invalidate any cached frame objects in gdb.\n\ +Intended for internal use only." }, + {NULL, NULL, 0, NULL} }; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a83c9f8..851487f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-12 Tom Tromey <tom@tromey.com> + + PR python/19293: + * gdb.python/py-unwind-maint.exp: Update tests. + 2016-07-12 Yao Qi <yao.qi@linaro.org> * lib/selftest-support.exp (selftest_setup): Match the output diff --git a/gdb/testsuite/gdb.python/py-unwind-maint.exp b/gdb/testsuite/gdb.python/py-unwind-maint.exp index e89d284..3a98cb1 100644 --- a/gdb/testsuite/gdb.python/py-unwind-maint.exp +++ b/gdb/testsuite/gdb.python/py-unwind-maint.exp @@ -34,7 +34,11 @@ if ![runto_main ] then { return -1 } -gdb_test "source ${pyfile}" "Python script imported" "import python scripts" +gdb_test_sequence "source ${pyfile}" "import python scripts" { + "Python script imported" + "py_unwind_maint_ps_unwinder called" + "global_unwinder called" +} gdb_test_sequence "info unwinder" "Show all unwinders" { "Global:" @@ -50,7 +54,10 @@ gdb_test_sequence "continue" "Unwinders called" { "global_unwinder called" } -gdb_test "disable unwinder global .*" "1 unwinder disabled" "Unwinder disabled" +gdb_test_sequence "disable unwinder global .*" "Unwinder disabled" { + "1 unwinder disabled" + "py_unwind_maint_ps_unwinder called" +} gdb_test_sequence "info unwinder" "Show with global unwinder disabled" { "Global:" |