問題タブ [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 投票する
0 に答える
169 参照

.net-3.5 - CLR プロファイリング API バージョン

JIT 時にメソッドにコードを挿入する CLR プロファイラーを作成しました。挿入するコードは .NET 3.5+ に依存します。プロファイラーの初期化時に使用可能な .NET Framework のバージョンを検出するにはどうすればよいICorProfilerCallback::Initializeですか ( )。

理想的には、.NET 3.5 以降がインストールされていない場合は、プロファイラーをロードしないようにしたいと思います。つまり、.NETCORPROF_E_PROFILER_CANCEL_ACTIVATIONから戻ることを意味しInitializeます。後で (モジュールの読み込み時などに) バージョンを検出しないと、プロファイリング フラグが設定され、特定の CLR 最適化が無効になります。これは、プロファイラーが実際には機能しないため望ましくありません。

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

c# - .Net プロファイリング - マネージ スレッドの開始と終了を知る

私は.Netプロファイラーを開発しています..これにはILRewritingを使用します..

マネージド スレッドの作成と破棄を追跡する必要があります。

スレッドの開始時とスレッドの終了時に呼び出されるスレッド関連の関数を知る必要があります。コードを挿入して、イベントが発生するたびに記録できます。

スレッドの作成時と終了時に呼び出されるデフォルト関数に関するアイデアはありますか..??

または、マネージド スレッドの作成および破棄イベントをキャプチャする他の方法はありますか??

スレッド イベント マスクを設定することでトレースできることはわかっていますが、すべてのスレッドではなく、特定のマネージド スレッドをキャプチャする必要があります。

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

c# - C# からの C++ 呼び出しの最適化

C# から 2 つの C++ 関数呼び出しを呼び出しています。私のコードは以下のとおりです。

C++ コードでは次のとおりです。

この関数は、C# から C++ に約 200 万回呼び出されています。この関数呼び出しがなければ、私の Web リクエストは 5.9 秒で完了します。この関数呼び出しでは、7.1 秒かかります。

約 15% のオーバーヘッド。投稿を見て、すでに「SuppressUnmanagedCodeSecurity」を使用しました。これにより、オーバーヘッドが 30% から 15% に削減されました..しかし、この 15% のオーバーヘッドを削減する他の方法はありますか??

アップデート1:

関数 ID は、C# の関数呼び出しごとに C++ に送信する必要があります。C++ 関数は空の関数ではありません。関数 ID を STL に格納する必要があり、別のスレッドがそれを処理します。私は.NETプロファイラーのようなことをしています。すべての関数呼び出しをプロファイリングする必要があります。この FuncA C++ 関数は、挿入されたヘルパー関数から呼び出されます。

ありがとう、

./ラフル

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

c# - ICorProfilerCallback2: CLR プロファイラーがすべての Leave 呼び出しをログに記録しない

プロセス内のすべての .Net メソッド呼び出しをログに記録するプロファイラーを作成しようとしています。目標は、パフォーマンスを高め、ユーザーがその情報をディスクに書き込むようにトリガーするまで、最後の 5 ~ 10 分間をメモリ (固定バッファー、周期的に古い情報を上書きする) に保持することです。使用目的は、めったに再現されないパフォーマンスの問題を追跡することです。

https://github.com/appneta/SimpleCLRProfilerの SimpleCLRProfiler プロジェクトから始めました。プロファイラーは、.Net プロファイリングのICorProfilerCallback2コールバック インターフェイスを利用します。私の環境(Win 8.1、.Net 4.5、VS2012)でコンパイルして動作させることができました。ただし、Enter コールがログに記録されているのに、Leave コールが欠落している場合があることに気付きました。Console.WriteLine 呼び出しの例 (DbgView の出力を、理解するために最低限必要なものに減らしました):

2 つの Entering 呼び出しには、対応する Leaveing 呼び出しがありません。プロファイリングされた .Net コードは次のようになります。

関連する SimpleCLRProfiler メソッドは次のとおりです。

.Net プロファイラーがすべての終了メソッドに対して Leave 呼び出しを実行しない理由を知っている人はいますか? ちなみに、OnLeaveMethod が例外などでトレース前に予期せず終了しないことを確認しました。そうではありません。

ありがとう、クリストフ

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

c# - ICorProfiler: jitted 関数の間違った型トークンを取得するのはなぜですか?

次のような構造のコードがあります。

そして、ICorProfiler2 API を使用してそのコードをプロファイリングしています。ここで、メソッド M がジットされると、その ID への FunctionID* ポインターを取得します。次に、次のことを行います (大幅に省略されています)。

これにより、変数 classToken に TypeToken が含まれます。

これは、ソースで M が宣言された型 (別名クラス A) であると予想していましたが、代わりにデリゲート B の型トークンを受け取ります。だから私の質問は: 私は何か間違ったことをしていますか、それとも GetMethodProps が M の定義型の型トークンを返すという私の仮定は間違っていますか?

残念ながら、GetMethodProps のドキュメントはあまり役に立ちません: https://msdn.microsoft.com/en-us/library/ms233163(v=vs.110).aspx

編集: 明確にするために:すべてのタイプ/関数トークンとそれらがマップする名前を含むファイルを生成したため、間違ったタイプが返されることを知っています。これらのトークンをILSpyで検証しました: それらは正しいです。このマッピングは、他のアプリケーションでも何度もテストされており、問題なく機能しているように見えるので、これが問題の原因ではないと思います。

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

c# - ICLRProfiling::AttachProfiler() を使用した CLR プロファイリングと書き換え

CLR プロファイラーICLRProfiling::AttachProfilerメソッドを使用する主な利点は、ターゲット プロセスが開始されてからずっとにCLR プロファイラーをアタッチできることCOR_ENABLE_PROFILING、起動時に環境変数とCOR_PROFILER環境変数をプロセスに渡す必要がないことです。? これらは両方とも正しい仮定ですか?

また、2011 年の CLR プロファイリング チームのブログ投稿でICLRProfiling::AttachProfilerは次のものをサポートしていないが、将来的にはサポートすることを読みました。

  • GetILFunctionBody

  • GetILFunctionBodyAllocator

  • SetILFunctionBody

  • SetILInstrumentedCodeMap

  • SetEnterLeaveFunctionHooks*

  • SetFunctionIDMapper*

  • GetNotifiedExceptionClauseInfo

  • Enter/Leave/Tailcall に関連するすべてのメソッド

これらは現在サポートされていますか? オンラインでこれ以上何も見つけられず、2011年から2012年までのマイクロソフトのリンクの多くは現在死んでいるので、私は尋ねています. そうでない場合、 ICLRProfiling::AttachProfilerを使用して CLR プロファイラーをアタッチするときに、IL で関数本体を書き換えることさえ可能ですか?