[英]How to dump STL container data in gdb?
我无法在gdb中转储STL无序映射容器值。 变量类型是std :: unordered_map <> var;
我的gdb版本 - 7.7.1 Gdb配置:
configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-auto-load-dir=$debugdir:$datadir/auto-load
--with-auto-load-safe-path=$debugdir:$datadir/auto-load
--with-expat
--with-gdb-datadir=/usr/local/share/gdb (relocatable)
--with-jit-reader-dir=/usr/local/lib/gdb (relocatable)
--without-libunwind-ia64
--with-lzma
--with-separate-debug-dir=/usr/local/lib/debug (relocatable)
--with-system-gdbinit=/etc/gdb/gdbinit
--with-zlib
--without-babeltrace
g ++(Ubuntu 4.8.4-2ubuntu1~14.04.3)4.8.4
什么是打印STL容器值n gdb的正确方法?
地图容器的gdb输出:
p var
$3 = {<std::__allow_copy_cons<true>> = {<No data fields>}, [13/5219]
_M_h = {<std::__detail::_Hashtable_base<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<ch
ar> > const, Metrics_s*>, std::__detail::_Select1st, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::basic_string<char, std::ch
ar_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true> >> = {<std::__detail::
_Hash_code_base<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, Metric
s_s*>, std::__detail::_Select1st, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >
你的gdb --configuration
输出缺少--with-python
子句,所以我假设你的gdb实际上不能使用python扩展。 根据这个SO回答gdb漂亮的打印不起作用似乎有必要漂亮的打印工作。
我的ubuntu 14.04在docker中配备了漂亮的打印工作,并且gdb是使用--with-python配置的。 看来,你的gdb安装是以某种方式定制的。 您可以使用正确的选项从源重新编译gdb,也可以尝试从分发包中清除重新安装gdb。
试试看看: https : //gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python/
并将这些行添加到您的: ~/.gdbinit
python
import sys
sys.path.insert(0, '<Path to SVN Checkout Directory>')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
如果它不起作用,您可以从SVN中检出较旧的版本,该版本更接近您正在使用的GDB版本。
注意:假设您的GDB启用了python后端。
更新:如果您正在使用Ubuntu软件包中的gdb软件包,您可以尝试安装以下软件包以添加对“STL漂亮打印”的支持 : libstdc++6-4.8-dbg
。
有了这个更新,gdb应该自动支持STL容器的漂亮打印。
1)旧版本的gdb不需要Python来打印STL对象。 python的错误与你的配置有关。
gdbinit不是gdb配置
2)有一个解决方案无论如何都可以工作:卸载并重新安装旧的解决方案(在你的发行版上查找stl漂亮的打印包)gdb dbg包也检查你的用户的.bashrc(你可以用gdb做一些你不想要的东西) ),清除它,重新启动终端,它会工作。
注意有最新版本的gdb需要python只有特定的版本和风格 ,它们有很多错误,一些Linux发行版包含它们作为默认值,这是他们的问题,gdb不是一回事 - 它是一个事物树。 确保你得到正确的,我认为它应该与python无关。
下面是描述gdb中引入这个坏主意的链接以及为什么人们似乎喜欢它https://bbs.archlinux.org/viewtopic.php?id=87299
我的猜测是你的系统中安装了2个gdb二进制文件:
根据gdb --configure
输出,你自己构建的那个不支持python pretty打印机,因为它没有配置--with-python
选项。 在命令提示符下键入gdb
时,将调用此gdb二进制文件。
但是应该从Ubuntu dpkg包中安装另一个二进制文件。 它应该位于/usr/bin/gdb
并且应该支持漂亮的打印。 尝试使用完整路径调用它:
/usr/bin/gdb
define dump_map
#arg0 is your unordered map address
set $map = $arg0
set $i = 0
set $itr = $map._M_h._M_buckets[0]->_M_nxt
while $i < $map._M_h._M_element_count
printf "Object name = [ %s ] and Object address = [0x%llx]\n", ((char *)((<give your map name> *)($itr))->_name) , $itr
set $itr = $itr->_M_nxt
set $i = ($i + 1)
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.