データ構造
kmemleak_object
struct kmemleak_object は、memblock_alloc、kmalloc、vmalloc、kmem_cache_alloc などの関数によって割り当てられたメモリ ブロックを記述します。このメモリ ブロックは、赤黒ツリー object_tree_root および二重リンク リスト object_list に追加されます。
//Kmemleak.c
/* オブジェクト境界の検索ツリー */
static struct rb_root object_tree_root = RB_ROOT;
//Kmemleak.c
struct kmemleak_object { スピンロック_t ロック; 署名のない長いフラグ。/* オブジェクトのステータス フラグ */ struct list_head object_list; 構造体 list_head grey_list; 構造体 rb_node rb_node; 構造体 rcu_head rcu; /* object_list ロックレス トラバーサル */ /* オブジェクトの使用数; use_count == 0 の場合にオブジェクトが解放される */ atomic_t use_count; 符号なしロングポインタ。 size_t サイズ; /* リークとみなされる前に検出されるポインタの最小数 */ int min_count; /* このオブジェクトを指していることが判明したポインターの総数 */ int count; /* 変更されたオブジェクトを検出するためのチェックサム */
u32 チェックサム;
/* オブジェクト内でスキャンされるメモリ範囲 (すべて空) */
struct hlist_head area_list;
符号なしロングトレース[MAX_TRACE];
unsigned int トレース_len;
署名のない長いジフィー。/* 作成タイムスタンプ */
pid_t pid; /* 現在のタスクの pid */
char comm[TASK_COMM_LEN]; /* 実行可能ファイル名 */
};
lock : スピンロック ロックは、現在のオブジェクト object を保護するために使用されます。
flags : オブジェクトのステータスフラグ。次のステータス フラグがあります。
- OBJECT_ALLOCATED: 割り当てられたメモリブロックのステータスフラグを示します。オブジェクトが作成されるとこのマークが設定され、オブジェクトが解放されるとこのマークがクリアされます。
- OBJECT_REPORTED: 一連のメモリ スキャンの後、メモリ リークのリスクのあるオブジェクトのフラグが OBJECT_REPORTED に設定され、ユーザーは cat /sys/kernel/debug/kmemleak を通じてメモリ リークのリスクのあるオブジェクトを取得できることを示します。
- OBJECT_NO_SCAN: このメモリ ブロックをスキャンしないことを示します。偽陽性と偽陰性を減らすために、kmemleak は、パッケージ化されたインターフェイスを通じてメモリ ブロックをスキャンする必要があるかどうかを設定し、スキャンする必要がない場合は、フラグで OBJECT_NO_SCAN フラグを設定します。
- OBJECT_FULL_SCAN: メモリ不足により scan_area の割り当てが失敗した場合、現在のオブジェクトが OBJECT_FULL_SCAN としてマークされ、オブジェクトが部分スキャンではなく完全にスキャンされたことを示します。
object_list : このフィールドを通じて object_list リンク リストに object_list を追加します。
grey_list : このフィールドを通じてオブジェクトを grey_list リンク リストに追加します。
rb_node : このフィールドを通じて object_tree_root の赤黒ツリーにオブジェクトを追加します。
use_count : オブジェクトの使用数。get_object によってカウントが増加し、put_object によってカウントが減少し、use_count = 0 のときにオブジェクトが解放されます。
pointer : オブジェクトの開始アドレス。
size : オブジェクトのサイズ。
extra_ref : 詳細については、kmemleak_vmalloc 関数の実装を参照してください。
min_count : メモリ ブロックへのポインターの最小数。この値より小さい場合は、メモリ リークの疑いがあります。
count : メモリ ブロックへのスキャンされたポインターの総数。min_count と組み合わせて使用されます。
checksum : メモリブロックの CRC チェックサム。
area_list : area_list リンク リストが NULL の場合、開始アドレスとしてオブジェクトのポインタ、サイズとして size を使用してアドレス範囲をスキャンします。NULL でない場合は、area_list リンク リスト内の kmemleak_scan_area ノードの開始点とサイズをアドレス範囲スキャンとして使用します。オブジェクトによって記述されるメモリブロックは、複数の kmemleak_scan_area 領域に分割することができ、すべての kmemleak_scan_area は、ノードノードを通じて area_list で始まるリンクされたリストに追加されます。
トレース: オブジェクトを作成したスタック トレースのアドレスを保存します。
trace_len : スタック トレースの実際の深さを示します。最大の深さは MAX_TRACE(16) です。
jiffies : オブジェクト作成時の jiffies。
pid : オブジェクトを作成するためのpid番号を示します。
comm : オブジェクトを作成したプロセスの名前。