web-dev-qa-db-ja.com

プロセスモニターを使用して、プロセスとその子をトレースするにはどうすればよいですか?

SysInternals プロセスモニターprocmon.exeまたはprocmon64.exe)、特定のPIDとその子プロセスを使用してプロセスをトレースするにはどうすればよいですか?

私の最初の(ナイーブな)アイデアは、「PID is1234」と「ParentPIDis 1234」の両方の述語を含めることでした。これらは、ORではなくANDを使用して結合されているため、相互に排他的であることがわかります。

どういうわけかフィルターをORで結合することは可能ですか?

1
Bass

FromProcess Monitor Helpprocmon.chm):

プロセスモニター

  • [〜#〜]または[〜#〜]特定の属性タイプに関連するすべてのフィルターと
  • [〜#〜] and [〜#〜] s一緒に異なる属性タイプのフィルター。

トレースしたいとしましょうPowerShell.exeプロセスとその子プロセス。次に、Window RunDialogueからpowershellを起動します(Win+R) なので

cmd.exe /c "title="mycmd" & tasklist /v /fo csv | findstr /i "powershell\.exe" & echo --- & start "" "powershell" & >NUL timeout /T 2 & tasklist /v /fo csv | findstr /i "mycmd powershell\.exe" & pause"

mycmdウィンドウの出力が次のようになっているとしましょう。

"powershell.exe","5384","Console","1","88 752 K","Running","PC\user","0:00:01","Windows PowerShell"
---    
"powershell.exe","5384","Console","1","88 752 K","Running","PC\user","0:00:01","Windows PowerShell"
"cmd.exe","5008","Console","1","4 488 K","Running","PC\user","0:00:00",""mycmd" "
"powershell.exe","4344","Console","1","84 468 K","Running","PC\user","0:00:01","N/A"
Press any key to continue . . .

次に、Process Monitorでフィルターを次のように設定できます

Parent PID is 4344                # childs of newly created powershell.exe instance
Parent PID is 5008                # childs of ephemeral cmd.exe i.e our powershell.exe
Process Name is not conhost.exe   # service utility for any console application

言い換えると:

Parent PID is 4344[〜#〜]または[〜#〜]5008[〜#〜] and [〜#〜]Process Name is not conhost.exe


ザ・ Win+R コマンドの意味:

  • cmd.exe /c "title="mycmd":補助(エフェメラル)コマンドプロンプトインスタンスを開始し、そのタイトルを設定してから、次のタスクを実行します:
    • tasklist /v /fo csv | findstr /i "powershell\.exe"現在の(現在の)PowerShellインスタンスを一覧表示します
    • echo ---行区切り文字を印刷する
    • start "" "powershell"新しいPowerShellインスタンスを起動します
    • >NUL timeout /T 2少し待つ
    • tasklist /v /fo csv | findstr /i "mycmd powershell\.exe"PowerShellの現在のインスタンスと補助的なcmd.exe
    • pause"ユーザーの応答を待つ
2
JosefZ