Inspector XEの新機能
Inspector XEは、メモリーリークやスレッド間のデータ競合といった並列化処理を実装する際に発生する問題を解析するためのツールです。前バージョンであるインテル スレッドチェッカーに対して、以下のような新機能が搭載されています。
- スレッドエラーに加え、メモリーエラーの検出もサポート
- C++ Composer XEとの連携による、ソースコードの静的分析によるメモリー、スレッドエラーの検出のサポート
- .NETマネージコードの解析をサポート
なお、Inspector XEはインテル スレッドチェッカーからのバージョンアップということもあり、UIはParallel Studio 2011に搭載されたParallel Inspector 2011とはやや異なります。ただし、メモリーエラーやスレッドエラーの検出と、検出後の原因となったソースコードの確認の流れなどは、Parallel Inspector 2011と同様の流れで行うことができます。
今回は新機能である.NETのマネージコードの解析をサンプルで見てみましょう。
マネージコードのスレッドエラー解析
Inspector XEのマネージコード解析機能は、現在のところスレッドエラーのみに限られており、メモリーエラーの検出は行えません。
今回はマルチスレッドでデッドロックが起きるケースについて、解析を行ってみましょう。
リスト4は、リソースAとBを2つのスレッドが逆の順番で取り合うことにより、デッドロックが起きるケースです。スレッド1はリソースをA、Bの順に、スレッド2はリソースをB、Aの順に取得しようとしますが、実行タイミングによっては2つめに取得するリソースが別のスレッドによってロックされているため、リソースを取得することも、ロックしているリソースを解放することもできなくなってしまいます。
class Program
{
private static Object resA = new Object(); //リソースA
private static Object resB = new Object(); //リソースB
public static void Main()
{
Thread thread1 = new Thread(new ThreadStart(Thread1));
thread1.Start(); //スレッド1開始
Thread2(); //メインがスレッド2となる
}
//A,Bの順でロック
private static void Thread1()
{
lock (resA) //リソースAをロック
{
Thread.Sleep(1000);
lock (resB) //リソースBをロック
{
Thread.Sleep(100);
}
}
}
//B,Aの順でロック
private static void Thread2()
{
lock (resB)
{
Thread.Sleep(1000);
lock (resA)
{
Thread.Sleep(100);
}
}
}
}
Visual Studio 2010で以上のソースをビルドし、図1のような画面上部のInspector XEツールバーから、解析アイコンをクリックします。

表示される[Configure Analysis Type]画面では、[Analysis Type](検出する内容)を[Memory Error Analysis]と[Threading Error Analysis]から選択できます。今回はスレッドエラーを検出するため[Threading Error Analysis]-[Detect Deadlocks]を選び、[Terminate on deadlock]をチェックして[Start]ボタンを押します。このチェックは、デッドロック発生時にアプリケーションを終了させるためのものです。
アプリケーションの実行中、複数のスレッドによってデッドロックが発生したことをInspector XEが検出すると、自動的にアプリケーションを終了させます。
解析結果の収集が行われた後、図3のような検出結果画面が表示されます。画面上部(Problems部分)に問題が表示され、下部(Code Locations)に問題となるコードの箇所が表示されます。今回はDeadlockがProgram.csの4つの行で発生していることが確認できます。
該当する行をダブルクリックすると、以下のように該当する行が表示されます。
これまでネイティブコードに限定されていた並列化エラーの解析がマネージコードでも可能になったことは大きなメリットです。もちろんInspector XEではネイティブコードにおけるメモリーエラー、スレッドエラーの解析機能も向上していますので、並列化アプリケーションの実装の際に発生する問題の解決に役立つことでしょう。

![図2 [Threading Error Analysis]-[Detect Deadlocks]を選択する](http://cz-cdn.shoeisha.jp/static/images/article/5590/5590_Inspector02_s.gif)
![図3 Inspector XEによるエラー検出結果。[Deadlock]が検出される](http://cz-cdn.shoeisha.jp/static/images/article/5590/5590_Inspector03_s.gif)

