我正在尝试在MacOSX上分析某些C++程序。因此,我构建了google-perftools,编写了一个程序,使用MacPorts g++ 4.7进行编译,并带有-g编译器标志,并链接到libprofiler。然后我跑了:

CPUPROFILE=cpu.profile ./a.out

然后我运行pprof生成输出:
[hidden ~]$ pprof --text ./a.out cpu.profile
Using local file ./a.out.
Using local file cpu.profile.
Removing __sigtramp from all stack traces.
Total: 282 samples
     107  37.9%  37.9%      107  37.9% 0x000000010d72229e
      16   5.7%  43.6%       16   5.7% 0x000000010d721a5f
      12   4.3%  47.9%       12   4.3% 0x000000010d721de8
      11   3.9%  51.8%       11   3.9% 0x000000010d721a4e
       9   3.2%  55.0%        9   3.2% 0x000000010d721e13
       8   2.8%  57.8%        8   2.8% 0x000000010d721a64
       7   2.5%  60.3%        7   2.5% 0x000000010d7222f0
       6   2.1%  62.4%        6   2.1% 0x000000010d721a4c
       6   2.1%  64.5%        6   2.1% 0x000000010d721b1f
       6   2.1%  66.7%        6   2.1% 0x000000010d721e0c
       5   1.8%  68.4%        5   1.8% 0x000000010d721fba
    ......

看起来perftools不会将地址转换为函数名称。

有人知道我在这里想念的吗?我应该怎么做才能使探查器生成正确的结果。

编辑:更多信息:这不是pprof或google-perftools的问题,而是更多诸如gcc或macosx之类的东西,因为Instrument.app还显示地址而不是行号。我不熟悉调试符号在Mac OS X下的工作方式,因此我宁愿将其视为我在这里缺少的东西,而不是gcc或Mac OS X中的错误。我想知道是否有人可以提供一些有关调试信息如何工作的提示对于Mac OSX。

最佳答案

这似乎与OS X 10.5中引入的地址空间布局随机化(ASLR)有关。

我已在gperftools问题跟踪器上提交了issue #562。您可以通过传递-Wl,-no_pie来禁用ASLR。

另外,如果您不打算使用gperftools,那么Instruments(Xcode附带)是值得尝试的。

08-08 01:26