编译此时
#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说“无法计算函数--可能是内联的”。
clang++ foo.cpp -stdlib=libc++ -g
foo.size()
有没有办法避免编译器在调试模式下内联?我可以使用libstdc++,但当需要进入模板内部时,这是非常痛苦的(许多子单元格加缩进有时是基于空间的,有时是基于选项卡的)。
我正在使用libc++-devv3.5和clang3.8运行Debian9(stretch)(也尝试了clang5.0,结果相同)和GDB7.12。
libstdc++实现了所谓的pythonxmethods,请参见 documentation :
Xmethods是现有方法的附加方法或替代方法 C++类的。此功能对于方法 在C++中定义的源代码可以通过 编译器,使其对GDB不可用。对于这种情况,可以定义 替代C中定义的方法的xmethod++ 源代码。然后GDB将调用xmethod,而不是C++ 方法来计算表达式。在以下情况下也可以使用xmethods 使用核心文件进行调试。此外,在调试实时程序时, 调用xmethod不需要运行下级(可以 可能干扰其状态)。因此,即使C++方法 如果可用,则最好使用其替换xmethod 定义
这就是为什么你可以叫mock foo.size() 即使是真的 富。大小() 在使用libstdc++时由编译器内联。据我所知,libc++没有类似的xmethod实现。
富。大小()