首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc - gdb -印刷精美

gcc - gdb -印刷精美
EN

Stack Overflow用户
提问于 2012-06-09 11:23:08
回答 2查看 1.7K关注 0票数 1

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

比如:

  • http://sourceware.org/gdb/wiki/STLSupport
  • or使用共享库打印容器

的内容

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

代码语言:javascript
复制
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()。我收到的信息是:

代码语言:javascript
复制
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

代码语言:javascript
复制
0000000000401834 W _ZNSt6vectorIiSaIiEE5frontEv

有人能解释一下我如何在代码中保留所有函数而不松开它们吗?我认为,只要不设置优化设置或执行以下操作,死函数就不会被删除。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-09 14:23:57

--什么是死函数,不是在我的源代码中可用但没有使用的函数吗?

有两个案件需要考虑:

代码语言:javascript
复制
int unused_function() { return 42; }
int main() { return 0; }

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

现在考虑这一点:

代码语言:javascript
复制
template <typename T> int unused_function(T*) { return 42; }
int main() { return 0; }

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

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

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

代码语言:javascript
复制
#include <vector>
template class std::vector<int>;

int main() { return 0; }

现在,即使没有使用任何vector函数,它们都被实例化为最终的二进制文件。

1如果您使用的是GNU ld (或gold),那么在本例中仍然可以通过使用-ffunction-sections编译和使用-Wl,--gc-sections链接来摆脱unused_function

票数 4
EN

Stack Overflow用户

发布于 2012-06-14 16:47:35

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

到目前为止,我们提到的是:

  • 函数定义int unusedFunc() {返回10;}
  • 函数原型int protypeFunc(); (只为了分解它)

当您内联函数时会发生什么?我一直认为,这个函数会插入到我的源代码中,但现在我读到了,编译器经常自己决定该做什么。(听起来很奇怪,因为它们必须是规则)。例如,使用关键字内联并不重要。

代码语言:javascript
复制
inline int inlineFunc() { return 10; }

我的一个朋友还告诉我,他还没有访问函数的地址,尽管他没有使用内联。有什么函数类型我忘了吗?他还告诉我,它们应该是对象数据格式中的差异。

@编辑-忘记:

嵌套functions

  • function pointers

  • overloaded函数
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10960571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档