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

问题描述 投票:1回答:1

在编译时

#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 ++,但是当需要进入模板时很痛苦(许多子下加上缩进有时是基于空格的,有时候是基于制表符的)。

我正在运行Debian 9(延伸)使用libc ++ - dev v3.5 with clang 3.8(尝试使用clang 5.0,结果相同)和gdb 7.12。

c++ debugging gdb clang inline
1个回答
3
投票

libstdc ++实现了所谓的Python xmethods,请参阅documentation

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

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

© www.soinside.com 2019 - 2024. All rights reserved.