【发布时间】:2012-06-09 11:23:08
【问题描述】:
我目前正在对 STL 进行一些研究,尤其是在调试期间打印 STL 内容。我知道有很多不同的方法。
喜欢:
- http://sourceware.org/gdb/wiki/STLSupport
- 或使用共享库打印容器的内容
我目前正在寻找的是,为什么 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 函数,但谁想在调试之前为其代码编译一个额外的库。了解这两种方法(Shared Lib. 和 Python)是否有一些优点和缺点也会很有趣?
【问题讨论】:
-
您的问题已经得到答案:stackoverflow.com/a/7241548/184968."
Partial instantiation" :... only the member functions that are used are instantiated. The following is well-formed code:。我的意思是你问的是“死函数”,但 std::vector::front() 是模板的成员。它没有被删除,甚至没有在您的示例中创建。 -
抱歉造成误会。在段落中“当我使用”nm main.o | grep front" 等...,我试图说,在我的代码中使用 vec.front() 之后,我可以在 gdb 中使用该函数。究竟什么是死函数,不是一个函数在我的源代码中可用但没有使用??另一个问题 gdb 是否知道函数 .front(),即使我没有使用它,但没有调试信息?
标签: debugging function stl gdb g++