lldb与Mac上的clang ++二进制文件有关

时间:2013-06-23 03:17:10

标签: xcode macos c++11 lldb clang++

我有clang ++ 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 out the content in vector<unique_ptr> with gdb on Mac OS X

可能有什么问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

% lldb

您正在运行来自/usr/bin的lldb,它由“命令行工具”软件包安装(可选下载,来自developer.apple.com或来自Xcode - 偏好设置 &gt; 下载标签&gt; 组件)。如果你做了

% xcrun lldb

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

您还可以从Xcode中更新到最新的Command Line Tools包。下载新的Xcode更新时,Mac App Store更新不会自动更新。

请注意,在这种特殊情况下,您的功能将以

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

在函数的第一行上对此ctor的内联意味着即使使用最新的工具,您也将看到此头文件 - clang输出的行表不会向调试器提供跳过所需的信息超过它。如果您只需输入nextn,您就会进入功能的下一个源代码行。