連載:Visual Studioデバッグ手法

第2回 Visual Studio 2010の新機能「IntelliTrace」

亀川 和史
2010/07/28
2011/02/17 更新(Visual Studio 2010 SP1対応)
Page1 Page2 Page3 Page4

IntelliTraceとは?

 プログラムをテスト実行中に意図しない動作が発生した場合、どのような手順でその動作を検証・デバッグしているだろうか? 恐らく通常は、以下の手順で検証・デバッグしているのではないだろうか?

  1. 例外や、意図しない動作が発生する
  2. ソース・コード中の該当しそうなところを探し、ブレークポイントを設定する
  3. 再度同じ手順を実行する

 ところが、この「同じ手順を実行する」ということが、従来のVisual Studioでは非常に厄介だった。例えば、非常に長い間操作した結果で発生したバグの場合、そのときまでに入力したデータや手順をすべて覚えていないかもしれない。そうすると、同じ手順を再現するのは難しい。

 Visual Studio 2010 Ultimateに搭載された「IntelliTrace」(インテリトレース)という機能を使用すれば、この問題を解決してくれる。この機能は実行中の各種イベントなどを記録してくれるため、例外が発生した場合、その記録データから、例外発生時点の状態まで巻き戻してその例外を確認でき、非常に効率的なデバッグが可能となる。

 ただし、IntelliTraceは強力なデバッグ機能なのだが、使用するには以下の注意点がある。

  • マネージ・コードであること(アンマネージ・コードでは使えない)
  • x86で生成されていなくてはならない(64bit Windowsでの「Any CPU」やx64プロジェクトではVisual Studio 2010 SP1を適用する必要がある)
  • Visual Studioから「デバッグ実行」したプログラムであること。つまり、すでに起動しているプログラムに対して「プロセスにアタッチ」したデバッグやリモート・デバッグでは使用できない
  • Silverlightアプリケーション、Xboxアプリケーション、Windows Mobileアプリケーション、スクリプト言語、SQL CLRプロジェクトはサポートされていない
  • F#プロジェクトでは実験的なサポートにとどまる
  • 32bit OSでWindows AzureのIntelliTraceのログを参照するためには、KB983301のパッチ(=修正プログラム)が必要となる(このパッチはVisual Studio 2010 SP1には含まれている)。KB983301のパッチは「Code Gallery:KB983301 - Intellitrace hotfix to address issues outlined in Cloud Tools」(英語)からダウンロードできる

 Visual Studio 2010 SP1では、64bit対応したことで、SharePointアプリケーションもサポートされる。SP1でのIntelliTrace以外の変更点は「MSDN:Visual Studio 2010 SP1 の新機能」にまとめられているので、参考にしてほしい。

 これらの注意点を見て「使用条件が厳しい」と思うかもしれないが、それでもIntelliTraceを使う価値は十分にあるし、マネージド・コードのプロジェクトで、[F5]キーを押してデバッグ実行できるものであれば問題ないだろう。Visual Studio 2010 UltimateではIntelliTraceが有効状態で設定されているため、通常どおりデバッグ実行を行えばよい。

 IntelliTraceが有効である場合、例外が発生したり、ブレークポイントで停止させたりすると、IntelliTraceビューが表示される。注意点として、IntelliTraceの初期設定ではアプリケーションの完全な実行履歴は得られないため、必要に応じて[オプション]ダイアログのツリー表示の[IntelliTrace]から[IntelliTrace イベントと呼び出し情報]を設定する必要がある。次の画面は、その例だ。

完全な実行履歴を得るための[オプション]ダイアログの設定
既定では[IntelliTrace イベントのみ]が選択されている。呼び出し情報まで取得する場合、[IntelliTrace のイベントと呼び出し情報]を選択する。これにより、次回のデバッグから詳細な情報が採取できるようになる。ただし、エディット・コンティニュー機能が使用できなくなる。

 IntelliTraceであらかじめ定義されている採取イベントは以下のとおりである。△はイベントのうち一部が定義されている状態を表している。

イベント 初期採取 説明
ADO.NET ADO.NETのイベントを記録する
ASP.NET ASP.NETのイベントを記録する
コンソール × コンソール表示イベントを記録する
データ バインド × データ・バインドの完了イベントを記録する
環境変数 × 環境変数の取得および、評価イベントを記録する
ファイル × ファイルの読み書きイベントを記録する
ジェスチャ Webフォーム/Windowsフォーム/WPF上のコントロール操作に関する操作イベントを記録する
遅延初期化 × 遅延読み込みされた変数の初期化イベントを記録する
レジストリ × レジストリ・キーおよび値の読み書きを記録する
ServiceModel WCFからのWebサービス・イベントを記録する
スレッド × キューおよび、タスクのイベントを記録する
トレース × アサーション、Trace Write/WriteLine/formatのイベントを記録する
ユーザー プロンプト Windowsフォーム、WPFのMessageBox関係のイベントを記録する
ワークフロー ワークフロー・アクティビティの開始/終了を記録する
XML XMLドキュメントの読み込みイベントを記録する
IntelliTraceであらかじめ定義されている採取イベント

 これらの採取イベントは、次の画面のように[オプション]ダイアログのツリー表示の[IntelliTrace]−[IntelliTrace イベント]から有効/無効を切り替えられるので、必要に応じて変更してほしい。

