1 回限りのデバッグ/トラブルシューティング セッション中に、スレッド/プロセス間で win32 ウィンドウ メッセージを送信しているユーザーを特定する手法を思い付きました。いくつかの仮定を立てる必要があるため、100% 信頼できるわけではありませんが、これまでのところ、うまくいかなかったケースは見つかっていません。
基本的な考え方は、メッセージが到着すると、通常、受信者のウィンドウ スレッドがメッセージ ループ (具体的には) で待機GetMessage()
してブロックされるという事実を利用することです。メッセージが配信されると、送信スレッドは受信スレッドの準備を整え、待機状態から抜け出します。
Windows では、 Event Tracing for Windowsを使用して、どのスレッドが他のどのスレッドの準備を整えているかを正確に追跡する方法を提供していることがわかりました。この機能を使用すると、多くの場合、メッセージを送信したスレッドを特定できます。受信スレッドを準備したのはスレッドです。メッセージを送信した時点での送信スレッドのコール スタックを確認することも可能です。またwin32k
、スタックのカーネル側 ( ) 部分も確認できます。
基本的な手順は次のようになります。
- Windows Performance Recorderを使用してトレースを開始します。「CPU 使用率」プロファイルを必ず含めてください。
- 関心のあるメッセージの送信をトリガーします。
- トレースを停止します。
- Windows パフォーマンス アナライザーでトレースを開きます。
- 「CPU 使用率 (正確)」グラフ、「スタック」グラフ プリセットで、メッセージを受信した時刻を拡大します。
- 1 つの方法は、受信スレッドを見つけて、いつ起動したかを判断することです。
- 関連付けが難しい場合は、TraceLogging などを使用して受信スレッドを計測し、明確な参照時点を生成することをお勧めします。
- で受信スレッドの準備ができているコンテキスト スイッチ イベントを見つけることができるはずです
GetMessage
。
- 「Readying Process」、「Readying Thread Id」、および「Readying Thread Stack」列には、メッセージの送信者である可能性が高い、readying スレッドの詳細が表示されます。
たとえば、次のスクリーンショットでは、TID 7640が WindowsTerminal.exe TID 1104 から発信されたシェル フック メッセージを受け取ります。
