OzCode C#デバッギング支援ツール

OzCodeはC#デバッギングを飛躍的に向上させる、革新的なVisual Studioエクステンションです。 C#用Visual StudioエクステンションOzCodeでバグフリーの世界を体験して下さい!

クミナスは、OzCodeの日本における正規販売代理店です。導入時コンサルティングを含めた技術サポートも提供しています。

ozcode

OzCode の主な機能

Linq のデバッグ

LINQ は非常に優れたツールです。LINQ のおかげで強力で、簡潔、表現に富んだコードを書くことができますし、またそういうコードを読んだりメンテナンスしたりするときは喜びさえ感じます。しかし、LINQ を使う時の唯一の問題は可読性の代わりにデバッグのしやすさが犠牲になっていることです。F10 キーで LINQ を使ったコードの行をステップオーバーした途端、膨大な量の複雑なロジックが実行されますが、実際に起きていることのほとんどは全く分りません。LINQ をデバッグしているときは、ブレークポイントを使ったり手動のステップ実行をするのは時間の無駄と言っても過言ではありません。 OzCode の革新的な LINQ デバッグ可視化ツールは、LINQ のパイプラインに異なるアイテムがどのように引き渡されていくかを確認することができ、また、個々のラムダ式の戻り値を見ることができます。もちろん、Reveal や検索などの OzCode の他の強力なツールを併用することも可能です。

数値インジケータ

デバッグ中に実行中の行(黄色の行)が LINQ クエリに達したとき、各 LINQ オペレータの横に出力されたアイテムの数を示すインジケータが表示されます。

これらのインジケータによって、各オペレータがアイテムをいくつ使っているか、何個出力されたか、が一目で分るようになっていて、どのオペレータを確認すべきか判断するときに役立ちます。

LINQ DataTip

数値インジケータをクリックすると OzCode は LINQ デバッグモードへ切り替わり、 LINQ DataTip ウィンドウを開いて対象のオペレータが出力したアイテムを表示します。DataTip の “before/after” ボタンをクリックするとオペレータによって出力されたアイテムと使われたアイテムの間を切り替えて表示することが出来ます。

コレクションのアイテムをひとつクリックすると、LINQ パイプラインを通じて引き渡された特定のアイテムとして各ラムダ式が何を返したかがヘッドアップディスプレイに都度表示されます。また、マウスホイールを数値インジケータの上で動かすと、デバッグコードの値が即座に変化するのを確認しながらアイテム間を前後に素早く移動することができます。

LINQ 解析ウィンドウ

DataTip ウィンドウから、またはデバッグ対象のクエリの左に表示されるラムダアイコンをクリックして、詳細な解析ツールのウィンドウを開くことができます

対象のオブジェクトを見つけるのに検索や Reveal ツールを使ったり、オペレータのパンくずリストで LINQ パイプラインの間を移動したりして、アニメーションで可視化された LINQ クエリのフロー表示を活用することができます。

LINQ クエリにおける例外を理解する

もっともデバッグが難しい不具合のひとつは複雑な LINQ クエリの奥底から発せられる例外です。これは、ほとんどデバッグ不可能です。OzCode は例外が発生する前に数値インジケータを赤くハイライトして、このような例外が発生することを警告し、LINQ DataTip や LINQ 解析ウィンドウを使用してどのアイテムが例外を発生させているか調査することを可能にします。

“Fluent” および クエリシンタックスのサポート

コレクションにクエリを発行してフィルタしたり、コレクションを操作したりするために LINQ クエリを使用する場合、開発者には二つの選択肢があります:ラムダベースの Fluent API と SQL 風のクエリ式です。 どのシンタックスを使用するかは開発者の好みですが、問題の性質にも影響します。Fluent シンタックスは簡潔で、シンプルなクエリに向いています。一方、より複雑なクエリはクエリシンタックスの方が向いています。クエリシンタックスでは let キーワードや複数の from 句を用いてより複雑なデータ処理を行うことができます。 OzCode はどちらの LINQ シンタックスも完全サポートしています。クエリシンタックスを使用している場合は、OzCode はどのアイテムが from 句から引き渡されているか、どの値が let 式によって各アイテムに対して計算されたかなどをハイライト表示します。

エクスポート

エクスポートは デバッグ中のオブジェクトインスタンスの内容をテキスト形式に変換してファイルやクリップボードに保存してデバッグセッションの後で調査などに利用するための機能です。

エクスポートを使えば、開発者はオブジェクトを捕まえて JSON や XML、C# のコードに保存し、デバッグ時の値を使用したユニットテストを作成することができます。

