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

.net - clr プロファイラー api: ICorProfilerCallback::ExceptionThrown GC は安全ですか

.net フレームワーク プロファイラーで疑問に思っていたのですが、ExceptionThrown ( https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-exceptionthrown-method ) は GC とオーバーラップしないことが保証されていますか?

ドキュメントを見ると、「プロファイラーがここでブロックし、ガベージ コレクションが試行されると、このコールバックが戻るまでランタイムがブロックされます」と表示されます。

ただし、paint.net ( https://www.getpaint.net/ - バージョン 4.1.6) に接続されているプロファイラーを実行したところ、ExceptionThrown 中に GC を取得した特定のケースが見られました。(しかし、それは非常にまれでした-起動時にのみ発生し、約20回の実行ごとに1回だけ発生しました)-gcがデータを移動したため、読み取り中にデータが正しく変更されました。

少なくとも .net コア バージョン ( https://github.com/dotnet/coreclr/blob/master/Documentation/botr/profiling.md)では、どのコールバックが GC コールアウト セーフであるかが明示的に示されています。ExceptionThrown はその 1 つではありません。ExceptionUnwindFunctionEnter は、たとえばです。ただし、.NET フレームワークに戻る - https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-exceptionunwindfunctionenter-method - .NET フレームワークのドキュメントでは、GC に関するコメントはそれと同じですExceptionThrown の。

私は、.NET コア != .NET フレームワークを知っています。ただし、プロファイラーのコードは非常に似ており、同じ保証があるように感じます。.NET フレームワークのコールバックに関する GC の安全性に関する同様のリソースは見つかりませんでした。

このすべてのイントロの後、私の質問は次のとおりです。

  1. .NET フレームワーク clr プロファイラー ExceptionThrown コールバックは GC セーフである必要があります。もしそうなら、GC 呼び出しが ExceptionThrown 中に開始および終了するのを見たのはどうしてでしょうか (clr の潜在的なバグまたは予想される動作)?

  2. バグではない場合、core-clr に関する同様のドキュメントに基づいて、.NET フレームワーク clr プロファイラー UnwindExceptionFunctionEnter コールバックが GC セーフであることに少なくとも 100% 依存できますか?

どうも

0 投票する
0 に答える
436 参照

.net - .NET プロファイリング API の初期化

プロファイリング API を使用して単純な .net プロファイラーを作成する方法を学習しようとしています。

最初のステップでは、プロファイラー dll を読み込んで、ICorProfilerCallback::Initialize からログ ファイルに書き込めるようにしたいだけです。

テスト用の .net コンソール アプリで、次の環境変数を設定しました。

COR_ENABLE_PROFILING="1"

COR_PROFILER="ProfilerTest"-->ここが問題だと思います。GUID を見つける方法がわかりません。ProfilerTest は私の dll の名前です。ここでは、.NET Framework 4 以降では、プロファイラーを登録する必要がないことが示されています。これは、この環境変数を設定する必要がないということですか?

Microsoft の CLRProfiler ソース コードでは、COR_PROFILER_PATH.

ここで完了するのは、dll の初期化関数です。