使用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 的正确方法
如何在 hive udf 中使用 collect_set 的结果 - 评估方法?