gprof 搞砸了

Posted

技术标签:

【中文标题】gprof 搞砸了【英文标题】:gprof messing up 【发布时间】:2011-01-25 12:45:45 【问题描述】:

我正在尝试 2 配置 cpp 代码。我用 -pg 标志编译,在我分析它以获得输出之后,我得到了一些非常奇怪的函数名称。 这是我正在使用的 make 文件:

# Makefile for parallel simulated annealer

PREFIX=$PARSECDIR/pkgs/kernels/canneal/inst/$PARSECPLAT

TARGET=canneal
LIBS:=$(LIBS) -lm

CXXFLAGS+=-pg

ifdef version
  ifeq "$(version)" "pthreads"
    CXXFLAGS+=-DENABLE_THREADS -pthread
  endif
endif

all:
    $(CXX) $(CXXFLAGS) annealer_thread.cpp -c -o annealer_thread.o
    $(CXX) $(CXXFLAGS) rng.cpp -c -o rng.o
    $(CXX) $(CXXFLAGS) netlist.cpp -c -o netlist.o
    $(CXX) $(CXXFLAGS) main.cpp -c -o main.o
    $(CXX) $(CXXFLAGS) netlist_elem.cpp -c -o netlist_elem.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) *.o $(LIBS) -o $(TARGET)

clean:
    rm -f *.o $(TARGET)

install:
    mkdir -p $(PREFIX)/bin
    cp -f $(TARGET) $(PREFIX)/bin/$(TARGET)

这是 gprof 输出的示例:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 11.21      0.73     0.73  2800002     0.00     0.00  std::_Rb_tree<std::string, std::pair<std::string const, netlist_elem*>, std::_Select1st<std::pair<std::string const, netlist_elem*> >, std::less<std::string>, std::allocator<std::pair<std::string const, netlist_elem*> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::string const, netlist_elem*> >*, std::_Rb_tree_node<std::pair<std::string const, netlist_elem*> >*, std::string const&)
 10.45      1.41     0.68  5856992     0.00     0.00  atomic_load_acq_int(unsigned int volatile*)
  8.76      1.98     0.57   400001     0.00     0.00  netlist_elem::routing_cost_given_loc(location_t)

这些是文件中真正的函数名:

void annealer_thread::Run()

我忘记了任何标志吗?为什么分析还显示函数的参数?是因为它们是类吗?是因为它是cpp吗? 我熟悉 gprof 和 c 但这是我第一次接触 cpp

欢迎任何帮助:)欢呼=)

【问题讨论】:

像往常一样,在一个重要的程序中,CPU 时间主要花在库例程上,这并不能告诉你它们是如何被调用的。即使你得到这些问题的答案,with gprof you will probably have a lot more questions。 【参考方案1】:

在 C++ 中,函数名称包括它们所属的类、返回类型和所有参数类型。这是通过“修改”名称来完成的。这样就可以使用不同的参数类型重载函数。 gprof 意识到这一点并可以解开它们。

您在平面配置文件中看到的是,PC 经常被某些类库例程捕获。仅当它为您提供了代码中最终在这些例程中的调用路径的线索时,这才有用。调用图(仪器)在那里提供了一些帮助。

当然,它对您不想做的任何 I/O 都是视而不见的。 该程序可能会花费 99% 的时间在库中进行深度 I/O,而您不知道它正在发生,gprof 也不知道。

看看Zoom。

【讨论】:

我怎样才能解开它们?我厌倦了'-T'标志,我认为它有效。你还有其他想法吗? @Syntax_Error: gprof 正在为你做这件事。 gdb 也可以,如果您尝试 random-pausing 方法,我想我之前已经向您建议过。另一种方法可能是如果 gnu 链接器可以给你一个 de-mangled 的地图文件,但我在猜测。 是的,你已经提出了随机暂停……但我更喜欢自动的东西!有几个测试来做一些随机暂停会很耗时!生病尝试找到一种方法 2 消除输出!现在 -T 标志对我来说很好用!谢谢 @Syntax_Error:耗时?好吧,我不这么认为,但无论如何,请看看 Zoom。我还听说 OProfile 可以做到,只要你学会如何哄它。 @Syntax_Error:不打扰你,但是this post 上 Peter M. 的 cmets 展示了典型的体验。

以上是关于gprof 搞砸了的主要内容,如果未能解决你的问题,请参考以下文章

关于gprof和gprof2dot生成的图的一些疑惑

GPROF 平面轮廓空结果

gprof 不显示呼叫信息

性能测试工具GNU gprof

C/C++性能分析工具gprof

使用 gprof 和 boost