Jan*_*Jan 5 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;
};
}
Run Code Online (Sandbox Code Playgroud)
当我在gdb中调试时,我想查看_db_internal容器,但不知道如何访问它。
我试着用gdb编写:
p 'test::DB<std::string, someclass*, std::tr1::unordered_map< std::string, someclass* > >::instance()::_instance'._db_internal
Run Code Online (Sandbox Code Playgroud)
它给我:在当前情况下没有符号...
也尝试没有单引号但没有运气。
如何在gdb中打印该容器?我正在使用gdb版本:7.6.1
谢谢
正如使用gdb自动完成功能所建议的那样,我能够获得以下信息:
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'
Run Code Online (Sandbox Code Playgroud)
但这给了我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'
Run Code Online (Sandbox Code Playgroud)
我也收到一条错误消息:
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.
Run Code Online (Sandbox Code Playgroud)
但这给了我 0 这不好
这似乎是 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
Run Code Online (Sandbox Code Playgroud)
那重现了你的行为。让我们找出_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
Run Code Online (Sandbox Code Playgroud)
...并将地址解释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>
Run Code Online (Sandbox Code Playgroud)
最后我们可以取消引用它:
(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}}}}
Run Code Online (Sandbox Code Playgroud)
PS我用作<int,int>实例,因为我必须将您的代码片段完成为我可以编译和运行的程序。(你应该提供一个完整的程序,但没有)。