2013-06-24 23 views
2

GDB 7 STL漂亮的打印機有STL結構http://sourceware.org/gdb/wiki/STLSupport在LLDB

一些有用的python腳本是否有任何類似的工具LLDB? 即使使用簡單的地圖或矢量,所顯示的信息仍然很神祕。

-> 100  h->moveReceivedSummaries(summaries); 
    101  auto res = h->moveReceivedSummaries(); 
    102  EXPECT_TRUE(*summary == *res[1].get()); 
    103 } 
(lldb) p summaries 
(std::__1::map<int, std::__1::unique_ptr<ContextSummary, std::__1::default_delete<ContextSummary> >, std::__1::less<int>, std::__1::allocator<std::__1::pair<const int, std::__1::unique_ptr<ContextSummary, std::__1::default_delete<ContextSummary> > > > >) $0 = size=1 { 
    (std::__1::__tree_node<std::__1::pair<int, std::__1::unique_ptr<ContextSummary, std::__1::default_delete<ContextSummary> > >, void *>::value_type) [0] = { 
    (int) first = 1 
    (std::__1::unique_ptr<ContextSummary, std::__1::default_delete<ContextSummary> >) second = { 
     (std::__1::__compressed_pair<ContextSummary *, std::__1::default_delete<ContextSummary> >) __ptr_ = { 
     (std::__1::__libcpp_compressed_pair_imp<ContextSummary *, std::__1::default_delete<ContextSummary> >) std::__1::__libcpp_compressed_pair_imp<ContextSummary *, std::__1::default_delete<ContextSummary> > = { 
      (ContextSummary *) __first_ = 0x0000000100308390 
     } 
     } 
    } 
    } 
} 

回答

2

我認爲最簡單的辦法,可以只使用Xcode中,當您使用的是Mac OS X.

enter image description here

在LLDB,以下(How can I get sensible variable displays when using libc++ in Xcode 4.3.1?),我試圖從網上下載的python腳本後使用command script import ../libcxx.pythis site

但是,結果是一樣的。

(lldb) p v 
(std::__1::vector<std::__1::unique_ptr<A, std::__1::default_delete<A> >, std::__1::allocator<std::__1::unique_ptr<A, std::__1::default_delete<A> > > >) $4 = size=0 { 
    [0] = { 
    __ptr_ = { 
     std::__1::__libcpp_compressed_pair_imp<A *, std::__1::default_delete<A> > = { 
     __first_ = 0x0000000100200000 
     } 
    } 
    } 
} 
+1

libcxx.py腳本對我有幫助。但是,似乎鏈接不再正確:現在應爲http://llvm.org/svn/llvm-project/lldb/trunk/examples/synthetic/libcxx.py。 –

2

最初的焦點爲漂亮的打印機是更所使用的Mac/iOS應用發展了AppKit/UIKit的類型,現在正在添加的C++格式化。舉例來說,Xcode的4.6.3:

(lldb) p string_map 
(StringMapT) $0 = size=2 { 
    (std::__1::__tree_node<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, void *>::value_type) [0] = { 
    (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) first = "hi" 
    (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) second = "there" 
    } 
    (std::__1::__tree_node<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, void *>::value_type) [1] = { 
    (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) first = "this" 
    (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) second = "that" 
    } 
} 

頂樹LLDB的:

(lldb) p string_map 
(StringMapT) $0 = size=2 { 
    [0] = { 
    first = "hi" 
    second = "there" 
    } 
    [1] = { 
    first = "this" 
    second = "that" 
    } 
} 

請記住,有兩個C++今天庫版本普遍使用在Mac OS X - 在GNU的libstdC++庫和更新的針對C++ 11的llvm libcxx庫(v。http://libcxx.llvm.org)。這兩個庫中的每一個都需要不同的數據格式化器。

lldb具有豐富的擴展語言,用於添加您自己的類型格式化程序,可以指定打印哪些現有元素或調用Python來格式化打印。我們的目標是通過內置的格式化程序來處理常見的C++/Objective-C類型,但如果您願意編寫自己的程序,則不會侷限於lldb提供的類型。有關更多信息,請參見http://lldb.llvm.org/varformats.html