こんにちは、働くC#プログラマーのさんさめです。
VisualStudioでデバッグブレークして非同期処理をデバッグするときに、
「スレッド」ウィンドウを使われている方は多いのではないでしょうか?
(昔の私だけかも…)
非同期処理のデバッグはただでさえ大変なので、
さくっと原因を見つけたいもの…
実は、「スレッド」ウィンドウよりもっと便利な
「並列スタック」ウィンドウなるものがあるんです。
本記事ではその「並列スタック」ウィンドウについて紹介します。
「スレッド」ウィンドウのおさらい
「スレッド」ウィンドウは、
その名の通り現在立っているスレッドが一覧できるウィンドウです。
非同期処理のデバッグをしているとき、
特にタイミング依存のバグを追っているときに、
この「スレッド」ウィンドウを使えば、
ブレークした時点で他のスレッドが
どこの処理を実行しているのかを確認できます。
…ただ、この「スレッド」ウィンドウは、
ちょっとノイズが多いのが困りものです。
「場所」列にスタックトレースが格納されてるのですが、
スレッド数が多いと、とにかく見づらく、
目的の処理を探すのに一苦労します。
(特に最初から動いているスレッドが多いWPF)
そこで活躍するのが、「並列スタック」ウィンドウです。
「並列スタック」ウィンドウの場所と概要
デバッグ→ウィンドウ→並列スタックから開けます。
このウィンドウでは、
各スレッドの処理が、マインドマップのように表示されます。
以下のような特徴があります
- 各スレッドのスタックトレースが一覧できる
- 同じスタックトレースのスレッドはまとめて表示される
- ユーザーコード以外はグレーアウトしている
表示した直後は全域が映っていないと思うので、
適宜フローティングさせたりして表示領域を増やしてください。
並列スタックではユーザーコードが関連するスレッドを見つけやすい
「スレッド」ウィンドウでは、
全てのスレッドが一覧できるがために、
自分の書いたコードが関連しているスレッドを探すことが難しいです。
自分のコードがうまく動かない原因はほぼ自分のコードです。
関係ないコードを実行している行は正直見なくてよいことがほとんどでしょう。
並列スタックウィンドウでは、
- 各スレッドのスタックトレースが一覧できる
- 同じスタックトレースのコードがまとめられる
という特徴があり、
裏で動いている似たようなスタックトレースのスレッドを見る必要が無くなります。
さらに、
- ユーザーコード以外はグレーアウトしている
ということから、自分の書いた処理と処理との兼ね合いを把握することが
非常に簡単になります。
もちろん、メソッドをダブルクリックすれば、
アクティブなスレッドを切り替えることができます。
ただし、ウィンドウが幅をとるので邪魔になりがち
そんな便利な並列スタックウィンドウですが、
唯一の欠点として「ウィンドウの幅をとってしまう」という点が挙げられます…。
ディスプレイ1つだとかなり邪魔
そのため、おすすめの活用法としては
普段はドッキングさせておいて必要な時だけフローティングさせる、
などが挙げられます。
もちろん、マルチディスプレイだったらもうちょっと融通は利きますが、
非同期処理のデバッグ時以外は、
他スレッドのスタックトレースはほぼ必要ないのでやっぱり邪魔です。
まとめ
まとめです。
- 非同期処理のデバッグ時には「並列スタック」ウィンドウが便利
- ユーザーコードの関連するスレッドがぱっと見で分かる
- でもウィンドウ領域をたくさん取るので普段は邪魔
最後までお読みいただき、ありがとうございました。
コメント