데이터 구조
kmemleak_object
struct kmemleak_object는 memblock_alloc, kmalloc, vmalloc, kmem_cache_alloc 등과 같은 함수에 의해 할당된 메모리 블록을 설명합니다. 이 메모리 블록은 red-black 트리 object_tree_root 및 이중 연결 목록 object_list에 추가됩니다.
//Kmemleak.c
/* 객체 경계에 대한 검색 트리 */
static struct rb_root object_tree_root = RB_ROOT;
//Kmemleak.c
struct kmemleak_object { spinlock_t 잠금; 부호 없는 긴 플래그; /* 객체 상태 플래그 */ struct list_head object_list; struct list_head gray_list; 구조체 rb_node rb_node; 구조체 rcu_head rcu; /* object_list lockless traversal */ /* 객체 사용 횟수; use_count == 0일 때 해제된 객체 */ atomic_t use_count; 부호 없는 긴 포인터; size_t 크기; /* 누출로 간주되기 전에 발견된 포인터의 최소 수 */ int min_count; /* 이 객체를 가리키는 포인터의 총 수 */ int count; /* 수정된 객체를 감지하기 위한 체크섬 */
u32 체크섬;
/* 개체 내에서 스캔할 메모리 범위(모두 비어 있음) */
struct hlist_head area_list;
부호 없는 긴 트레이스[MAX_TRACE];
서명되지 않은 int trace_len;
서명되지 않은 긴 jiffies; /* 생성 타임스탬프 */
pid_t pid; /* 현재 작업의 pid */
char comm[TASK_COMM_LEN]; /* 실행 파일 이름 */
};
lock : spinlock 잠금은 현재 개체 개체를 보호하는 데 사용됩니다.
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 연결 리스트에 objectec를 추가합니다.
gray_list : 이 필드를 통해 개체를 gray_list 연결 목록에 추가합니다.
rb_node : 이 필드를 통해 object_tree_root의 red-black 트리에 개체를 추가합니다.
use_count : 객체 사용 횟수. get_object만큼 카운트가 증가하고, put_object만큼 카운트가 감소하며, use_count = 0일 때 객체가 해제됩니다.
포인터 : 개체의 시작 주소입니다.
size : 객체의 크기.
overflow_ref : 자세한 내용은 kmemleak_vmalloc 함수 구현을 참조하십시오.
min_count : 메모리 블록에 대한 포인터의 최소 개수입니다. 이 값보다 작으면 메모리 누수가 의심됩니다.
count : min_count와 함께 사용되는 메모리 블록에 대한 스캔 포인터의 총 수입니다.
checksum : 메모리 블록의 CRC 체크섬.
area_list : area_list 연결 리스트가 NULL이면 객체의 포인터를 시작 주소로, 크기를 크기로 하여 주소 범위를 스캔한다. NULL이 아니면 area_list 연결 목록에 있는 kmemleak_scan_area 노드의 시작 및 크기를 주소 범위 스캔으로 사용합니다. 객체가 기술하는 메모리 블록은 여러 개의 kmemleak_scan_area 영역으로 분할될 수 있으며, 모든 kmemleak_scan_area는 노드 노드를 통해 area_list가 선두인 연결 리스트에 추가된다.
trace : 객체를 생성한 스택 트레이스의 주소를 저장합니다.
trace_len : 스택 트레이스의 실제 깊이를 나타내며 최대 깊이는 MAX_TRACE(16)입니다.
jiffies : 객체를 생성할 때의 jiffies.
pid : objcet 생성을 위한 pid 번호를 나타냅니다.
comm : 객체를 생성한 프로세스의 이름.