エクスポートされたインスタンスを保存したり、クリップボードにコピーすれば、インスタンスの状態を再現して解析したり、外部のDiffツールを使用して比較したりすることができます。 JSON出力では、OzCodeは業界標準のNewtonsoftJson.NETシリアライザを使用していますので、デシリアライズして結果を確認したりするのがとても簡単です。

ヘッドアップディスプレイ

調査

複雑な式をデバッグするのはいつも容易な事ではありません。 メソッド呼び出しの戻り値をどうやって可視化するか? 入り組んだ if 文の中でそれぞれの条件式がどう評価されたか?コードを単純化、あるいは個別の結果を保存するための変数を追加することなく、こうした疑問に答えるのは困難です。しかし OzCode の強力な “Simplify” ビジュアリゼーションを使えば、すぐに自分のコードで何が起こっているのかを把握することができます。式をステップオーバーする時は、赤/緑色のコードハイライトで、どの式が偽/真を返したかを教えてくれます。 赤色の✖や緑色の✔は式全体の結果を表します。

Simplify ボタンをクリックするだけで、その式がすぐにビジュアル化され、さらに個々の式の結果を掘り下げて見ていくことができます。

履歴の閲覧

Simplifyの最も優れた点は、自分のコード実行の履歴ビューを表示できることです。 1行のコードをステップオーバー (F10) する度に、新たな Simplify ボタン が表示され、その時点の状態を見ることができることができます。 ステップオーバーしすぎても、最初からデバッグをやり直す必要はありません。

Simplify でタイムトラベルするためのキーボードショートカット

キーボード派のために、手を離すことなくタイムトラベルができるよう、便利なショートカットを用意しました。「Alt+Q」で現在の行を視覚化、「Alt+↑」、「Alt+↓」を使って対象の行を移動できます。デバッグしている間は「Alt」キーを押したままで数字「1-9」を押下することで、視覚化するステートメントを選択できます。

マジックグランス

マジックグランスは、過した各行のサマリーを表示することで、コードの見通しを驚くほど向上させます。

将来を予測

OzCode v2.0は、コード実行の予測分析(我々はそれを未来予測と呼んでいます!)を実行します。 次の switch 文で、OzCode は未来を予測します:F10 でステップオーバーしたとき、どの文が実行されるが矢印で示され、無関係のコードパスが半透明になっているのがわかります。

ライブコーディング

Predict(予測)は、デバッグしている時に行った変更についてすぐにフィードバックを行うことで、小さなつまらないコーディングのミスを素早く修正できます。これこそ「ライブコーディング」と言えるでしょう。VS2015 を利用している場合、Predict は LINQ クエリのような、より複雑な式を予測することさえ可能になります。

ブレークポイント

条件付きブレークポイント

条件付きブレークポイントは、デバッグ作業をより生産的なものにしてくれますが、OzCode 無しでは、それを使うのが厄介に感じます。 OzCode を使えば条件付きブレークポイントの追加は超簡単です。 1 クリックで特定のプロパティ値に基づいて条件付きブレークポイントを設定し、述語をあらかじめ挿入してくれます。

ブレークポイントにさらに述語を追加したいのであれば、ショートカットを使いましょう。適当な変数の上にマウスを移動し、Add Condition ボタンをクリックします。

変数変更時のブレーク

把握するのが最も難しいバグは副作用を伴うものです。 プログラムの実行中のある時点でいくつかのオブジェクトが無効な状態になってしまい、それが正確にいつどこでそうなったのか見当がつかない場合、どうしたら良いでしょうか? デバッガで値を検査しながら問題のプロパティ値を見つけたら、Magic Wand を使って When Set… > Break を選択します。 すると次回プロパティの値が変更された際、OzCode はデバッガに割り込み、プログラムの状態を検査し、問題の値が最初にどこで設定されたのかを正確に把握できるようになります。このセッターブレークポイントは、通常のプロパティと自動プロパティの両方で使うことができ、自分のソースコード中でないプロパティにもセッターブレークポイントを追加することができます。

例外

例外の追跡

OzCodeがなければ例外を調査することは退屈な仕事です。内部例外の痕跡をたどって、長いコールスタックをスクロールし、エラーの根本原因を調べるため関連データをあちこち探っていく… OzCodeを 利用すれば、例外に関するすべての関連情報は便利なツールウィンドウで表示されます。 超便利なパンくずリストで各内部の例外をたどり、さらに Visual Studio 内から Google やstackoverflow で検索することもできます。

例外の予測

OzCode の Predict 機能は起こりうる例外について警告します。 しかも、それだけではありません。例えば、OzCode は今まさに起きようとしている NullReferenceException を検出した場合、どの式が例外を引き起こすか、正確に赤いハイライトで示します。

OzCodeの予測例外分析は、例外が発生する前に、エディット&コンティニューを使って、非常に簡単に問題を修正することができます。

トレース

