私はDebian 10を実行しており、約2週間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コマンドのverboseモードでは、コンパイルおよびリンクコマンドにV=1
このオプションが追加されていることを確認できます。-pg
どんな手がかりがありますか?何が欠けていますか?単純な静的にリンクされたサンプルプログラムを分析する方法を示すインターネットチュートリアルがありますが、「実際の」アプリケーションをどのように分析しますか?
編集する:gmon.outが私のホームディレクトリに作成されたことがわかりました。しかし、gprofを介してAtrilを実行すると、アプリケーションはマルチスレッドであるため、出力に多くのコンテンツが表示されません。
答え1
私は個人的にそれほど深く掘り下げません。おすすめしたいいいえ独自の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
、実行が中断される場所を定期的にサンプリングします(ただし、すべてのプロセスを見て、ブラウザを閉じて自宅で折りたたむなど)。 )、それはperf report -g
同じディレクトリで参照できる統計を表示します。デバッグシンボルがインストールされていると、より便利になります。