問題タブ [clr-profiling-api]
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.
.net - インプロセスでネイティブを IL 命令ポインターにマップする方法
.NET フレームワークのアンマネージ API を使用してインプロセスの .NET プロセスをプロファイリングする場合、StackSnapshotCallback 関数に提供されるネイティブ命令ポインターに相関する IL 命令ポインターを検索することは可能ですか?
おそらく明らかなように、現在のスタックのスナップショットを取得しており、スタック ダンプにファイルと行番号の情報を提供したいと考えています。Managed Stack Explorerは、クエリを実行してこれを行いISymUnmanagedMethod::GetSequencePoints
ます。これは素晴らしいことですが、シーケンス ポイントはオフセットに関連付けられており、これまでのところ、これらはメソッドの先頭からのオフセットであると想定しています (中間言語で)。
David Broman は、彼のブログ投稿Profiler stack Walking: Basics and beyondへのフォローアップ コメントで、このマッピングは を使用して実現できることを示していますICorDebugCode::GetILToNativeMapping
。ただし、このインターフェイスを取得するには、別のデバッガー プロセスから自分のプロセスにアタッチする必要があるため、これは理想的ではありません。
これらのスナップショットを作成している間も、Visual Studio デバッガー内からアプリケーションを引き続き実行できるようにしたいので、その手順は避けたいと思います。出力ウィンドウの行番号をクリックして、問題のコードに移動しやすくなります。
機能は可能です....管理されたコード内で自由に行番号付きのスタックトレースを吐き出すことができます.唯一の問題は、アクセス可能かどうかです. また、パフォーマンス上の理由から、スタックの実際のダンプを遅らせる必要があるため、System::Diagnostics::StackTrace
or機能を使用したくありません....そのため、後でメソッド名とコードの場所を解決するためのコストを節約することが望ましい.. System::Environment::StackTrace
. ネイティブ フレームとマネージド フレームを混在させる機能。
clr - 「Cor」は何の略ですか?
プライマリ CLR dll である mscorlib.dll でそれを見てきました。また、この CLR プロファイリング API インターフェイスである ICorProfilerCallback2 で見てきました。
ちょっと興味があります: 「Cor」という言葉は何の略ですか?
.net - CLR プロファイリング API を使用して IL を書き換えるには、独自のアンマネージ IL ライブラリを作成する必要がありますか?
私は CLR プロファイリング API に関するいくつかの記事を見てきましたが、それらの記事の多くは SetILFunctionBody() を呼び出して実際の IL 書き換えを行うことについて述べています。ただし、実際のメソッド IL バイトを書き換えるために何を使用できるかを正確に説明している記事はありません。IL を作成できる管理されていないライブラリはありますか、それとも自分で作成する必要がありますか?
.net - プロファイラーがアタッチできないのはなぜですか?
.NET アプリケーション用の小さなプロファイラーを作成しました。インターフェースを使用していICorProfilerCallback2
ます。
プロファイラーは、.NET 2.0 アプリケーションにアタッチして適切に機能しますが、.NET >2.0 (3.0、3.5、4.0) では機能しません。.NET 4.0 でコンパイルされた exe を起動しても何も起こりませんが、.NET 2.0 ではプロファイラーが起動します。マネージドexeを実行する前に、次の変数を設定しています
なぜこれが起こるのでしょうか?それも入らないDllMain
c# - C# から直接プロファイリング API を使用することは可能ですか?
.NET プロファイリング API (など) を使用したいだけですICorProfilerCallback
が、同時に C++ を扱いたくありません。私はしばらく見回してきましたが、C# の例は見つかりませんでしたが、最も興味深い部分は C++ を使用して記述されている C# + C++ です。
c# - CLR プロファイラー: DefineAssemblyRef の使用に関する問題
アプリケーション関数をフックする CLR プロファイラーを作成したいと考えていますGetILFunctionBody/SetILFunctionBody
。
このコードでは、DefineAssemblyRef を使用して c# dll (IL コードで使用するため) をインポートしたいと考えていますTrue
。dll に署名する必要がありますか? グローバル アセンブリ キャッシュ (GAC) にインストールする必要がありますか?
.net - .NET プロファイラー (ICorProfilerCallback) で一意のメソッド ID を取得するには?
.NET プロファイリング API (ICorProfilerCallback) を試してみたところ、FunctionID が安定していないことがすぐにわかりました (再利用される可能性があります。 http://msdn.microsoft.com/en-us/library/bb384619.aspxを参照してください)。それは大丈夫です。モジュール バージョン ID (MVID) とメソッド トークン (mdTokenDef) を使用してメソッドをエンコードするというアイデアを思いつきました。
ただし、これはスペースが無効であることが懸念されます (GUID の 16 バイト + トークンの 4 バイト)。現在、ある種のハッシュを使用することを検討しています(32ビットハッシュで十分だと思います)。
メソッドをエンコードするより良い方法はありますか?
c++ - 動的ピンボークのプロファイリング
私はMSILプロファイラーに取り組んでおり、インターフェイスのコールバックで問題が発生しManagedToUnmanagedTransition
ましたUnmanagedToManagedTransition
。ICorProfilerCallback
取得したいのは、呼び出されているメソッドに関する情報(メソッドが存在する名前とモジュール名)です。
これまでのところ、正常に機能していました。いわゆる動的ピンボークが発生するまで(詳細はhttp://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_で説明されています。 .aspx)
このシナリオでIMetaDataImport::GetPinvokeMap
は失敗します。またIMetaDataAssemblyImport::GetAssemblyProps
、アセンブリの名前として「dynamic_pinvoke」を返します。
モジュール名(.dll)とダイナミックピンボークを介してピンボークされている関数の名前を取得するにはどうすればよいですか?
c++ - CLR プロファイラー: COM スタイルのキャストおよび派生インターフェイスからの関数の呼び出し
特殊な CLR プロファイラーを開発する必要があります。ICorProfilerCallback
CLR プロファイラーは、現在 5 までの新しいバージョンを実装する COM サーバーとして実装する必要があります。プロファイラーの初期化は、コールバック メソッドで行われますInitialize(IUnknown* pICorProfilerInfoUnk)
。QueryInterface
これにより、提供されたIUnknown
オブジェクトに対して を実行し、インターフェイスへのポインターを取得する機会が与えられICorProfilerInfo
ます。.NET 4.5 の時点でICorProfilerInfo
、 、ICorProfilerInfo2
、ICorProfilerInfo3
、およびがありICorProfilerInfo4
、新しいバージョンごとに追加機能が提供されています。理想的には、利用可能な最新バージョンへのポインターを取得し、vtables に実際のオブジェクトが何であるかを把握させたいと考えています。
すべての場合において、返されたインターフェイスへのポインターは同じ variablem_pICorProfilerInfo
であり、型はCComQIPtr<ICorProfilerInfo>
です。次に、メソッドを実装するオブジェクトの実際の型を知らずにメソッドを呼び出します。
これは私に2つの質問を導きます:
- COM / ATL コンテキストでは、派生インターフェイスを取得し、上記のような親インターフェイスに格納して、そこから関数を呼び出すことは安全ですか?
- 親インターフェイスは、明らかに派生インターフェイスの関数に関する知識を持っていません。ポインターが派生インターフェース ( など
ICorProfilerInfo2
) であるかどうかを確認し、そのようにキャストするにはどうすればよいですか?
これまでのテストでは、#1 は概ね問題ないようです。しかし、確認またはアドバイスを希望します。ポイント#2についてははるかに不確かです。たとえば、ICorProfilerInfo
has a SetEnterLeaveFunctionHooks
function while ICorProfilerInfo2
has a SetEnterLeaveFunctionHooks2
function. 次の疑似コードのようなことをしたいと思います。
これをどのように達成できるかについてのアドバイスをいただければ幸いです。