是否可以检查给定程序是否使用GNU gprof工具编译,即是否将'-pg'标志传递给编译器和链接器,而无需运行它来检查它是否会生成gmon.out
文件?
是否可以检查给定程序是否使用GNU gprof工具编译,即是否将'-pg'标志传递给编译器和链接器,而无需运行它来检查它是否会生成gmon.out
文件?
Answers:
您可以检查对函数的引用mcount
(或可能_mcount
或__mcount
根据Profiling的实现)。该功能是配置文件正常工作所必需的,而对于未分析的二进制文件则应缺少此功能。
就像是:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
上面的内容在这里可以进行快速测试。
在答案中添加更多内容:
要检查检测情况,请使用grep表示mcount / gmon:
$ readelf -s <binary> | egrep "gmon|mcount"
20: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_2.2.5 (2)
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS gmon-start.c
39: 00000000004011a0 0 FUNC LOCAL DEFAULT 12 call_gmon_start
100: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@@GLIBC_2.2.5
需要编译以及与-pg
标志链接,否则gmon.out
将不会生成。stackoverflow链接。
我发现运行gprof的二进制gmon.out
文件尽管已编译/链接有-pg
标志,却未生成任何 文件。原因是-我正在终止我的应用程序,这不是一个干净的出口。gprof
仅在程序正常退出时才生成输出。stackoverflow链接