採取イベントの有効/無効を切り替えるための[オプション]ダイアログの設定
[オプション]ダイアログのツリー表示の[IntelliTrace]−[IntelliTrace イベント]から、採取イベントの有効/無効を切り替えられる。
  採取するIntelliTraceイベントを設定する。
  採取するIntelliTraceイベントを初期状態へ復元する。

 IntelliTraceの情報はログ・ファイルの形でハード・ディスクに記録されている。記録対象のハード・ディスクの容量が少ない場合、次の画面のように[オプション]ダイアログのツリー表示の[IntelliTrace]−[詳細]から変更すればよい。ログ・ファイルの保存先のフォルダを変更する場合、その保存先のNTFSセキュリティの設定に注意しないと、IntelliTraceログ・ファイルの書き込みに失敗する可能性がある。

 このログ・ファイルはVisual Studioを終了するタイミングで自動的に削除される。従って、ファイルがずっと残り続けることはないので、安心してほしい。

[オプション]ダイアログにおけるIntelliTraceログ・ファイルの設定
[オプション]ダイアログのツリー表示の[IntelliTrace]−[詳細]から、IntelliTraceログ・ファイルに関する設定が行える。
  IntelliTraceのログ・ファイル(拡張子「.iTrace」のファイル)を保存する先のフォルダのパスを指定する。
  IntelliTraceのログを最大どのくらい容量まで保持するかを設定する。

 IntelliTraceを使用する場合、もう1つ注意しておきたい設定がある。通常、Visual Studioでのデバッグでは、高速化や部分信頼モジュールのデバッグのため、Visual Studioホスティング・プロセスを使用している(参考:「
.NET TIPS:VSホスト・プロセス(*.vshost.exe)とは何か?」「.NET TIPS:.vshost.exeファイルと.pdbファイルが生成されないようにするには?」)。

 Visual StudioからのIntelliTrace実行では、ホスティング・プロセスを使用していても動作はするが、以下の問題があるためお勧めできない。

(1)IntelliTraceが実行中に採取するログの概要(拡張子「.iTrace」のファイル)を表示できない
(2).iTraceファイルを表示しても(通常の.EXEファイルではなく)Visual Studioホスティング・プロセスの情報を表示してしまう

 この2点について、より詳しく説明しよう。

 まず、Visual Studioホスティング・プロセスを有効にした状態でIntelliTraceによるデバッグを実行した場合も、[オプション]ダイアログで指定した[IntelliTrace 記録の場所](=ログ・ファイルの保存先のフォルダ)に.iTraceファイルが作成される。しかし、メニューバーの[デバッグ]−[IntelliTrace]の配下にある[ログの概要の表示]は、グレーアウトしたままで選択することができない(次の画面を参照)。

Visual Studioホスティング・プロセスが有効な状態でのIntelliTrace実行では、[ログの概要の表示]が実行できない

 次に、[オプション]ダイアログで指定した[IntelliTrace 記録の場所](=初期値では「C:\ProgramData\Microsoft Visual Studio\10.0\TraceDebugging」)にある.iTraceファイルをVisual StudioのIDEで開くと、以下の画面のように表示される。ただし、Visual Studioホスティング・プロセス経由なので、ファイル名の一部に「.vshost」が付いている(例えば「WindowsApplication1.vshost_100604_164922.iTrace」のようなファイル名)。

Visual Studioホスティング・プロセス有効状態で実行したIntelliTraceログの概要ファイル
この例では、Visual Studioホスティング・プロセスが生成していたと思われるワーカー・スレッドがあるのが分かる。

 一方、Visual Studioホスティング・プロセスを無効にした場合、次の画面のようにメニューバーの[デバッグ]−[IntelliTrace]−[ログの概要の表示]が有効になり、Visual Studioから直接、IntelliTraceログの概要ファイルを開くことができる。

Visual Studioホスティング・プロセスが無効な状態でのIntelliTrace実行では、[ログの概要の表示]が実行できる

 次の画面は、実際に[ログの概要の表示]を実行したところ。

Visual Studioホスティング・プロセスを無効にした場合のIntelliTraceログの概要ファイル
こちらでは、Visual Studioホスティング・プロセスが生成していたと思われるワーカー・スレッドなどは生成されていない。
  この縦棒をダブルクリックすると、IntelliTraceデバッグ・セッションを開始できる。

 両者の違いとしては、Visual Studioホスティング・プロセスを有効にした場合に、ユーザー・コードには存在しないワーカー・スレッド(=3つ前の画像「Visual Studioホスティング・プロセス有効状態で実行したIntelliTraceログの概要ファイル」で赤枠で囲んだ部分)などまで記録されることである。このように自コードに組み込んでいないワーカー・スレッドなどが記録されることで、解析が混乱してしまうことが考えられる。

 従って、IntelliTraceを使用する場合、Visual Studioホスティング・プロセスを使用しないようにしておこう。

 IntelliTraceログの概要ファイルの利用方法は、参照できるだけではない。オレンジ色の縦棒の部分(上記の画面の)をクリックすると、そのままデバッグを開始することができる。また、チーム開発用のサーバ製品であるTeam Foundation Serverなどにバグを登録する際、.iTraceファイルを添付すれば、修正担当者側でそのままライブ・デバッグ(=現在実行中のデバッグ)を開始して、エラーになった状態を手元で再現できる。

 従来の開発作業において、どんなに再現手順を詳細に書いたとしても「再現しない」で終わっていた経験を持っている人も多くいるだろう。IntelliTraceの.iTraceファイルは再現したタイミングそのものの情報なので、相手側でもデバッグが可能になる。そのため、再現させるために行うやり取りは少なくなるだろう。

 以降では、IntelliTraceを使ったデバッグの実践方法を説明していく。


 INDEX
  [連載]Visual Studioデバッグ手法
  第2回 Visual Studio 2010の新機能「IntelliTrace」
  1. IntelliTraceとは?
    2. IntelliTraceでのデバッグ実践
    3. チーム開発におけるIntelliTrace
    4. Windows AzureとIntelliTrace

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

更新履歴
【2011/02/17】

 Visual Studio 2010 SP1に関する説明を追記しました。




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