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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用clang时在gdb中评估libc ++的方法相关的知识,希望对你有一定的参考价值。

在编译时

#include <vector>
#include <stdio.h>
int main()
{
    std::vector<int> foo;
    foo.push_back( 1 );
    printf( "%zu
", 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。

答案

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实现。

以上是关于使用clang时在gdb中评估libc ++的方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 Promise 时在类方法中未定义“this”? [复制]

使用 NextJS 时在 NexusJS 中定义 contextType 的正确方法

未使用 await 调用时在异步方法中捕获异常

如何在 hive udf 中使用 collect_set 的结果 - 评估方法?

使用 RoutingSession 时在 sqlalchemy 中调用了两次“get_bind”方法

加载大量文本时在 JavaFX 2 中加速 TextArea 的方法?