4

Visual Studio 拡張機能パッケージのカスタム ツール ウィンドウは、VS2012 および VS2013 のデバッグ セッション中にカスタム式を評価することになっています。最終的な目標は、グラフィカルなウォッチ ウィンドウを構築することです。したがって、式の結果の値をデバッグ エンジンからフェッチする必要があります。

評価は正常に機能します

IDebugStackFrame2 -> IDebugExpressionContext2 -> ParseText 
IDebugExpression2 -> EvaluateSync -> IDebugProperty2

ここでの最初の問題: Visual Studio 2013ParseText()ではエラーが正しく報告されません。ただし、IDebugProperty2取得したものは有効です (有効な式の場合)。VS2012 では、無効な式に対して適切なエラーが発生します。

ここから本当の問題が始まります。結果の Property2 は、複雑なカスタム オブジェクトを表します。それを視覚化するには、その基本クラスの 1 つから特定のプロパティを取得する必要があります。私の現在の試みではIDebugProperty2.EnumChildren()、Visual Studio の [ローカル] ウィンドウで行うのと同じように、メンバーをクラス階層の適切な場所まで移動するために使用しています。

[result] -> base -> Raw -> base -> Non-public Members -> [private field] ... a.s.o.

これは何とか機能しますが、次の問題が発生します。

問題 1: 複雑なオブジェクトの内部メンバーを取得する

EnumChildren() から受け取ったメンバーとその順序は、いくつかの要因に依存しているように見えますが、それは私には明らかではありません: * オブジェクトに Debug Visualizer が接続されていますか? (VS2013 は EnumChildren の enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE_RAW を無視し、美化されたバージョン + 「Raw View」ノードを返します。VS2012 は期待どおりに動作します) *「非公開メンバー」ノードは表示されていますか? ある場合もあるし、ない場合もある - 依存するものからはわからない?

これは、複雑な式の結果オブジェクトの内部メンバーを取得する非常にハックな方法であることが判明しました。より良い方法は何ですか?IDebugProperty3 といくつかのデバッガ ビジュアライザのトリックを使用していますか? どんなポインタでも素晴らしいでしょう。

問題 2: VS2012 がメモリ バイトの提供に失敗する

結果オブジェクトのプライベート メンバーをIDebugProperty2.GetMemoryBytes()取得したら、その値 (プレーンな System.Array) を「シリアル化」し、カスタム ツール ウィンドウに転送するために使用します。これは VS2013 では機能しますが、VS2012 ではIDebugProperty2.GetMemoryBytes()常に VS_Constants.S_FALSE を返します。私はここで本当にアイデアがありません。VS2012 にはメモリ ウィンドウがあるため、ここでもこれを機能させる方法が必要ですか? 私は何が欠けていますか?

メモリ API のクエリに使用されるコード:

IDebugMemoryContext2 memCtx = null;
IDebugMemoryBytes2 memBytes = null;

// getting the memory context is working ok
if (tmpProperty2.GetMemoryContext(out memCtx) == VSConstants.S_OK

  // VS2012 fails here, always returns S_FALSE, memBytes remains null:
  && (tmpProperty2.GetMemoryBytes(out memBytes) == VSConstants.S_OK)) { 
  ...

もう少しコンテキスト:

OS: Windows 8 and 8.1 
Visual Studio: 2012 / 2013
Tool Window built with MPF (C#) in VS2013, (removed all vers. 12 references from the package before deploying to VS2012)
Debug engines: C# and Visual Basic
4

0 に答える 0