在lldb中打印std::vector<std::string>的内容

3
我想打印出向量中的所有字符串。当我执行以下操作时:
(lldb) p myVector
(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >) $30 = size=65 {
  [0] = Summary Unavailable
  [1] = Summary Unavailable
  [2] = Summary Unavailable
  [3] = Summary Unavailable
  [4] = Summary Unavailable
  [5] = Summary Unavailable
  [6] = Summary Unavailable
  [7] = Summary Unavailable
  [8] = Summary Unavailable
  [9] = Summary Unavailable
  [10] = Summary Unavailable
  [11] = Summary Unavailable
...

然而,打印每个元素可以工作,例如:

p myVector[5].c_str()
(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >::value_type *) $31 = 0x0000600000210280 "-D__STDC_CONSTANT_MACROS"

我希望一次打印所有元素,因为它们有很多。

1
看起来lldb的"std::string""摘要格式化程序"对这些字符串失效了。摘要格式化程序理解底层对象的内部布局并从中提取一个用户友好的表示形式。如果您能够可靠地重现这个问题,请在llvm问题跟踪器 https://github.com/llvm/llvm-project/issues 上报告一个错误。请确保包括您使用的系统和标准C++库的版本,这些格式化程序需要知道标准库实现的细节。 - Jim Ingham
2个回答

2

在编译器命令行中添加-fstandalone-debug

我已经将其设置为我的CMake调试构建:

set(CMAKE_CXX_FLAGS_DEBUG_INIT "-ggdb3 -O0 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fstandalone-debug ${SANITIZE_OPTS}" CACHE STRING "Initial debug flags")


这可能可行,但在调试时更改构建选项并不总是可行的。 - A. K.
1
在调试之前,您应该更改构建选项。 - Henrique Bucher
在许多情况下,甚至无法重新构建应用程序。 - A. K.

-1

所以我通过使用lldb的表达式求值功能解决了这个问题

(lldb) expr -- for (int x = 0; x < myVector.size(); x++) printf("arg[%d] = %s\n", x, myVector[x].c_str())

# prints:
arg[0] = /Library/Developer/CommandLineTools/usr/bin/c++
arg[1] = --driver-mode=g++
arg[2] = -DGTEST_HAS_RTTI=0
arg[3] = -D__STDC_CONSTANT_MACROS
arg[4] = -D__STDC_FORMAT_MACROS
arg[5] = -D__STDC_LIMIT_MACROS
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接