2017-07-25 5 views
0

C#で文字列を使用する特定のケースでは、CLRが最適化として文字列ストリングを実行することはよく知られています。インタープール内のすべての文字列を読み取ることはできますか?

だから私の質問は以下のとおりです。

  • ことが可能インターンプールに現在あるすべての文字列を読み取るために?
  • 各保留文字列に参照カウントを取得する方法はありますか?
  • インターンプールを別のプロセス空間から読み取ることは可能でしょうか?
  • これらのいずれも可能でない場合、これらのユースケースを許可しない理由は何ですか?

メモリの使用状況を監視する場合には、これがやや役立つことがあります。機密情報を扱う場合にも役立つかもしれません(ただし、多くのシナリオではSecureStringがより好ましいと思いますが)。

は、私の知る限り、文字列のインターンに関連する唯一のパブリックメソッドは、私は本当の問題を解決しようとしていない、好奇心から求めているString.Intern(string)String.IsInterned(string)

です。私は、インラインプールの文字列に基づいてロジックを実行することは悪い考えであることを認識しています。

+5

_ [これらの使用例を許可しない理由は何ですか?] _ [すべての機能が-100ポイントで始まるため](https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus- 100点/)とチームは代わりに実際に有用なことをしている。 – stuartd

+8

"これらのどれも可能ではありませんが、これらのユースケースを許可しない理由は何ですか?"これらはユースケースではなく、ユースケースのないAPI機能要求です。ユース・ケースでは、なぜそれらをそれぞれ何とかしたいと説明しています。後であなたが実際の問題を解決しようとしていないと言う事実は、ユースケースを持っていないことを示しています。個人的には、私は役に立たない機能を混乱させることには反対していません。 –

+0

おそらく。 * Microsoft.Diagnostics.Runtime *からClrMD APIを介してすべてのオブジェクトのリストを取得し、* IsInterned *を持つすべての内部文字列を検索します。 APIは、必要な他の統計情報も提供します。あなたがデバッガを書いていない限り、それを行う理由はありません。 – IllidanS4

答えて

3

コードを介してインターナルされた文字列を検索すると、その機能がその言語に追加されていないので、使用例はありません。プログラムをデバッグしながら、しかし、メモリ内の文字列を検索

は非常に一般的な使用例であり、それを行うためのツールがあります。

は、Windows SDKに付属しているツールWinDbg.exeを使用する必要があります。起動してプログラムにアタッチすると、コマンドを実行します。

.loadby sos clr 

これは、.NETアプリケーションのデバッグ用の拡張機能で読み込まれます。これを行うと、コマンドを実行することができます。

!DumpHeap -strings 

ヒープ内のすべての文字列オブジェクトを見ることができます。

あなたが見ているそのリスト内のオブジェクトが抑留されているかどうかを伝えるために、私はどのように完全にわからないと。うまくいけばWinDbgに関する新しい質問をして、文字列がインターンされているかどうかを知る方法を教えてください。

1

あなたはClrMDに基づいていますMemAnalyzerでインターンに意味をなす文字列や重複を分析することができます。

https://github.com/Alois-xx/MemAnalyzer

C>MemAnalyzer.exe -dstrings -f 50KStringsx64.dmp 

    Strings(Count) Waste(Bytes) String 
    500    20,958   String 0 
    500    20,958   String 1 
    500    20,958   String 2 
    500    20,958   String 3 
    500    20,958   String 4 
    500    20,958   String 5 

Summary 
========================================== 
Strings      61,330 count 
Allocated Size    2,529,742 bytes 
Waste Duplicate Strings 2,515,898 bytes 

これは、あなたが持っているし、それらのどれがインターンに意味をなさないかもしれませんどのように多くのsuplicate文字列あなたにメトリックを提供します。特定の文字列は、あなたがインターン価値があるかもしれません各STRNGの最初のアドレスを表示するように

-showAddress

を追加できるオブジェクトの参照を見つけるために。次に、Windbgと!GCRootアドレスを使用して、このオブジェクトをどのオブジェクトが保持しているかを調べることができます。このオブジェクトは、String.Internを追加する必要のあるクラスのアイディアを提供します。

.NET String.Internプールは参照を解放しないことに注意してください。異なる内容の大きなデータセットを扱う場合は、現在のデータセットをアンロードして次のデータセットをロードするときに、自分の辞書プールを使用して、すべての中身の文字列を解放する必要があります。

関連する問題