c++ - 从gdb中模板类的成员函数打印静态变量

标签 c++ debugging gcc gdb

我有一个简单的模板类:

namespace test
{

template< class Key, class Value, class Container = std::map< Key, Value > >
class DB
{
public:

    static DB& instance()
    {
        static DB _instance;

        return _instance;
    }
private:
    DB(){};
    DB( DB const& ){};
    void operator=( DB const& ){};

    Container _db_internal;
};
}

当我在 gdb 中调试时,我想查看 _db_internal 容器,但不知道如何访问它。

我试着用 gdb 写:

p 'test::DB<std::string, someclass*, std::tr1::unordered_map< std::string, someclass* > >::instance()::_instance'._db_internal

它给了我:No symbol ... in current context

也尝试过不使用单引号但没有成功。

如何在 gdb 中打印那个容器? 我使用的 gdb 版本:7.6.1

谢谢

按照使用 gdb autocomplete 的建议,我得到了这个:

p 'test::DB<std::string, std::string, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > >::instance()::_instance'

但这给了我 0 这不好

然后如果我尝试:

p 'test::DB<std::string, std::string, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > >::instance()::_instance._db_internal' 

我也收到一条错误消息:

No symbol "test::DB<std::string, std::string, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > >::instance()::_instance._db_internal" in current context.

最佳答案

but that gives me 0 which is not good

这似乎是 GDB 中的一个错误,几天前仍然存在于从 git 构建的 GDB 中。这有效:

(gdb) start
Temporary breakpoint 1 at 0x400865: file foo.cc, line 27.
Starting program: /tmp/a.out 
Temporary breakpoint 1, main () at foo.cc:27
27    auto& db = test::DB<int, int>::instance();
(gdb) n
28    return 0;
(gdb) p 'test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >::instance()::_instance'
$1 = 0

这重现了您的行为。让我们找出_instance在哪里居住地:

(gdb) info var _instance
All variables matching regular expression "_instance":

Non-debugging symbols:
0x0000000000602088  guard variable for test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >::instance()::_instance
0x00000000006020a0  test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >::instance()::_instance

... 并解释地址 0x00000000006020a0作为指向所需类型的指针:

(gdb) p ('test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >' *)0x00000000006020a0
$2 = (test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > > *) 0x6020a0 <test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >::instance()::_instance>

最后我们可以解引用它:

(gdb) p *$
$3 = {_db_internal = {_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<No data fields>}, <No data fields>}, 
        _M_key_compare = {<std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = std::_S_red, _M_parent = 0x0, 
          _M_left = 0x6020a8 <test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >::instance()::_instance+8>, 
          _M_right = 0x6020a8 <test::DB<int, int, std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > > >::instance()::_instance+8>}, _M_node_count = 0}}}}

附言我用了<int,int>例如,因为我必须将你的代码片段完成为一个我可以编译和运行的程序。 (您应该提供了完整的程序,但没有)。

关于c++ - 从gdb中模板类的成员函数打印静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39724087/

相关文章:

c# - 有没有办法检测调试器是否附加到 C# 中的另一个进程?

windows - 使用用户模式转储确定 WinDbg 中的线程等待时间

c - 如何忽略定义指令?

c++ - 如何处理可选参数+可选返回值

c++ - CodeLite 如何构建应用程序?

JAVA - 仅当我使用调试运行它时才会出现异常

c++ - 如何从源代码或库中替换 __ieee754_exp_avx 调用?

gcc - 将两个 GCC 编译的 .o 目标文件合并到第三个 .o 文件中

c++ - C++ 中的 long double 是 IEEE 的 binary128 的实现吗?

c++ - CLang 编译程序 (Mac) 使用 std::cin 读取 double 类型的运行时错误