如何分析真實世界的應用程序?
我執行 Debian 10,大約兩週後,PDF 閱讀器 Atril(Evince 的一個分支)需要 25 秒才能啟動。以前它幾乎是立即開始的。現在我試圖找出導致延遲的原因。我已經下載了源包並在啟用分析的情況下建構並安裝了它:
cd "$HOME/.local/src" apt source atril cd atril-1.20.3 ./autogen.sh ./configure CFLAGS=-pg LDFLAGS=-pg --prefix="$HOME/.local" --disable-caja make V=1 make install
但是,當我啟動時,
"$HOME/.local/bin/atril"
沒有創建名為gmon.out
的文件。在 make 命令中使用詳細模式V=1
,我可以看到該選項-pg
已添加到編譯和連結命令中。有什麼線索嗎?少了什麼東西?網際網路上有幾個教程展示瞭如何分析簡單的靜態連結範常式序,但我們如何分析“現實世界”應用程序?**編輯:**原來 gmon.out 是在我的主目錄中創建的。但是,當我通過 gprof 執行 Atril 時,由於應用程序是多執行緒的,因此結果輸出並沒有說太多。
我個人不會挖那麼深。我建議不要建構您自己的 atril,而是使用 debian atril(因為這是您之後將使用的,而且 debian 會為您提供調試符號)。
按複雜度排序:
在啟動 atril 時執行
top
(甚至更好: ,並在其設置中禁用“隱藏使用者態程序執行緒”)。htop
程序是否佔用大量 CPU?轉到perf
或gdb
。
gdb
對於這樣的事情通常足夠好:
- 安裝 atril 的調試符號,參見debian wiki
- 啟動 gdb,載入 atril:(
gdb atril
提示:gdb 可能會告訴您缺少一些調試符號 - 您也可以安裝這些符號,因此當它們目前不在 atril 中時,您可以更輕鬆地破譯回溯)- 在
(gdb)
外殼上,說run
- 在無聊的 15 秒內,按
ctrl
+c
。這會中斷 gdb 中的執行- 因為 atril 可能是多執行緒的,所以
info threads
會告訴你每個執行緒都被卡住了- 按編號 N 選擇最有趣的執行緒,輸入
thread N
- 得到一個回溯:
bt
。你會看到你來自哪裡。如果它不使用 CPU 本身,它幾乎肯定是在等待系統呼叫完成。
strace atril
會告訴顯示它所做的呼叫,現場直播。你接到的最後幾個電話是什麼?也許它試圖睡覺?如果您受 CPU 限制,並且通常,
perf
來自 linux-base 軟體包的命令很棒:sudo sysctl -w kernel.perf_event_paranoid=-1
,然後perf record -ag atril
會定期採樣執行卡住的位置(但它會查看所有程序,因此請關閉瀏覽器,在家折疊並whatnot),然後,perf report -g
從同一目錄顯示可瀏覽的統計資訊。如果您安裝了調試符號,這些會變得更加有用。