問題タブ [clrmd]
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.
c# - ClrMD を使用してダンプ ファイルをロードすると、「DAC のロードに失敗しました: CreateDacInstance が失敗しました」
クラッシュダンプとライブプロセスを分析するために、マイクロソフトの新しいライブラリであるClrMDを試しています。
.NET Frameworkブログ投稿のサンプルに従いました(添付の .cs ファイルを使用)。
サンプルを実行して、サンプルと同じマシンで実行されているプログラムから取得した .dmp ファイルを分析しようとしました。
次のコードを使用して、ランタイム オブジェクトを作成しようとする場合:
次の例外がスローされます。
何か案は?
c# - ClrMD を使用して非プリミティブ ClrInstanceField 値を適切に処理するには?
ヒープ上のかなり深いオブジェクト グラフの対話型ビューを表示できるようにするだけでなく、多くの統計情報を取得しようとしているマネージド プロセスの非常に大きなメモリ ダンプがいくつかあります。SOS を使用した WinDbg の set に相当するものを考えてみて!do <address>
くださいprefer_dml 1
。プロパティを継続的にクリックしてその値を確認できますが、多くのオブジェクトを比較するためのはるかに使いやすい UI でのみ可能です。
Microsoft.Diagnostics.Runtime (ClrMD) がこのタスクに特に適していることがわかりましたが、配列フィールドの操作に苦労しており、オブジェクト フィールドについて少し混乱しています。より良い。
Array : ヒープから直接アドレスを指定して配列をターゲットにして使用するClrType.GetArrayLength
とClrType.GetArrayElementValue
問題なく動作しますが、別のオブジェクトのフィールドを掘り下げるとClrInstanceField.GetValue
、ClrInstanceField.ElementType
がClrElementType.SZArray
(オブジェクト グラフを掘り下げることはArray
まだありませんが、同様に処理したいと考えています)。
編集:ClrType
for使用しSystem.UInt64
て配列フィールドを逆参照するparent address + offset of the array field
た (配列ポインターが格納されているアドレスを計算するために使用します)。その後、EnumerateObjects から取得した場合と同じように操作できます。プロパティをサポートしていない一部の配列で問題が発生していArrayComponentType
ます。私はまだ構造体の配列でテストしていないので、それがインライン構造体のCスタイルの割り当てにint[]
なるのか、それともヒープ上の構造体へのポインターの配列になるのか疑問に思っています. Guid[]
からの取得に問題があるタイプの1つですArrayComponentType
。
オブジェクト:修正
(論理エラー) まず、呼び出した後、問題なく使用できるアドレス (?)が返されるので、ネストされたオブジェクトのフィールド名と値を確認できます。とはいえ、ポリモーフィズムを考慮する必要があるため、同じアドレスで使用しようとしたところ、NULL または完全に間違ったものが返されました。最初のユース ケースではアドレスが機能するのに、2 番目のユース ケースでは機能しないのは奇妙に思えます。ClrInstanceField
Type
ClrElementType.Object
GetFieldValue
ulong
ClrInstanceField.Type.Fields
ClrHeap.GetObjectType
String : Fixed (回避策が見つかりました)
私の実際のプロジェクトでは既に SOS 付きの DbgEng を使用しているため、アドレスによって文字列の値を簡単に取得する別の方法がありますが、使用しようとしてClrInstanceField.GetFieldValue
文字列を返すことに成功したのは非常に奇妙に思えましたが、完全に不正確な結果 (奇妙な文字の束)。多分私はこれを間違っていますか?
編集:元のコードから LINQPad で実行される抽象化を抽出しました。ここに投稿するには少し長くなりますが、要点はすべてここにあります。コピー/貼り付け/リファクタリングのすべてからまだ少し面倒です。これらの問題を修正した後、最終的なソースを CodePlex または GitHub に投稿する可能性があります。
コード ベースはかなり大きく、プロジェクトに固有のものですが、どうしても必要な場合は、サンプル セットを抽出できる場合があります。つまり、ClrMD オブジェクトへのすべてのアクセスは非常に単純です。!dumpheap -stat
(ルート オブジェクトに対しては正常に機能する) などのSOS コマンドから初期アドレスを取得し、ClrHeap.GetTypeByName
orを使用しますClrHeap.GetObjectType
。その後は、メンバー、、およびClrType.Fields
のみに依存します。ClrInstanceField
Type
ElementType
GetFieldValue
おまけとして、NuGet パッケージで提供される XML ドキュメントのブラウザー フレンドリーバージョンを見つけましたが、これは IntelliSense が提供するドキュメントと同じものです。
.net - DebugDiag は、Visual Studio 2013 のような「包括的なサイズ」のレポートを生成できますか
Visual Studio 2013 は、包括的なサイズ (子オブジェクトのサイズを含む) の列を表示できます - http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-enhancements-in -visual-studio-2013.aspx
DebugDiag のメモリ分析レポートは現在、子オブジェクトを含まないオブジェクト サイズのみを表示します。DebugDiag のレポートに子オブジェクトのサイズを含める方法はありますか?
Visual Studio は .NET 4.5 クラッシュ ダンプの分析のみをサポートしているため、.NET 4.0 のレポートを生成するための良い方法を教えてください。
c# - Mono の CLR メモリ診断 (CLRMD) に相当するものはありますか?
タイトルは非常に明白です: Mono の CLRMD に相当するものはありますか、または少なくとも、割り当てられたすべてのオブジェクトのリストを取得してそれらのフィールドを読み取るために、外部の Mono プロセスのヒープを非侵襲的に読み取る方法はありますか?
そのようなツールがない場合、この目的のために独自の戦略を実装できるようにする Mono プロセスのヒープの構造に関する API とドキュメントはありますか?
c# - ClrMD でプリミティブ値を取得する
私は次のものを持っています
structValue の値を取得するにはどうすればよいですか?
次のことを試しましたが、成功しませんでした
(「field」はテスト変数で、「innerField」は Test.myStruct です。どちらも ClrInstanceField タイプです)。