DPA スコープを絞り込む
特定の問題を DPA 問題リストから除外したい場合が数多くあります。
主なものは次のとおりです。
- これは問題ではありません
DPA が意図通りに動作しているにもかかわらず、特定のメソッドを問題としてマークする場合があります。 たとえば、メソッドが大量のメモリを割り当てるのは、コード設計が悪いためではなく、現在のユースケースで必要だからかもしれません。 これがわずかなメソッドである場合、最善の解決策は これらの問題を抑制することです。 偽陽性が多い場合は、 問題のしきい値を増やす方が良い場合があります。
- このコードの所有者ではない、または今は解析に興味がない場合です
大規模なソリューションには、数百のプロジェクトが含まれており、多くの人が同時に作業しています。 DPA では、 ソリューションの特定部分を除外して解析できるので、現在の作業に関連する問題だけを残すことができます。
- この問題は既に修正されています
既に問題を修正したが、ソリューションを再度実行/デバッグしていないという稀なケースです そのような問題をリストから非表示にしたい場合は、 問題を修正済みとしてマークできます。
簡単な要約:
VCS を介して共有 | まで問題を非表示にします | 粒度 | |
|---|---|---|---|
はい | 恒久的に | メソッド | |
いいえ | 恒久的に | プロセス、モジュール、クラス、メソッド | |
いいえ | 次の実行まで | メソッド | |
いいえ | 恒久的に | ソリューション |
問題を抑制する
問題を抑制するには、対応するメソッドに SuppressMessage 属性をマークする必要があります。 この問題を抑制する主な利点は、属性がソースコードに設定されているため、VCS を介して共有できることです。 属性を設定する最も簡単な方法は、コンテキストアクションを使用することです。
エディターで、抑制したいメソッドを見つけます。
SuppressMessage属性により、DPA は、メソッド自体だけでなく、すべての子呼び出しでもメモリ割り当てを無視することに注意してください。DPA でハイライトされた行にキャレットを置き、 Alt+Enter を押します。
コンテキストアクションリストで { メモリ割り当てを抑制 | データベース } の問題 を選択し、現在の呼び出しサブツリーで抑制したい内容を選びます:選択した問題のみ、同種の問題すべて、またはすべての問題

SuppressMessage 属性は手動で設定できます。 たとえば、次のようになります。
ここに:
"ReSharper.DPA"は必須の属性カテゴリです。checkIdは、どの問題タイプを抑制する必要があるかを指定します(説明はオプションです)。"DPA0001: Memory allocation issues": メモリ割り当ての問題。"DPA0002: Excessive memory allocations in SOH": スモールオブジェクトヒープへの割り当て。"DPA0003: Excessive memory allocations in LOH": ラージオブジェクトヒープへの割り当て。"DPA0004: Closure object allocation": 閉鎖のための割り当て。"DPA0005: Database issues": データベースの問題。"DPA0006: Large number of DB commands": 多数のデータベースコマンドの実行。"DPA0007: Large number of DB records": データベースレスポンス内の多数のレコード。"DPA0008: Large number of DB connections": 多数の同時データベース接続。"DPA0009: High execution time of DB command": コマンド実行時間が長い。
MessageIdを使用すると、属性のスコープを問題の値で絞り込むことができます。 スコープフィルターは、キーと値のペアのリストを使用して設定する必要があります:"key1: value1; key2: value2; ..."利用可能なキーは次のとおりです:type: EXACT_FQN: 指定されたタイプのオブジェクトが割り当てられる割り当ての問題を抑制します。EXACT_FQNは、名前空間とジェネリクス型のすべての置換を含む型の完全な名前です。size: VALUE "B"|"KB"|"MB"|"GB"|"TB": 割り当てられたオブジェクトの合計サイズがVALUEより小さい場合、割り当ての問題を抑制します。count: オブジェクト (コマンド、レコード、接続) の総数がVALUE未満の場合、データベースの問題を抑制します。time: ミリ秒単位の時間がVALUEより小さい場合、データベースコマンドの実行時間の問題を抑制します。
次に例を示します:
"type: System.Object; type: System.String; size: 500MB"このフィルターは、割り当てられたオブジェクトの合計サイズが 500MB 未満でない限り、DPA が
System.ObjectまたはSystem.Stringタイプのオブジェクトの割り当てに関連するすべての問題を抑制しなければならないことを意味します。
分析からコードを除外する
特定のコード部分が現在の作業に関連しない場合など、解析に興味がない場合は除外が必要な場合があります。 特定のプロセス、モジュール、クラス、メソッドを除外できます。それに関連する問題は 動的プログラム分析 ウィンドウやエディター上で非表示になります。 コードを除外しても自分にだけ適用されます。除外された問題は VCS には伝搬されません。
動的プログラム分析からコードを除外する
を開きます。
フィルター で、必要なフィルター規則の横にある
追加 ... をクリックします。次のみでコードを分析する: 動的分析に含めるプロセス、モジュール、クラス、/ またはメソッドを指定します。 その他のコード項目は除外されます。 コードアイテムは互いに独立してフィルタリングされます。 例: メソッドを指定し、モジュールとクラスにアスタリスク
*を残して、すべてのモジュールとすべてのクラスから指定された名前のメソッドのみを含めることができます。次でコードを分析しない: 動的分析から除外するプロセス、モジュール、クラス、/ またはメソッドを指定します。 コードアイテムは互いに独立してフィルタリングされます。
問題を修正済みとしてマーク
問題に修正済みフラグをつける操作は、除外と似ています。 主な違いは、除外は恒久的ですが、「修正済みとしてマーク」はソリューションを実行/デバッグするまで問題を非表示にする点です。もし実際に問題が修正されていなければ、DPA は問題リストに戻します。
動的プログラム分析 ウィンドウを 開きます。
問題を選択し、 削除 を押すか、コンテキストメニューで 無視 | 修正済みとしてマーク を選びます。
問題のしきい値を変更する
DPA は、インスペクション値がしきい値を超えた場合のみメソッドを問題としてマークします。 たとえば、実行中にメソッドが LOH に 55 MB を割り当てた場合、しきい値が 50 MB であれば問題になります。 したがって、偽陽性を排除する最も簡単な方法は、対応するしきい値を上げることです。 なお、普遍的なしきい値はありません。現在の実行コンテキストにより、アプリケーションが割り当てるメモリ量も異なります。 たとえば、アプリが扱うデータサイズは実行ごとに変わる場合があります。
動的プログラム分析 ウィンドウの しきい値 タブで、各発行タイプのしきい値を設定できます。 デフォルトのしきい値は次のとおりです。
Closure オブジェクト: 50 MB
ラージオブジェクトヒープ: 50 MB
小さなオブジェクトのヒープ: 100 MB
DB コマンド時間: 500 ミリ秒
DB 接続: 10
DB コマンド: 50
DB レコード: 100
MVC アクション: 500ms
Razor ページハンドラー: 500 ミリ秒
Razor ビューコンポーネント: 300 ミリ秒
動的プログラム分析 ウィンドウを 開きます。
次のいずれかを実行します。
現在のしきい値を超えている問題を選択し、コンテキストメニューで 無視 | 新しいしきい値を設定 ... を選択します。 これにより、問題の割り当て値のすぐ上に対応するしきい値が設定されます。
しきい値 タブに切り替えて、目的の問題タイプの新しいしきい値を設定します。