目的
あるプロセスがメモリリークしている。その推移を記録する。
結論
プロセスIDが1228の推移を1秒間隔で1228.csvに記録するには、PowerShellプロンプトを開き、以下のようにする。停止するにはCtrl+C
while ($true) {ps -Id 1228 | Add-Member Time (Get-Date) -PassThru | Export-Csv -Path 1228.csv -Append -NoTypeInformation; sleep 1}
詳細
Windowsでデフォルトで使えるPowerShellを使ってなんとかする。
プロセス一覧は ps
(Get-Process)コマンドレットで得られます。
例えばfirefoxのプロセスだけ欲しいなら以下のようにします。
ps firefox
特定のプロセスだけ欲しいならIdを指定します。Idはpsコマンドレットで得られます。
ps -Id 1228
いつの状態か記録するために、時刻プロパティを追加しましょう。Add-Member
で追加できます。
現在時刻は Get-Date
で得られます、()をつけないと Get-Date
と出力されてしまう。 -PassThru
オプションで新たに拡張されたオブジェクトをパイプラインに渡します。
ps -Id 1228 | Add-Member Time (Get-Date) -PassThru
CSV形式で保存するには Export-Csv
です。繰り返し実行するので -Append
オプションをつけます。タイプ情報は不要なので -NoTypeInformation
オプションもつけておく。
ps -Id 1228 | Add-Member Time (Get-Date) -PassThru | Export-Csv -Path 1228.csv -Append -NoTypeInformation
定期的に実行したいので無限ループします。sleep
で間隔(秒単位)を指定。
while ($true) {ps -Id 1228 | Add-Member Time (Get-Date) -PassThru | Export-Csv -Path 1228.csv -Append -NoTypeInformation; sleep 1}
感想
1行でなんとかなりました。
定期実行を無限ループで処理しているのがちょっと気になるところです。
また、メモリ使用量に限らずプロセス情報すべて記録しているので無駄があります。記録する項目を指定したほうがいいかもしれない。
これでリーク調査はまだしていないので実際のところ役に立つのかは不明です。