如何在gdb中转储STL容器数据?

时间:2017-05-05 14:46:35

标签: c++ stl gdb containers

我无法在gdb中转储STL无序映射容器值。变量类型是 的std :: unordered_map<>变种;

我的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> > >

5 个答案:

答案 0 :(得分:4)

您的gdb --configuration输出缺少--with-python子句,因此我假设您的gdb确实无法使用python扩展。根据这个SO答案gdb pretty printing is not working,似乎有必要使用漂亮的印刷品。

我在Docker中的ubuntu 14.04带有漂亮的打印功能,而gdb也是使用--with-python配置的。看来,你的gdb安装是以某种方式定制的。您可以使用正确的选项从源代码重新编译gdb,也可以尝试从分发包中清除重新安装gdb。

答案 1 :(得分:4)

尝试查看此内容: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软件包,可以尝试安装以下软件包以添加对&#34; STL漂亮打印&#34; <的支持/ em>:libstdc++6-4.8-dbg
有了这个更新,gdb应该自动支持STL容器的漂亮打印。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我的猜测是你的系统中安装了2个gdb二进制文件:

  • Ubuntu 14.04附带的那个
  • 你自己建造的那个

根据--with-python输出,您自己构建的那个不支持python pretty打印机,因为它没有配置gdb --configure选项。在命令提示符下键入gdb时,将调用此gdb二进制文件。

但是应该从Ubuntu dpkg包中安装另一个二进制文件。它应位于/usr/bin/gdb,并应支持漂亮的打印。尝试使用完整路径调用它:

/usr/bin/gdb

答案 4 :(得分:0)

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