mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
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.
This commit is contained in:
@ -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>
|
2016-07-07 Walfred Tedeschi <walfred.tedeschi@intel.com>
|
||||||
|
|
||||||
* cp-namespace.c (cp_lookup_bare_symbol): Initialize
|
* cp-namespace.c (cp_lookup_bare_symbol): Initialize
|
||||||
|
@ -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>
|
2016-06-21 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* gdb.texinfo (Interpreters): Update intepreter-exec section,
|
* gdb.texinfo (Interpreters): Update intepreter-exec section,
|
||||||
|
@ -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).
|
@code{unwind_stop_reason} method further down in this section).
|
||||||
@end defun
|
@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:
|
A @code{gdb.Frame} object has the following methods:
|
||||||
|
|
||||||
@defun Frame.is_valid ()
|
@defun Frame.is_valid ()
|
||||||
|
@ -136,6 +136,8 @@ def do_enable_unwinder(arg, flag):
|
|||||||
if locus_re.match(objfile.filename):
|
if locus_re.match(objfile.filename):
|
||||||
total += do_enable_unwinder1(objfile.frame_unwinders, name_re,
|
total += do_enable_unwinder1(objfile.frame_unwinders, name_re,
|
||||||
flag)
|
flag)
|
||||||
|
if total > 0:
|
||||||
|
gdb.invalidate_cached_frames()
|
||||||
print("%d unwinder%s %s" % (total, "" if total == 1 else "s",
|
print("%d unwinder%s %s" % (total, "" if total == 1 else "s",
|
||||||
"enabled" if flag else "disabled"))
|
"enabled" if flag else "disabled"))
|
||||||
|
|
||||||
|
@ -92,3 +92,4 @@ def register_unwinder(locus, unwinder, replace=False):
|
|||||||
unwinder.name)
|
unwinder.name)
|
||||||
i += 1
|
i += 1
|
||||||
locus.frame_unwinders.insert(0, unwinder)
|
locus.frame_unwinders.insert(0, unwinder)
|
||||||
|
gdb.invalidate_cached_frames()
|
||||||
|
@ -885,6 +885,15 @@ gdbpy_find_pc_line (PyObject *self, PyObject *args)
|
|||||||
return result;
|
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.
|
/* Read a file as Python code.
|
||||||
This is the extension_language_script_ops.script_sourcer "method".
|
This is the extension_language_script_ops.script_sourcer "method".
|
||||||
FILE is the file to load. FILENAME is name of the file FILE.
|
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", gdbpy_inferiors, METH_NOARGS,
|
||||||
"inferiors () -> (gdb.Inferior, ...).\n\
|
"inferiors () -> (gdb.Inferior, ...).\n\
|
||||||
Return a tuple containing all inferiors." },
|
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}
|
{NULL, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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>
|
2016-07-12 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
* lib/selftest-support.exp (selftest_setup): Match the output
|
* lib/selftest-support.exp (selftest_setup): Match the output
|
||||||
|
@ -34,7 +34,11 @@ if ![runto_main ] then {
|
|||||||
return -1
|
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" {
|
gdb_test_sequence "info unwinder" "Show all unwinders" {
|
||||||
"Global:"
|
"Global:"
|
||||||
@ -50,7 +54,10 @@ gdb_test_sequence "continue" "Unwinders called" {
|
|||||||
"global_unwinder 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" {
|
gdb_test_sequence "info unwinder" "Show with global unwinder disabled" {
|
||||||
"Global:"
|
"Global:"
|
||||||
|
Reference in New Issue
Block a user