使用 perf 進(jìn)行性能分析時(shí),一個(gè)令人頭疼的問題是,有時(shí)候找不到某些庫(kù)的符號(hào)。例如,當(dāng)我在 Gentoo 下面運(yùn)行 perf script
時(shí),系統(tǒng)報(bào)了下面的錯(cuò)誤:
$ 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?
這個(gè)時(shí)候,就需要我們安裝相關(guān)庫(kù)的 debug 版本。幸運(yùn)的是,Gentoo 提供了相當(dāng)簡(jiǎn)潔的解決辦法,只需要對(duì) /etc/make.conf
文件稍作修改即可:
- 在
CFLAGS
變量的值中添加-ggdb
選項(xiàng); - 新加一行:
FEATURES="splitdebug"
。
然后重新安裝 glibc 以及報(bào)錯(cuò)信息中提示的庫(kù):
$ emerge -1 glibc
$ emerge -1 gzip
$ emerge -1 sandbox
$ emerge -1 gcc
之后就可以重新運(yùn)行 perf script
了。
程序的符號(hào)信息被保存在了目錄 /usr/lib/debug
下面,因此不會(huì)影響到程序的運(yùn)行性能(但增加了磁盤占用)。還有另外一種方式是使用 FEATURES="nostrip"
,這種方式將符號(hào)信息保留在程序的二進(jìn)制執(zhí)行文件中,因而會(huì)影響到程序的運(yùn)行性能。