14

我正在尝试在 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 OS X。

4

2 回答 2

9

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

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

此外,如果您不一定要使用gperftools, Instruments( 附带Xcode) 值得一试。

于 2013-08-13T10:13:10.083 回答
4

我相信在这个平台上,调试符号保留在 .o 文件中,它们不会移动到可执行文件中。要在 gdb 或分析器中获取符号,您需要保存 .o 文件。这可能意味着您需要分两步编译您的应用程序(编译,然后链接)以保留 .o 文件。

有关其他信息,请参阅此问题

在查看 pprof Perl 源代码时,符号名称是通过使用nmand获得的c++filt,因此您可以尝试独立运行它们并找出它们不起作用的原因。从 pprof 源代码看来,它尝试了一堆不同的命令行参数来覆盖 nm 的多个版本。这是方法的总结

nm [-D] -n [-f] [--demangle] 目标文件 2>/dev/nul [| cpp+过滤]

我放在括号中的部分是脚本在运行时确定的部分,如果您的平台和 nm 和 c++filt 版本需要这些部分。尝试以上所有组合,看看有什么效果。然后看看 pprof 脚本做了什么,也许是通过添加一些 printfs 到它。

祝你好运。

于 2012-05-20T17:48:36.557 回答