代码之家  ›  专栏  ›  技术社区  ›  user3459474

使用clang时gdb中libc++的评估方法

  •  1
  • user3459474  · 技术社区  · 6 年前

    编译此时

    #include <vector>
    #include <stdio.h>
    int main()
    {
        std::vector<int> foo;
        foo.push_back( 1 );
        printf( "%zu\n", foo.size() );
    }
    

    具有 clang++ foo.cpp -stdlib=libc++ -g ,当在gdb中运行a.out并尝试显示 foo.size() ,gdb说“无法计算函数--可能是内联的”。

    有没有办法避免编译器在调试模式下内联?我可以使用libstdc++,但当需要进入模板内部时,这是非常痛苦的(许多子单元格加缩进有时是基于空间的,有时是基于选项卡的)。

    我正在使用libc++-devv3.5和clang3.8运行Debian9(stretch)(也尝试了clang5.0,结果相同)和GDB7.12。

    1 回复  |  直到 6 年前
        1
  •  3
  •   ks1322    6 年前

    libstdc++实现了所谓的pythonxmethods,请参见 documentation :

    Xmethods是现有方法的附加方法或替代方法 C++类的。此功能对于方法 在C++中定义的源代码可以通过 编译器,使其对GDB不可用。对于这种情况,可以定义 替代C中定义的方法的xmethod++ 源代码。然后GDB将调用xmethod,而不是C++ 方法来计算表达式。在以下情况下也可以使用xmethods 使用核心文件进行调试。此外,在调试实时程序时, 调用xmethod不需要运行下级(可以 可能干扰其状态)。因此,即使C++方法 如果可用,则最好使用其替换xmethod 定义

    这就是为什么你可以叫mock foo.size() 即使是真的 富。大小() 在使用libstdc++时由编译器内联。据我所知,libc++没有类似的xmethod实现。