使用 perf 进行性能分析时,一个令人头疼的问题是,有时候找不到某些库的符号。例如,当我在 Gentoo 下面运行 perf script
时,系统报了下面的错误:
$ perf script > out.perf
no symbols found in /bin/gzip, maybe install a debug package?
no symbols found in /usr/bin/sandbox, maybe install a debug package?
no symbols found in /usr/x86_64-pc-linux-gnu/gcc-bin/5.4.0/x86_64-pc-linux-gnu-gcc, maybe install a debug package?
这个时候,就需要我们安装相关库的 debug 版本。幸运的是,Gentoo 提供了相当简洁的解决办法,只需要对 /etc/make.conf
文件稍作修改即可:
- 在
CFLAGS
变量的值中添加-ggdb
选项; - 新加一行:
FEATURES="splitdebug"
。
然后重新安装 glibc 以及报错信息中提示的库:
$ emerge -1 glibc
$ emerge -1 gzip
$ emerge -1 sandbox
$ emerge -1 gcc
之后就可以重新运行 perf script
了。
程序的符号信息被保存在了目录 /usr/lib/debug
下面,因此不会影响到程序的运行性能(但增加了磁盘占用)。还有另外一种方式是使用 FEATURES="nostrip"
,这种方式将符号信息保留在程序的二进制执行文件中,因而会影响到程序的运行性能。