是否可以检查给定程序是否使用 GNU gprof 工具编译,即“-pg”标志传递给编译器和链接器,没有运行它来检查它是否会生成gmon.out
文件?
答案1
您可以检查对函数的引用mcount
(或者可能_mcount
或__mcount
根据分析的实施)。此函数对于分析工作是必需的,对于未分析的二进制文件应该不存在。
就像是:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
以上内容适用于此处的快速测试。
答案2
上面答案中的正则表达式并不总是有效...但是我认为在“readelf -s [binary]”的输出中 grep 查找“mcount”的一般思想是正确的
答案3
在答案中添加更多内容:
要检查仪器,请 grep for 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
不会生成。堆栈溢出链接。我发现运行 gprof 的二进制文件没有生成任何
gmon.out
文件,尽管使用标志进行编译/链接-pg
。原因是 - 我正在终止我的应用程序,这不是一个干净的退出。gprof
仅当程序正常退出时才产生输出。堆栈溢出链接