0

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

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

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

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

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

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

4

1 に答える 1

2

Hans が指摘したように、CLR はThreadCreatedおよびThreadDestroyedコールバックを使用してスレッドの作成/破棄をプロファイラーに通知します。注: スレッドが終了する前にランタイムがシャットダウンした場合、ThreadDestroyed コールバックは取得されません ... しかし、ThreadDestroyed コールバックが取得されない理由として最も可能性が高いのは、IIS (「ページの読み込み」によるものと想定しています)あなたはasp .NETページを参照しています)は、最適化として将来のリクエストのためにスレッドを保持することを決定しました。他のスレッドが十分にあると判断した場合、後でスレッドを終了することを決定する場合があります。

また、質問に対する2番目のコメントについては、 ThreadID とManagedThreadIDの間に関係はありません。ThreadID は内部データ構造への参照であり (不透明な値として扱い、解釈しようとしないでください)、ManagedThreadID は、スレッドが最初にマネージド コードに入るときに順次割り当てられる単純な数値のように見えます。どの ThreadID がどのマネージド スレッドに対応するかを特定したい場合は、次の 3 つのオプションが考えられます。

  • ThreadNameChangedコールバックを使用してスレッド名を確認します (注: スレッドの開始前にスレッド名が設定されている場合、これは ThreadCreated コールバックの前に発生します)
  • ThreadAssignedToOSThreadコールバックを使用して OS スレッド ID を確認します
  • プロファイリングされたコードにプロファイラーを呼び出して、コンテキストを提供します (pinvoke を使用するか、この目的のためにインストルメント化されたメソッドを呼び出します)。
于 2015-02-10T10:27:35.293 に答える