backtrace
10ミリ秒ごとにプロセスのスタック(スタック)を保存するgdbのスクリプトを作成したいと思います。これどうやってするの?
これは、「無一文」のコールグラフプロファイリングのようなものです(高度なプロファイラーを使用できない人向け)。
はい、多くの高度なプロファイラーがあります。一般的なCPUおよび一般的なOS用。Sharkは非常に印象的で使いやすいですが、gdbを使用して、このようなスクリプトで基本的な機能を取得したいと思います。
lsstackを入手できますか?おそらく、アプリの外部のスクリプトからそれを実行できます。なぜ10ms?100ms以上でもパーセンテージはほぼ同じになります。アプリが速すぎる場合は、外側のループを使用して人為的に速度を落とすことができますが、それでもパーセンテージは変わりません。さらに言えば、アプリが十分に長く実行され、パフォーマンスの問題がどこにあるかを見つけることが目標である場合は、Ctrl-Cを使用してgdbでサンプルを手動で取得できます。
cat > gdb.run
set pagination 0
backtrace
continue
backtrace
continue
... as many more backtrace + continue's as needed
backtrace
continue
detach
quit
もちろん、重複する改行は省略してください。このフォーラム ソフトウェアで単一の改行をどのように行うのですか? :(
gdb -x gdb.run -p $pid
次に、doを使用します
kill -INT $pid ; sleep 0.01
別のスクリプトのループで。
kill -INT
を押したときにOSが行うことですctrl-C。読者のための演習: gdb スクリプトが $n 回の繰り返しでループを使用するようにします。