デバッガビジュアライザと型

VisualStudio2005のデバッガは非常に強力ですが、強力なだけではなく自らがデバッガの能力を拡張することが可能となっており、そのデバッガの拡張のため機能の一つが標題に書いたデバッガビジュアライザです。

デバッガビジュアライザ(以下ビジュアライザ)とは簡単に言うとアプリケーション等のデバッグ時に、現在対象としている俺様オブジェクトの型を視覚化するためのアドオンとその仕組みのことを指します。

詳しくはこちらの記事を参照のこと。

Visual Studio 2005 Beta 1 によるデバッガ ビジュアライザの作成 (※この記事はVisualStudio2005β1を前提に書かれています)

Creating a Debugger Visualizer Using Visual Studio 2005 Beta 2


実際にビジュアライザの実装の例を紹介している記事がCodeProjectに掲載されています。

DebuggerVisualizers - Image Debugger Visualizer using Visual C#(※この記事はVisualStudio2005β1を前提に書かれています)

Creating a Debugger Visualizer Using Visual Studio 2005 Beta 2

これらの記事をみると解りますがビジュアライザを書いてインストールする事自体は、非常に簡単です。実際私もビジュアライザを書いてみましたがなるほど、サンプルで紹介されている簡単なクラスであればすぐに独自の視覚化を提供できるっぽいです。しかし、これら記事にはあまりはっきりと書かれていないので見落としがちですがビジュアライザの対象となる型の選定には注意が必要でした。

  • ビジュアライザで視覚化する型に関する注意

ビジュアライザはデバッガ上で動作しますがデバッグの対象にしているオブジェクトはアプリケーション上(便宜上デバッギーと呼びます)で動作しています。ここで言うデバッガとデバッギーは違う世界、.NETの世界の言葉で言うと異なるアプリケーションドメインで動作していることになります。
.NETに詳しい方であればこの辺で既にお気づきだと思いますがビジュアライザで視覚化されるオブジェクトはデバッギーからデバッガへと異なるアプリケーションドメイン間で通信されるのです。具体的にはそのオブジェクトの型がMarshalByRefObjectから派生しているか、または Serializable としてマーク付けされている必要があるということです。

俺様オブジェクトがシリアライズ可能ではなかった場合はどうすれば良いのでしょう。

上記リンクのCodeProjectの記事の2番め(Creating a Debugger Visualizer Using Visual Studio 2005 Beta 2)の実装にヒントがあります。
オブジェクトそのものがシリアライズできないのであれば、オブジェクトを構成するのに最低限必要な情報から構成したプロキシ(これは必ずシリアライズ可能である必要がある)を用意して、デバッガとデバッギーがプロキシをやり取りすれば良いのです。プロキシが適切であればデバッガはプロキシから元のオブジェクトの正しい型を復旧して、ビジュアライザを起動できるでしょう。