連載:Visual Studioデバッグ手法

第3回 Visual Studio 2010による高度なデバッグを極める

亀川 和史
2010/10/01

並列プログラムの可視化機能

 .NET Framework 4では並列プログラミングのサポートが強化された。Parallel LINQ(PLINQ)や、タスク並列ライブラリ(TPL)などである(参照:「MSDN:.NET Framework の並列プログラミング」)。これに伴い、Visual Studio 2010では並列機能を使用したプログラミングにおける可視化機能が向上している。

 今回はサンプルとしてMSDN Code Galleryの「Samples for Parallel Programming with the .NET Framework 4」というサンプル集に含まれるサンプルの1つ、「BlendImages」を使用する。このサンプル集には、ほかにも多くの並列プログラムのサンプルがある。並列プログラムに興味がある人は見てほしい。レイトレーシング(Raytracer、LINQRayTracer)や、モーフィング(Morph)、今回使用するイメージ合成(BlendImages)などは結果が可視化されるため、実行して見てみるだけでも並列処理の様子が分かりやすい。

 BlendImagesを実行する場合のスレッドの生成を確認してみよう。まず、AllSamples.slnファイルをVisual Studioで読み込み、BlendImages_CSharpプロジェクトのMainForm.csファイルのコードを表示する。btnBlend_Images_Clickメソッドでイメージ合成処理が実装されているので、メソッド内の先頭行にブレークポイントを設定しておこう。

private void btnBlendImages_Click(object sender, EventArgs e)
{
  // Determine whether to run sequentially or in parallel based on the
  // button click that got us here
  bool isParallel = sender == btnParallel;
  // 上の行にブレークポイントを指定しておくとよい
……省略……
btnBlend_Images_Clickメソッド内でブレークポイントの設定(C#)

 この状態で、BlendImages_CSharpプロジェクトの右クリック・メニューから[デバッグ]−[新しいインスタンスを開始]を実行すると、次の画面が表示される。

BlendImages_CSharpプロジェクトの実行インスタンス

 赤枠の部分をダブルクリックすると、ファイル・オープン・ダイアログが表示される。ここでJPEGなどの画像ファイルを読み込む。Windows 7に付属しているサンプル画像を読み込ませると、次の画面のようになり、上部に配置されている[Parallel]ボタン(=並列処理でイメージ合成)および、[Sequential]ボタン(=単一スレッドでイメージ合成)の両方が有効になる。

2つの画像ファイルを読み込んだところ

 [Parallel]ボタンを押すと、並列処理の実行が開始されるが、先ほど設定したブレークポイントで実行が停止する。ブレークポイントで停止した状態で、Visual Studioのメニューバーの[デバッグ]−[ウィンドウ]メニューを開き、[並列タスク]と[並列スタック]というメニュー項目をそれぞれ選択する。

メニューバーの[デバッグ]−[ウィンドウ]−[並列タスク]/[並列スタック]を選択

 これにより、並列状態で実行しているタスクの状態を可視化された状態で確認できる[並列タスク]ウィンドウと[並列スタック]ウィンドウが表示される。[Parallel]ボタンを押すと、それぞれのウィンドウは以下のように表示される。

[並列タスク]ウィンドウ
現在起動しているタスク(=System.Threading名前空間Taskクラスのオブジェクト)の状態。

[並列スタック]の状態(スレッドで表示)
現在起動されているスレッドを可視化した状態。

 [Parallel]ボタンを押して並列処理した結果、合成された画像は以下のようになる(なお、合成処理時のロジックは同じなので、[Sequential]ボタンの実行結果も同じ画像になる)。

並列処理の実行結果

 [並列タスク]/[並列スタック]ウィンドウでは、このように並列タスクの状態が可視化できるので、ある時点で「どのスレッドがどこから起動されているか」という情報がつかみやすい。「意図していなかった場所で特定の関数が呼び出されていて、競合が存在していた」という状態も発見できるだろう。

 3回にわたってVisual Studio 2010のデバッガの基本機能、新機能、デバッグ方法の解説を行ったがいかがだっただろうか? ただし、これでもデバッグ作業は入り口で、ツールの使い方を示したにすぎない。

 リリースされた製品のモジュールで発生した障害解析などでは、現場に残された証拠(=ダンプやログ)の断片から原因を追究するという、推理とも似た作業を行わなくてはならない場合もある。本連載がそのときのデバッグ作業の助けになれば幸いである。End of Article

 

 INDEX
  [連載]Visual Studioデバッグ手法
  第3回 Visual Studio 2010による高度なデバッグを極める
    1. .dllファイル(=アセンブリ)のデバッグ
    2. リモート・デバッグ
    3. 別サーバのIIS上で実行されるプロジェクトのデバッグ
    4. コードからのデバッガ制御/Internet Explorer 8の拡張機能デバッグ
  5. 並列プログラムの可視化機能

インデックス・ページヘ 「連載:Visual Studioデバッグ手法」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH