問題タブ [mdbg]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pdb-files - mdbgを使用してpdbファイルをxmlに変換するには?
PDBファイルをXMLファイルに変換するには? 以下からソースを試してみましたが、exeを入力として取っています。利用可能なオープンソースのコンバーターはありますか?
c# - IMetaDataImport EnumMethods を使用して基本クラスの階層メソッドを取得する
MDBG サンプルを見てマネージド デバッガーを実装しようとしています。
MDBG は、指定されたスコープ内で関数名を解決できますが、基本クラスを考慮していません。
MDBG はこれを行っています:
Type.GetMethods() はオーバーライドされ、この実装があり、IMetaDataImport.EnumMethods を使用します。
問題は、m_importer.EnumMethods()が指定された型のメソッドを表す MethodDef トークンを列挙することですが、クラス階層のすべてのメソッドに興味があります。
クラス階層で定義されているすべてのメソッドを取得するにはどうすればよいですか? (もちろん、リフレクションなどの一般的な方法は使用できません。他のプロセスで定義された型を分析しているためです)
相互運用性と深い CLR/CIL 構造に関する私の限られた知識は、ここに進む正しい方法を見つけるための障害を生み出します。
アドバイス/提案は大歓迎です!
よろしく、
c# - ポリモーフィック クラスの機能評価
MDBG サンプルを使用してマネージド .NET デバッガーを作成しています。
MDBG サンプルは、指定されたインスタンスの最上位クラスでのみ動作し、クラス階層の奥深くを検索しません。階層を調べて、利用可能なすべてのメソッドを取得できました。しかし、そのような場合に問題が発生します。
問題は、castedToBase を ICorDebugValue として取得し、その ICorDebugValue2::GetExactType を照会するときに、Base クラスではなく A クラスを取得することです。その時点で、get_SomeProp を呼び出すメソッドを区別できなくなりました。ICorDebugValue2::GetExactType は、実行されたキャストを考慮し、基になる型を常に返すとは限りません。
どのメソッドを呼び出す必要があるかを理解するにはどうすればよいですか?
私が今やっているコードの一部を以下に示します。mdbgValueは castedToBase オブジェクトを表します。szTypedef は、予期される "Base" ではなく "A" を返します。
c# - マネージ .NET デバッガーと async/await メソッド
MDBG サンプルを使用してマネージド .NET デバッガーを作成しています。
簡単な非同期の例を考えてみましょう:
デバッガーでこのコードをデバッグすると、2 つの大きな問題が発生します。
- ローカル変数名が変更されている (CS$4$0000、CS$0$0001 など) か、見つからない (デバッガーのローカル変数で obj が見つからない)
ステッピングは予期せぬ動作をします: a) 3 行目の ステッピングなどは、通常、評価が完了するのを待ってから 4 行目に移動する必要があります。しかし、代わりにデバッガーは 13 行目にジャンプし、そこからステップ実行を続けます。ビデオでのステップオーバー動作
b) 3 行目のステップ インなどは、各行を ステップ インする必要があります: 3 行目 -> 12 行目 -> 13 行目 (しばらくハング) -> 14 行目 -> 15 行目 -> 4 行目。 13 行目では、デバッガーが評価結果を待機すると予想されますが、何らかの理由で 3 行目に進みます。その後、デバッガーは結果を待機し、実行は期待どおりに続行されます。ビデオでのステップイン動作
c)応答を待っている間にスケジュールされた他の作業がある場合、デバッガーはそのコードに切り替えます。たとえば、応答の待機中に経過したタイマーがある場合、13 行目以降の評価はそのタイマー コードで続行されます。代わりに、ビジュアルスタジオのように、デバッガーが現在のスコープに固執し、完全に実行されるまで離れないことを期待します。ビデオでの並列動作
これらの問題の原因を部分的に理解しています。コンパイラは、ロジックが MoveNext メソッド内にカプセル化されているネストされた構造体によって表されるステート マシンを作成します。少なくとも、a) と b) の場合に期待するようにステッピングが機能しない理由を説明しています。シンボルなしでいくつかのコードにステップインするとき (コンパイラによって生成されたコードのシンボルがない場合)、自分のコードに到達するために 1 つまたは複数のステップを実行しています。@Brian Reichleがこの関連する質問で提案したのは解決策です
ローカル変数名の変更については、 Stack Spilling("What's going" chapter)が原因であると思いました。しかし、ILDASM を使用してアセンブリを分析すると、生成された構造体の t__stack フィールドに何も保存されていません。したがって、非同期メソッドの変数名が永続化されない理由は推測できません。
それにもかかわらず、VisualStudio はこれらすべての問題を何らかの方法で回避しています。
では、管理された .net デバッガーは、async/await シナリオでステッピングとローカル変数の解決をどのように処理する必要があるのでしょうか?
この背後には多くの実装コードがありますが、どの部分を表示するのが適切かわかりません...
clr - ICorDebug を呼び出す方法
「MDbg Sample.zip」プロジェクトでは、COM モジュールから次の関数を呼び出します: [ComImport, Guid("3D6F5F61-7538-11D3-8D5B-00104B35E7EF"), InterfaceType((short) 1)] public interface ICorDebug { ...問題は、Guid("3D6F5F61-7538-11D3-8D5B-00104B35E7EF") を見つける場所です。regedit で見つけることができませんが、ICoreDebug インターフェイスを COM モジュールに接続する方法を教えてください。