問題タブ [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.

0 投票する
2 に答える
1612 参照

.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::StackTraceor機能を使用したくありません....そのため、後でメソッド名とコードの場所を解決するためのコストを節約することが望ましい.. System::Environment::StackTrace. ネイティブ フレームとマネージド フレームを混在させる機能。

0 投票する
2 に答える
6174 参照

clr - 「Cor」は何の略ですか?

プライマリ CLR dll である mscorlib.dll でそれを見てきました。また、この CLR プロファイリング API インターフェイスである ICorProfilerCallback2 で見てきました。

ちょっと興味があります: 「Cor」という言葉は何の略ですか?

0 投票する
5 に答える
800 参照

.net - CLR プロファイリング API を使用して IL を書き換えるには、独自のアンマネージ IL ライブラリを作成する必要がありますか?

私は CLR プロファイリング API に関するいくつかの記事を見てきましたが、それらの記事の多くは SetILFunctionBody() を呼び出して実際の IL 書き換えを行うことについて述べています。ただし、実際のメソッド IL バイトを書き換えるために何を使用できるかを正確に説明している記事はありません。IL を作成できる管理されていないライブラリはありますか、それとも自分で作成する必要がありますか?

0 投票する
1 に答える
694 参照

.net - プロファイラーがアタッチできないのはなぜですか?

.NET アプリケーション用の小さなプロファイラーを作成しました。インターフェースを使用していICorProfilerCallback2ます。

プロファイラーは、.NET 2.0 アプリケーションにアタッチして適切に機能しますが、.NET >2.0 (3.0、3.5、4.0) では機能しません。.NET 4.0 でコンパイルされた exe を起動しても何も起こりませんが、.NET 2.0 ではプロファイラーが起動します。マネージドexeを実行する前に、次の変数を設定しています

なぜこれが起こるのでしょうか?それも入らないDllMain

0 投票する
1 に答える
5725 参照

c# - C# から直接プロファイリング API を使用することは可能ですか?

.NET プロファイリング API (など) を使用したいだけですICorProfilerCallbackが、同時に C++ を扱いたくありません。私はしばらく見回してきましたが、C# の例は見つかりませんでしたが、最も興味深い部分は C++ を使用して記述されている C# + C++ です。

0 投票する
1 に答える
934 参照

c# - CLR プロファイラー: DefineAssemblyRef の使用に関する問題

アプリケーション関数をフックする CLR プロファイラーを作成したいと考えていますGetILFunctionBody/SetILFunctionBody

このコードでは、DefineAssemblyRef を使用して c# dll (IL コードで使用するため) をインポートしたいと考えていますTrue。dll に署名する必要がありますか? グローバル アセンブリ キャッシュ (GAC) にインストールする必要がありますか?

0 投票する
1 に答える
301 参照

.net - .NET プロファイラー (ICorProfilerCallback) で一意のメソッド ID を取得するには?

.NET プロファイリング API (ICorProfilerCallback) を試してみたところ、FunctionID が安定していないことがすぐにわかりました (再利用される可能性があります。 http://msdn.microsoft.com/en-us/library/bb384619.aspxを参照してください)。それは大丈夫です。モジュール バージョン ID (MVID) とメソッド トークン (mdTokenDef) を使用してメソッドをエンコードするというアイデアを思いつきました。

ただし、これはスペースが無効であることが懸念されます (GUID の 16 バイト + トークンの 4 バイト)。現在、ある種のハッシュを使用することを検討しています(32ビットハッシュで十分だと思います)。

メソッドをエンコードするより良い方法はありますか?

0 投票する
1 に答える
2063 参照

c++ - 動的ピンボークのプロファイリング

私はMSILプロファイラーに取り組んでおり、インターフェイスのコールバックで問題が発生しManagedToUnmanagedTransitionましたUnmanagedToManagedTransitionICorProfilerCallback

取得したいのは、呼び出されているメソッドに関する情報(メソッドが存在する名前とモジュール名)です。

これまでのところ、正常に機能していました。いわゆる動的ピンボークが発生するまで(詳細は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)とダイナミックピンボークを介してピンボークされている関数の名前を取得するにはどうすればよいですか?

0 投票する
1 に答える
361 参照

c++ - CLR プロファイラー: COM スタイルのキャストおよび派生インターフェイスからの関数の呼び出し

特殊な CLR プロファイラーを開発する必要があります。ICorProfilerCallbackCLR プロファイラーは、現在 5 までの新しいバージョンを実装する COM サーバーとして実装する必要があります。プロファイラーの初期化は、コールバック メソッドで行われますInitialize(IUnknown* pICorProfilerInfoUnk)QueryInterfaceこれにより、提供されたIUnknownオブジェクトに対して を実行し、インターフェイスへのポインターを取得する機会が与えられICorProfilerInfoます。.NET 4.5 の時点でICorProfilerInfo、 、ICorProfilerInfo2ICorProfilerInfo3、およびがありICorProfilerInfo4、新しいバージョンごとに追加機能が提供されています。理想的には、利用可能な最新バージョンへのポインターを取得し、vtables に実際のオブジェクトが何であるかを把握させたいと考えています。

すべての場合において、返されたインターフェイスへのポインターは同じ variablem_pICorProfilerInfoであり、型はCComQIPtr<ICorProfilerInfo>です。次に、メソッドを実装するオブジェクトの実際の型を知らずにメソッドを呼び出します。

これは私に2つの質問を導きます:

  1. COM / ATL コンテキストでは、派生インターフェイスを取得し、上記のような親インターフェイスに格納して、そこから関数を呼び出すことは安全ですか?
  2. 親インターフェイスは、明らかに派生インターフェイスの関数に関する知識を持っていません。ポインターが派生インターフェース ( などICorProfilerInfo2) であるかどうかを確認し、そのようにキャストするにはどうすればよいですか?

これまでのテストでは、#1 は概ね問題ないようです。しかし、確認またはアドバイスを希望します。ポイント#2についてははるかに不確かです。たとえば、ICorProfilerInfohas a SetEnterLeaveFunctionHooksfunction while ICorProfilerInfo2has a SetEnterLeaveFunctionHooks2function. 次の疑似コードのようなことをしたいと思います。

これをどのように達成できるかについてのアドバイスをいただければ幸いです。