使用 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"
,這種方式將符號信息保留在程序的二進制執行文件中,因而會影響到程序的運行性能。