4

gdb 7 には、STL 構造用の便利な python スクリプトがありますhttp://sourceware.org/gdb/wiki/STLSupport

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
        }
      }
    }
  }
}
4

2 に答える 2

2

pretty-printers の最初の焦点は、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"
  }
}

現在、Mac OS X で一般的に使用されている 2 つの C++ ライブラリ バージョンがあることに注意してください。GNU libstdc++ ライブラリと、C++11 (v. http://libcxx.llvm.org ) を対象とする新しい llvm libcxx ライブラリです。これら 2 つのライブラリには、それぞれ異なるデータ フォーマッタが必要です。

lldb には、出力する既存の要素を指定するか、Python を呼び出して出力用の型をフォーマットするかのいずれかで、独自の型フォーマッタを追加するための豊富な拡張言語があります。目標は、一般的な C++/Objective-C の型を組み込みのフォーマッタで処理することですが、独自の型を作成する場合は、lldb によって提供される型に限定されません。詳細については、 http://lldb.llvm.org/varformats.htmlを参照してください。

于 2013-06-24T06:57:00.030 に答える