【问题标题】:evaluating methods of libc++ in gdb when using clang使用 clang 时在 gdb 中评估 libc++ 的方法
【发布时间】:2018-03-06 23:17:27
【问题描述】:

编译时

#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++-dev v3.5 和 clang 3.8 运行 Debian 9 (stretch)(也尝试使用 clang 5.0,结果相同)和 gdb 7.12。

【问题讨论】:

  • 我必须承认我没有注意到这一点,但这里至少有两个不同之处:它适用于 libstdc++,并且内联不在我的控制之下。

标签: c++ debugging gdb clang inline


【解决方案1】:

libstdc++ 实现了所谓的 Python xmethods,参见 documentation:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2011-09-22
    • 2010-11-24
    • 2013-11-22
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多