Hi, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68448 https://bugzilla.redhat.com/show_bug.cgi?id=1279406
echo -e '#include <vector>\nint main(){std::vector<int> l;\nreturn 0;}'|g++ -g -Wall -x c++ -;gdb -q ./a.out -batch -ex 'b 3' -ex r -ex 'p l' -ex r -ex 'p l' Actual: [...] $1 = std::vector of length 0, capacity 0 [...] $2 = {<std::_Vector_base<int, std::allocator<int> >> = {_M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>} Expected: [...] $1 = std::vector of length 0, capacity 0 [...] $2 = std::vector of length 0, capacity 0 Thanks, Jan
* python/hook.in: Call register_libstdcxx_printers. * python/libstdcxx/v6/__init__.py: Wrap it to register_libstdcxx_printers. diff --git a/libstdc++-v3/python/hook.in b/libstdc++-v3/python/hook.in index 07fe4c6..703b6a7 100644 --- a/libstdc++-v3/python/hook.in +++ b/libstdc++-v3/python/hook.in @@ -55,4 +55,7 @@ if gdb.current_objfile () is not None: if not dir_ in sys.path: sys.path.insert(0, dir_) -import libstdcxx.v6 +# Call a function as a plain import would not execute body of the included file +# on repeated reloads of this object file. +from libstdcxx.v6 import register_libstdcxx_printers +register_libstdcxx_printers(gdb.current_objfile()) diff --git a/libstdc++-v3/python/libstdcxx/v6/__init__.py b/libstdc++-v3/python/libstdcxx/v6/__init__.py index de3aa72..d8e060c 100644 --- a/libstdc++-v3/python/libstdcxx/v6/__init__.py +++ b/libstdc++-v3/python/libstdcxx/v6/__init__.py @@ -15,10 +15,6 @@ import gdb -# Load the pretty-printers. -from .printers import register_libstdcxx_printers -register_libstdcxx_printers(gdb.current_objfile()) - # Load the xmethods if GDB supports them. def gdb_has_xmethods(): try: @@ -27,6 +23,11 @@ def gdb_has_xmethods(): except ImportError: return False -if gdb_has_xmethods(): - from .xmethods import register_libstdcxx_xmethods - register_libstdcxx_xmethods(gdb.current_objfile()) +def register_libstdcxx_printers(obj): + # Load the pretty-printers. + from .printers import register_libstdcxx_printers + register_libstdcxx_printers(obj) + + if gdb_has_xmethods(): + from .xmethods import register_libstdcxx_xmethods + register_libstdcxx_xmethods(obj)