自分のプロセス内でスレッドを一時停止しないでください!

ある顧客が、長期間にわたる低頻度のハング問題に遭遇しました。UIスレッドがカーネルを呼び出した後、理由もなくハングしていました。残念ながら、カーネルダンプでは、スタックがページアウトされていたため、ユーザーモードからのスタックを表示できませんでした。(ブロックされたスレッドはスタックを使用しないため、システムがメモリ不足になるとスタックがページアウトされます。)調査の結果、ウォッチドッグスレッドがUIスレッドを定期的に一時停止してスタックトレースを取得していましたが、今回は5時間以上ハングしていました。原因はデッドロックでした。ウォッチドッグスレッドはUIスレッドのスタックトレースを取得しようとしていましたが、関数テーブルのロックが必要でした。しかし、UIスレッドは一時停止されており、そのロックを保持していました。この記事では、自分のプロセス内でスレッドを一時停止しないように強調しています。リソースの競合によってデッドロックが発生するリスクがあるためです。スレッドを一時停止してスタックトレースを取得する必要がある場合は、デッドロックを回避するために、別のプロセスから実行する必要があります。
続きを読む