Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


ftrace - kmem event 디버깅 정보 추가: call_site=c013857c [Kernel] Debug Feature

슬랩 캐시 디버깅(메모리 free/해제 정보 파악)을 위해서, 아래와 같이 ftrace event를 설정할 수 있는데요.
echo 1 > /sys/kernel/debug/tracing/events/kmem/kfree/enable
echo 1 > /sys/kernel/debug/tracing/events/kmem/kmalloc/enable
echo 1 > /sys/kernel/debug/tracing/events/kmem/kmem_cache_alloc/enable
echo 1 > /sys/kernel/debug/tracing/events/kmem/kmem_cache_alloc_node/enable
echo 1 > /sys/kernel/debug/tracing/events/kmem/kmem_cache_free/enable
 
그럼 아래와 같은 ftrace log를 확인할 수 있어요. 아래 ftrace log에서 가장 중요한 정보 중의 하나가
call_site=c0482028 이거든요. 슬랩 메모리(kmalloc-32, kmaloc-64)을 어느 코드에서 할당 및 해제 했는지 알려주는 정보인데요.
어드레스로 찍히니 보기 불편하죠.
<...>-7421  [000]   202.292623: kmalloc:              call_site=c0482028 ptr=0xd5885a40 bytes_req=1024 bytes_alloc=1216 gfp_flags=GFP_KERNEL
<...>-7421  [000]   202.292625: kfree:                call_site=c0482030 ptr=0xd5885a40

아래와 같은 패치를 적용하면 "call_site=c0482028"의 심볼 정보를 좀 더 자세히 볼 수 있어요.
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
index a356967..6f6d27c 100644
--- a/include/trace/events/kmem.h
+++ b/include/trace/events/kmem.h
@@ -34,8 +34,9 @@
  __entry->gfp_flags = gfp_flags;
  ),
 
- TP_printk("call_site=%lx ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s",
+ TP_printk("call_site=%lx from(%pF) ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s",
  __entry->call_site,
+ (void*)__entry->call_site,
  __entry->ptr,
  __entry->bytes_req,
  __entry->bytes_alloc,
@@ -87,8 +88,9 @@
  __entry->node = node;
  ),
 
- TP_printk("call_site=%lx ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d",
+ TP_printk("call_site=%lx from(%pF) ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d",
  __entry->call_site,
+ (void*)__entry->call_site,
  __entry->ptr,
  __entry->bytes_req,
  __entry->bytes_alloc,
@@ -130,7 +132,7 @@
  __entry->ptr = ptr;
  ),
 
- TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr)
+ TP_printk("call_site=%lx from(%pF) ptr=%p", __entry->call_site, (void*)__entry->call_site, __entry->ptr)
 );
 
 DEFINE_EVENT(kmem_free, kfree,

각 메모리를 할당하고 해제한 코드 정보가 좀 더 상세하게 출력이 되는군요. 좀 더 디버깅이 용이하겠죠?
144.549556: kmem_cache_alloc: call_site=c01e4bbc from(mempool_alloc+0x80/0x174) ptr=d8ddb0c0 bytes_req=136
144.549575: kmalloc: call_site=c08f9910 from(verity_map+0x15c/0x1d0) ptr=d47c4080 bytes_req=40
144.549641: kfree: call_site=c013857c from(process_one_work+0x250/0x464) ptr=d47c4080
145.549641:kmem_cache_free: call_site=c02f29f0 from(__es_insert_extent+0x1a4/0x2a8) ptr=d30ef210

.




덧글

댓글 입력 영역