手強い問題のデバッグ、特にレガシーコードやマルチスレッドを多用したシナリオをデバッグしている時に、システムが現在実行していることを把握するためにコードを辿って見ていくというのは、頭の中で一度に 12 個のボールでジャグリングしようとしているようなものです。 OzCode を利用すれば困難な状況に陥った際も、プログラム実行中の重要なポイントで動的ロギングを簡単に追加し、OzCode がVisual Studio に追加した完璧な統合ログビューアを使用して、その出力を表示することができます。もはや簡単なトレースを追加するたびに、デバッグを停止し、ログコードを追加し、リビルドする必要はありません。

トレースしたいと思う値に “Create Tracepoint” コマンドを使用します。トレースポイントはブレークポイントのようなものですが、プログラムの実行を中断する代わりにトレースメッセージを書き込みます。

次に、“Add To Tracepoint” ボタンでバグに関連すると思われるどのような情報でも追加していきます

最後に、トレースメッセージがトレースポイントビューアーに入ってくるの確認します:

クイックアタッチ

多くのプロジェクトでは F5 キーを押すだけではデバッグセッションを開始することができません。 こうしたプロジェクトでは「プロセスにアタッチ」機能を使用して、たくさんのプロセスのリストから正しいプロセスを見つけ、接続する必要があります。 後からデバッグセッションを再起動すると、再びすべて最初からやり直さなければなりません。何度も何度も…

OzCode に搭載されている QuickAttach を使用すれば、プロセスへのアタッチを素早く行うことができます。 QuickAttach ウィンドウには、直近にアタッチしたプロセスの一覧が表示されます。 Pin ボタンをクリックすると、そのプロセスにショートカットキーを付けることができます:

これで設定終了です。 ‘w3wp.exe’ に接続したい時は「Shift+Alt+1」を押すだけで、いつでも接続出来ます。アタッチしたいと思うプロセスが “Recently Attached” リストにない場合は、いつでもプロセスの UI プレビューを見ながら検索することができます。

OzCode は、どのウェブサイトにアタッチするかを表示してくれるので、とても簡単に IIS アプリケーションプールへアタッチすることができます。

検索

オブジェクトとコレクションをデバッグする場合、特定のプロパティやフィールド、またそこに保持された値を主に検索することでしょう。残念ながら、ほとんどの場合、多数のクリックやスクロール、デバッグ用コードの記述が必要になります。 単純な構造でもアイテムを見つけることは容易ではありませんし、ましてや複雑なオブジェクトグラフにおいては言うまでもありません。しかし、OzCode の “Search” 機能は、これはもはや真実ではありません。オブジェクトグラフの複雑性やコレクションのサイズに関わらず、あっという間に検索することができます。

Foresee

foreach ループをデバッグしている場合、ループの現在位置を判断する方法、コレクションの特定の項目に移動する方法といった、よくある問題にぶつかる可能性があります。 Visual Studio は、これらの疑問に答えるための方法を提供していますが、それは決して簡単ではありません。OzCode の革新的な “Forsee” 機能を利用すれば、foreach ループを扱うことがシンプルかつ直感的になります。 Foresee は、ループ内のどこにいるかの追跡を支援するデバッグビジュアライザーで、コレクション内の特定の項目への移動を可能にします。 すでに列挙された項目、現在の項目さらに今後列挙される項目を含め、コレクションの視覚的表示を可能にします。コレクション内の特定のアイテムに興味がある場合は、項目を右クリックし、‘Run to item’ を選択すると、ループが実行され希望する項目で中断します。 もはや条件付きブレークポイントを設定する必要はありません。

※Visual Studio の制限により、Foresee 機能は、現在Visual Studio 2013 でのみサポートされています

比較

ファイルを比較したい時には、相違点を視覚化する差分アプリケーションを使用します。 残念ながら、2 つのオブジェクトを比較する必要がある時は、自分の目と記憶を信じなければなりません。 OzCode の比較機能では、目を細める時間を少なくし、クリックだけでオブジェクトとコレクションを比較できます。結果は、サイドバイサイドで表示され、ツリービューを使って 2 つのオブジェクトの相違点と同一点を把握することができます。

一度オブジェクトを比較対象に選択すれば、OzCode は他のローカル変数やフィールドから比較可能なオブジェクト(同じ型、または同じ基底の型をもつもの)をハイライトします。

外部 Diff ツールの利用

2つの長い文字列を比較する場合、たとえば、XML や JSON を比較する場合、比較ツールはお気に入りの Diff ツールを自動的に起動して、簡単に比較作業を行うことができます。

OzCode > Options で Visual Studio の標準 Diff ツールを指定することも、外部の Diff ツールを指定することも可能です。現在 Beyond Compare (v3 or v4)、KDiff、WinMerge、Araxis Merge、Tortoise がサポートされています。

