kmemleak 메모리 누수 감지 소스 코드 분석-1

데이터 구조

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 : 객체를 생성한 프로세스의 이름.

추천

출처blog.csdn.net/y13182588139/article/details/127997868