2017-04-09 69 views
0

我有一个unordered_map命名节点。它的声明如下:对LLDB中的C++对象的调用方法未能给出结果

unordered_map<T,shared_ptr<Vertex<T>>> nodes 

顶点声明的类如下:

template<typename T> 
struct Vertex { 

    Vertex(T pLabel) : label(pLabel) {}; 

    void addEdge(T destination,int weight) { 
     edges[destination] = weight; 
    } 

    T label; 
    unordered_map<T, int> edges; 
}; 

我有接受顶点如下unoredered_map的方法。

template<typename T> 
void getMinSpanningTree(unordered_map<T,shared_ptr<Vertex<T>>>& nodes, T first, int infinityMarker) { 

    cout << nodes.size() << endl; 

    if(nodes.size() == 0) { 
     return; 
    } 
    ... 
    ... 

当我停止LLDB执行,并键入以下内容:

(lldb) expr nodes.size() 

我得到以下输出:

(lldb) expr nodes.size() 
error: Couldn't lookup symbols: 
    __ZNKSt3__113unordered_mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_10shared_ptrI6VertexIS6_EEENS_4hashIS6_EENS_8equal_toIS6_EENS4_INS_4pairIKS6_SA_EEEEE4sizeEv 

所以,我不知道如何使调试器正确输出答案。标准输出以下行,打印5在输出控制台:

cout << nodes.size() << endl; 

这里,是我如何使用函数和类:

int main(int argc, const char * argv[]) { 

    shared_ptr<Vertex<string>> v1 = make_shared<Vertex<string>>("V1"); 
    shared_ptr<Vertex<string>> v2 = make_shared<Vertex<string>>("V2"); 
    shared_ptr<Vertex<string>> v3 = make_shared<Vertex<string>>("V3"); 
    shared_ptr<Vertex<string>> v4 = make_shared<Vertex<string>>("V4"); 
    shared_ptr<Vertex<string>> v5 = make_shared<Vertex<string>>("V5"); 

    v1->addEdge("V2", 1); 
    v1->addEdge("V3", 3); 

    v2->addEdge("V1", 1); 
    v2->addEdge("V3", 3); 
    v2->addEdge("V4", 6); 

    v3->addEdge("V1", 3); 
    v3->addEdge("V2", 3); 
    v3->addEdge("V4", 4); 
    v3->addEdge("V5", 2); 

    v5->addEdge("V2", 3); 


    unordered_map<string,shared_ptr<Vertex<string>>> vertices; 
    vertices[v1->label] = v1; 
    vertices[v2->label] = v2; 
    vertices[v3->label] = v3; 
    vertices[v4->label] = v4; 
    vertices[v5->label] = v5; 

    getMinSpanningTree(vertices,v1->label,numeric_limits<int>::max()); 

    return 0; 
} 

打印节点,似乎一切都倾倒:

(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > > >) $0 = size=5 { 
    [0] = { 
    __cc = { 
     first = "V5" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208c68 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208c68 
     } 
    } 
    __nc = { 
     first = "V5" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208c68 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208c68 
     } 
    } 
    } 
    [1] = { 
    __cc = { 
     first = "V4" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208748 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208748 
     } 
    } 
    __nc = { 
     first = "V4" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208748 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208748 
     } 
    } 
    } 
    [2] = { 
    __cc = { 
     first = "V2" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208c08 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208c08 
     } 
    } 
    __nc = { 
     first = "V2" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208c08 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208c08 
     } 
    } 
    } 
    [3] = { 
    __cc = { 
     first = "V3" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x00000001002086e8 strong=2 weak=1 { 
     __ptr_ = 0x00000001002086e8 
     } 
    } 
    __nc = { 
     first = "V3" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x00000001002086e8 strong=2 weak=1 { 
     __ptr_ = 0x00000001002086e8 
     } 
    } 
    } 
    [4] = { 
    __cc = { 
     first = "V1" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208ba8 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208ba8 
     } 
    } 
    __nc = { 
     first = "V1" 
     second = std::__1::shared_ptr<Vertex<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::element_type @ 0x0000000100208ba8 strong=2 weak=1 { 
     __ptr_ = 0x0000000100208ba8 
     } 
    } 
    } 
} 
+0

GDB是一个伟大的调试工具,您可以轻松地查找教程或阅读文档 – chbchb55

+0

我的平台是Mac OS X和我使用Xcode。现在默认的调试器是LLDB,它对于swift和Objective-C非常适用。我希望能够有效地调试C++。所以我不想切换到GDB,除非这是我能提高生产力的唯一方法。 – user1044328

+1

[打印/调试libC++ STL与XCode/LLDB]可能的重复(http://stackoverflow.com/questions/39680320/printing-debugging-libc-stl-with-xcode-lldb) – jtbandes

回答

0

我敢肯定这是在jtbandes上面给的链接描述了同样的问题。如果我编译你的榜样,然后执行:

> nm a.out | grep size 
> 

没有匹配,显示出没有生成size功能。请注意,由于编译器通常不会发送模板函数实例,如果代码不使用它们,实际上应该在某处调用“大小”以增加它发出的机会。但即使有这种变化,我仍然看不到这种方法。而是总是使用内联。

调试器几乎没有机会正确调用函数的内联版本。所以在这里帮助你没有多大的帮助。在叮当&上有一个错误,它与STL相关联,在-O0处内联不那么积极。这是解决这个问题的唯一可行方案。

链接问题中建议的解决方法是转发声明该类。然而,我没有任何成功提出通过编译器的这个类的前向声明。也许有人更强大的C++ - 福可以吗?

printframe variable可以看到地图的元素并打印其大小,但是这是通过单独的机制 - “lldb”数据格式化程序完成的。如果您想了解更多关于如何工作的,参考这里:

http://lldb.llvm.org/varformats.html

相关问题