0

我有铿锵++ 4.1

clang++ -v
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix

我也有 lldb 167.5

lldb -v
LDB-167.5

我用这个命令编译了简单的 c++ 代码。

clang++ testit.cpp -std=c++11 -stdlib=libc++ -g -o a

当我尝试用 lldb 调试它时,我执行了 lldb ./a,设置断点b main并运行。

lldb) r
Process 44582 launched: '/Users/smcho/Desktop/cpp11/lldb/a' (x86_64)
Process 44582 stopped
* thread #1: tid = 0x1f03, 0x00000001000007e8 a`main [inlined] std::__1::__vector_base<std::__1::unique_ptr<A, std::__1::default_delete<A> >, std::__1::allocator<std::__1::unique_ptr<A, std::__1::default_delete<A> > > >::__vector_base() at vector:460, stop reason = breakpoint 1.1
    frame #0: 0x00000001000007e8 a`main [inlined] std::__1::__vector_base<std::__1::unique_ptr<A, std::__1::default_delete<A> >, std::__1::allocator<std::__1::unique_ptr<A, std::__1::default_delete<A> > > >::__vector_base() at vector:460
   457          _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
   458      : __begin_(0),
   459        __end_(0),
-> 460        __end_cap_(0)
   461  {
   462  }
   463  

C++ 源代码在这篇文章中:How to print the content in vector<unique_ptr> with gdb on Mac OS X

可能有什么问题?

4

2 回答 2

1

没有什么特别错误的。您正在使用执行大量内联的 libc++(即使在 -O0,是的) - 这意味着您在 main() 中的代码与 libc++ 代码交错您的 main() 中的第一步是创建一个 std::vector,实际上你在 std::vector (即它的基类)的(内联)构造函数中停止。它恰好是您通话中的第一个“用户”指令。您应该能够将其“下一步”到您的用户级代码。

于 2013-06-23T16:56:26.340 回答
1

需要注意的一件事是您使用的是旧版本的 clang 和 lldb。使用 Xcode 4,当你运行

% lldb

您正在运行由“命令行工具”包安装的 lldb /usr/bin(可选下载,来自 developer.apple.com 或 Xcode - Preferences > Downloads tab > Components)。如果你改为

% xcrun lldb

您将运行 Xcode.app 中包含的 lldb——希望看到类似 lldb-179.6 的版本。在 lldb-179 中对内联函数(如标准 C++ 库中的函数)的处理进行了一些重要的改进,我认为它可能对您所看到的有所帮助。

您还可以从 Xcode 中更新到最新的命令行工具包。下载新的 Xcode 更新时,Mac App Store 更新不会自动更新它。

请注意,在这种特殊情况下,您的函数以

main() {
    vector<unique_ptr<A>> v;

在函数的第一行内联这个 ctor 意味着即使使用最新的工具你也会看到这个头文件——clang 输出的行表没有给调试器提供跳过它所需的信息。如果您只输入nextor n,您将位于函数的下一个源代码行。

于 2013-06-23T20:09:58.320 回答