【问题标题】:lldb issue with the binary from clang++ on MacMac 上来自 clang++ 的二进制文件的 lldb 问题
【发布时间】:2026-01-14 02:40:01
【问题描述】:

我有 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

可能出了什么问题?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,这可能是问题所在。我可以使用b LINENUMBER 跳过这个问题。
    【解决方案2】:

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

    % lldb
    

    您正在从 /usr/bin 运行 lldb,它由“命令行工具”包安装(可选下载,可以从 developer.apple.com 或 Xcode 中下载 - 首选项 > 下载 标签 > 组件)。如果你改为这样做

    % xcrun lldb
    

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

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

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

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

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

    【讨论】:

      最近更新 更多