スナップショットの比較

解決の難しいバグの一つに、不可解な副作用を持つ物があります。たとえば、オブジェクトを受け取ってそれを何度もコピーして変化させる長く複雑なメソッドがあるとします。この時実際にどのオブジェクトが変更されたか分りますか? たくさんのメンバを持つクラスがあって、さらにメンバにクラスが含まれている場合、違いを見つけ出すのは困難です。比較ツールを使えば、オブジェクトの状態を保存して、デバッグ中にオリジナルと比較することができます。関数を実行した後で Compare to Snapshot オプションを使用して違いを確認することができます。

あるオブジェクトのスナップショットを保存すると、デバッグセッション中保持されます。オブジェクトのスナップショットを保存すると、デバッグセッションを停止させたり、Visual Studio を終了させた後でも保存したスナップショットを比較することができます。

Reveal

オブジェクトには多くのプロパティがありますが、デバッグする時にそのすべては役に立ちません。 通常いくつかを選んで注目します。たとえば Customer クラスを考えたとき、ID とユーザー名のプロパティに注目したいでしょうし、3 次元空間内のポイントの場合は、X、Y、Z フィールドに注目したいでしょう。OzCode の “Reveal” 機能を使い、必要なデータに集中できます。注目したいプロパティにスター(オブジェクトの右隣に表示されます)を付けます。 例えば、Customer オブジェクトのコレクションについて、それぞれの姓名に注目したい場合、名と姓のプロパティにスターを付けると、コレクションの全てのオブジェクトはそのすぐ横に指定したプロパティを表示します。 何にスターを付けたかは、複数の Visual Studio ソリューションファイルにまたがってデバッグセッション中保持します。

カスタム式

デバッグする場合、必要とする情報はオブジェクトのフィールドおよびプロパティに含まれていないことがあり、むしろ、それはオブジェクトに基づく計算や式であったりします。 このように、特定のデバッグセッション用に別のプロパティのセットを持ちたいと思うことがあるかもしれません。

例えば、ゲームにおいてプレーヤーオブジェクトを見ている時に、そのインターフェイスにそのようなプロパティを追加しないで、最も近くの敵からの距離を参照したいと思うことがあるでしょう。

カスタム式を使えば、オブジェクトのタイプに複数のカスタム式を作成することができ、それらはそのタイプの他のメンバーのように表示されます。 最も興味のあるものには、スターを付けることもができます。

例えば、Customerクラスにはそのプロパティの中に給与履歴があり、バグを修正するために本当に参照する必要があるのが特定の年の顧客の支払うべき税金である場合、単に顧客変数に“Add Custom Expression”オプションを使用し、参照したいと思う式を記入します。 追加した式は、式の値を含む顧客クラスのプロパティとして表示されます。

コレクションのフィルタ

コード上でコレクションをフィルタすることは比較的簡単であり、多くの方法があります。 しかし、デバッグ中はどうしたらよいでしょうか?例えば、Customer オブジェクトのコレクションに対して35 歳以上の者にフィルタをかけたいとします。 Visual Studio のイミディエイトウィンドウやウォッチウィンドウは、ラムダ式をサポートしません。 OzCode のフィルターコレクション機能を使えば、任意のコレクションに対してフィルタ式を適用することができます。 問題を解決するために、Customer コレクションを選択し、そのフィルタを “DateTime.Today.Year-[obj].Birthday.Year > 35” のように設定します。Enter キーを押し、すぐに確認します。 一度コレクションをフィルタリングすると、他のすべての機能はフィルタリング結果に対して動作します。

クイックアクション

OzCode のクイックアクションは、現在のコンテキストに応じて、最も関連性の高いアクションを提供します。クラスのすべてのメソッドにブレークポイントを追加したい、特定のメソッドへのすべての呼び出しをトレースしたい、コードの特定の行にすばやく移動したい、といった操作をクイックアクションで自動化します。Alt + Shift + D を押すか、マジックワンドをクリックしてください。

すべてのインスタンスの表示

OzCode は、メモリ上の特定のオブジェクトを簡単に見つけてくれます。“Show All Instances of Type” を開くと、現在メモリ内にあるその型の全てのオブジェクトを見ることができます。 なぜそのオブジェクトがメモリ上にまだあるのか、この値を含むオブジェクトは存在するか、といったことを、OzCodeの新しくエキサイティングな検索ツールは簡単かつ瞬時に、疑問に思ったこと以上のことを教えてくれます。

製品に関するお問い合わせ

本製品に関してのお問い合わせはこちらのフォームよりお問い合わせください。

お問い合わせフォーム

いますぐダウンロード

DjVuブラウザプラグイン