gcc - gdb - 漂亮的打印stl

时间:2012-06-09 11:23:09

标签: debugging function stl gdb g++

我目前正在对STL进行一些研究,特别是在调试期间打印STL内容。我知道有很多不同的方法。

像:

我目前正在寻找的是,为什么g ++会删除未使用的函数,例如我有以下代码并使用编译设置g++ -g main.cpp -o main.o

include <vector>
include <iostream>
using namespace std;
int main() {
    std::vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    return;
}

因此,当我调试此代码时,我会看到我无法使用print vec.front()。我收到的消息是:

Cannot evaluate function -- may be inlined

因此,我尝试使用设置-fkeep-inline-functions,但没有更改。

当我使用nm main.o | grep front时,我发现方法.front()没有行条目。再次执行相同的操作,但在我的代码中添加了vec.front()条目后,我可以使用print vec.front(),并使用nm main.o | grep front我看到条目

0000000000401834 W _ZNSt6vectorIiSaIiEE5frontEv

有人可以解释我如何在不丢失代码的情况下保留代码中的所有功能。我认为,只要我没有设置优化设置或执行以下操作,就不会删除死函数。

为什么我需要它:当前的Python实现使用内部STL实现来打印容器的内容,但使用ISO / IEC 14882定义的函数会更有趣。我知道可以编写一个共享库,可以在调试之前编译为实际代码,以维护您拥有所有STL函数,但是在调试之前谁想要为其代码编译额外的lib。了解这两种方法(Shared Lib。和Python)是否有一些优点和缺点也很有趣?

2 个答案:

答案 0 :(得分:4)

  

什么是死函数,它不是我的源代码中可用但未使用的函数吗?

有两种情况需要考虑:

int unused_function() { return 42; }
int main() { return 0; }

如果编译上面的程序,unused_function已经死了 - 从未调用过。但是,它仍然存在于最终的可执行文件中(即使使用优化[1])。

现在考虑一下:

template <typename T> int unused_function(T*) { return 42; }
int main() { return 0; }

在这种情况下,即使您关闭所有优化,unused_function 也不会出现。

为什么呢?因为模板不是“真正的”功能。它是一个原型,编译器可以从中创建“真实”函数(称为“模板实例化”) - 每种类型T一个。由于您从未使用过unused_function,因此编译器没有创建任何“真实”实例。

您可以请求编译器使用explicit instantiation request显式实例化给定类中的所有函数,如下所示:

#include <vector>
template class std::vector<int>;

int main() { return 0; }

现在,即使使用vector函数的 none ,它们 all 实例化为最终的二进制文件。

[1]如果您使用的是GNU ld(或gold),在这种情况下,通过使用unused_function进行编译,您仍然可以摆脱-ffunction-sections-Wl,--gc-sections链接。

答案 1 :(得分:0)

感谢您的回答。重复一遍,模板函数不会由gcc启动,因为它们是原型。只有在使用该函数或它被明确启动时,它才会在我的可执行文件中可用。

所以我们之前提到的是:

  • 函数定义 int unusedFunc(){return 10; }
  • 函数原型 int protypeFunc(); (只是为了将其分解)

内联函数会发生什么?我一直认为,该函数将插入我的源代码中,但现在我读到,编译器经常决定自己做什么。 (听起来很奇怪,因为他们必须遵守规则)。例如,如果您使用关键字内嵌,则无关紧要。

inline int inlineFunc() { return 10; }

我的一位朋友也告诉我他没有使用功能地址,尽管他没有使用内联。有没有忘记的功能类型?他还告诉我,他们应该是对象数据格式的差异。

@edit - 忘了:

  • 嵌套函数
  • 函数指针
  • 重载功能
相关问题