Gentoo 中解决 perf “找不到符号”的问题

使用 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",这种方式将符号信息保留在程序的二进制执行文件中,因而会影响到程序的运行性能。

参考

推荐阅读更多精彩内容