【问题标题】:pretty printer for STL in lldblldb 中 STL 的漂亮打印机
【发布时间】:2013-06-20 11:38:51
【问题描述】:

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

【问题讨论】:

    标签: python stl gdb pretty-print lldb


    【解决方案1】:

    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 上有两个常用的 C++ 库版本 - GNU libstdc++ 库和针对 C++11 的更新的 llvm libcxx 库(v.http://libcxx.llvm.org)。这两个库中的每一个都需要不同的数据格式化程序。

    lldb 具有丰富的扩展语言,用于添加您自己的类型格式化程序,可以指定要打印的现有元素,也可以调用 Python 来格式化要打印的类型。目标是让内置格式化程序处理常见的 C++/Objective-C 类型,但如果您愿意编写自己的格式化程序,则不限于 lldb 提供的类型。请参阅http://lldb.llvm.org/varformats.html 了解更多信息。

    【讨论】:

      【解决方案2】:

      我认为最简单的解决方案可能是在使用 Mac OS X 时使用 Xcode。

      在lldb中,跟随(How can I get sensible variable displays when using libc++ in Xcode 4.3.1?),我从this site下载python脚本后尝试使用command script import ../libcxx.py

      但是,结果是一样的。

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多