본문 바로가기

[Debugging] Tips

[Crash-Utility] 램덤프 로딩 시 파라미터(CONFIG_PROC_KCORE)

크래시 유틸리티를 실행해 램덤프를 로딩하려면 적절한 아규먼트를 지정해야 합니다. 
예를 들면 다음과 같습니다.
 
./crash64 ramdump.bin@0x800000000 -p 4096 -m kimage_voffset=0xFFFFFFBF58000000 -m page_offset=0xFFFFFF8000000000 -m vabits_actual=39 -m phys_base=0x40000000 --no_panic --smp vmlinux
 
kimage_voffset, page_offset, phys_base과 같은 파라미터를 제대로 설정해야 크래시 유틸리티가 실행됩니다.
 
그런데 kimage_voffset, page_offset 옵션을 어떻게 적용해면 될지 모를 때가 있습니다. 
이럴 때는 이번 포스트에서 소개한 방법을 적용하면 됩니다.
 
코드를 살펴보니 vmcore 관련 page_size부터 virtual kernel memory offset 값들을 출력해 주는 부분이 있어 하기 config들을 추가하여 확인해 보았습니다.
 
먼저 커널을 다음 컨피그와 함께 빌드합니다.
 
CONFIG_PROC_KCORE=y
CONFIG_PROC_FS=y
CONFIG_MMU=y
 
빌드한 후 타겟 디바이스에 이미지를 다운로드합니다. 타겟 디바이스가 부팅한 다음에 
/proc/kcore 노드을 읽으면 다음과 같은 정보가 확인됩니다.
 
PAGESIZE=4096
SYMBOL(init_uts_ns)=ffffffc011a55c90
SYMBOL(node_online_map)=ffffffc011a273d0
SYMBOL(swapper_pg_dir)=ffffffc0118d4000
SYMBOL(_stext)=ffffffc010081000
SYMBOL(vmap_area_list)=ffffffc011a82e78
SYMBOL(mem_map)=ffffffc011d64218
SYMBOL(contig_page_data)=ffffffc011cc9a80
SYMBOL(mem_section)=ffffff8b7ff00b80
LENGTH(mem_section)=1024
SIZE(mem_section)=16
OFFSET(mem_section.section_mem_map)=0
SIZE(page)=64
SIZE(pglist_data)=5824
SIZE(zone)=1664
SIZE(free_area)=104
SIZE(list_head)=16
SIZE(nodemask_t)=8
OFFSET(page.flags)=0
OFFSET(page._refcount)=52
OFFSET(page.mapping)=24
OFFSET(page.lru)=8
OFFSET(page._mapcount)=48
OFFSET(page.private)=40
OFFSET(page.compound_dtor)=16
OFFSET(page.compound_order)=17
OFFSET(page.compound_head)=8
OFFSET(pglist_data.node_zones)=0
OFFSET(pglist_data.nr_zones)=5056
OFFSET(pglist_data.node_start_pfn)=5064
OFFSET(pglist_data.node_spanned_pages)=5080
OFFSET(pglist_data.node_id)=5088
OFFSET(zone.free_area)=192
OFFSET(zone.vm_stat)=1472
OFFSET(zone.spanned_pages)=104
OFFSET(free_area.free_list)=0
OFFSET(list_head.next)=0
OFFSET(list_head.prev)=8
OFFSET(vmap_area.va_start)=0
OFFSET(vmap_area.list)=40
LENGTH(zone.free_area)=11
SYMBOL(log_buf)=ffffffc011a66360
SYMBOL(log_buf_len)=ffffffc011a66368
SYMBOL(log_first_idx)=ffffffc011d19998
SYMBOL(clear_idx)=ffffffc011d1999c
SYMBOL(log_next_idx)=ffffffc011d199a0
SIZE(printk_log)=40
OFFSET(printk_log.ts_nsec)=0
OFFSET(printk_log.len)=8
OFFSET(printk_log.text_len)=10
OFFSET(printk_log.dict_len)=12
LENGTH(free_area.free_list)=6
NUMBER(NR_FREE_PAGES)=0
NUMBER(PG_lru)=4
NUMBER(PG_private)=13
NUMBER(PG_swapcache)=10
NUMBER(PG_swapbacked)=19
NUMBER(PG_slab)=9
NUMBER(PG_head_mask)=65536
NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE)=-129
NUMBER(VA_BITS)=39
NUMBER(kimage_voffset)=0xffffffbf70000000
NUMBER(PHYS_OFFSET)=0x80000000
KERNELOFFSET=0
 
이 정보를 활용해 크래시 유틸리티를 실행하면 문제 없이 램덤프를 로딩됩니다.