Kan*_* Li 13 c++ macos gcc google-perftools
我试图在MacOSX上分析一些C++程序.所以我构建google-perftools了一个程序,使用MacPorts g ++ 4.7 -g编译,带有编译器标志,并链接到libprofiler.然后我跑了:
CPUPROFILE=cpu.profile ./a.out
Run Code Online (Sandbox Code Playgroud)
然后我运行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
......
Run Code Online (Sandbox Code Playgroud)
看起来perftools不会将地址转换为函数名称.
有谁知道我在这里缺少什么?我该怎么做才能让探查器生成正确的结果.
编辑:更多信息:它不是pprof或google-perftools的问题,但更像是gcc或macosx,因为Instrument.app还显示地址而不是行号.我不熟悉调试符号在Mac OS X下如何工作,所以我宁愿认为这是我在这里丢失的东西,而不是gcc或Mac OS X中的错误.我想知道是否有人可以提供有关调试信息如何工作的一些提示对于Mac OS X.
我相信在这个平台中,调试符号保留在 .o 文件中,它们不会移动到可执行文件中。要在 gdb 或分析器中获取符号,您需要保存 .o 文件。这可能意味着您需要分两步编译应用程序(编译,然后链接)以保留 .o 文件。
请参阅此问题以获取更多信息。
在查看 pprof Perl 源代码时,符号名称是通过使用nm和获得的c++filt,因此您可以尝试独立运行它们并找出它们不起作用的原因。从 pprof 源代码来看,它似乎尝试了一堆不同的命令行参数来覆盖 nm 的多个版本。这是方法总结
nm [-D] -n [-f] [--demangle] 对象文件 2>/dev/nul [| cpp+过滤]
我放在括号中的部分是脚本在运行时确定您的平台以及 nm 和 c++filt 版本是否需要的部分。尝试上述所有组合,看看哪种有效。然后看看 pprof 脚本做了什么,也许可以向其中添加一些 printfs。
祝你好运。