노하우24 메인게시판

[리눅스/개발] 오류에 대해 디버깅 팁

페이지 정보

작성자 최고관리자 작성일25-11-11 21:25 조회68회 댓글0건

본문

리눅스 커널 모듈 오류가 발생 했을 경우, 모듈에 디버깅 정보 포함하여 컴파일 하였을 경우 ( -g 옵션 및 -Og -O0 설정 후 컴파일 하였을 경우 ),

메모리 번지수로 소스코드 위치 파악 하기.

 

  예를 들면, 패닉 로그가 다음 처럼 나올 경우... (실제 내가 개발하는 모듈임)

Nov 11 18:01:46 rpizbox1 kernel: [  641.446119] CPU: 2 UID: 0 PID: 92 Comm: kworker/u21:0 Tainted: G        WC O       6.12.52-v8+ #1

Nov 11 18:01:46 rpizbox1 kernel: [  641.446156] Tainted: [W]=WARN, [C]=CRAP, [O]=OOT_MODULE

Nov 11 18:01:46 rpizbox1 kernel: [  641.446165] Hardware name: Raspberry Pi Compute Module 4 Rev 1.1 (DT)

Nov 11 18:01:46 rpizbox1 kernel: [  641.446179] Workqueue: brcmf_wq/mmc1:0001:1 brcmf_sdio_dataworker [brcmfmac]

Nov 11 18:01:46 rpizbox1 kernel: [  641.446414] Call trace:

Nov 11 18:01:46 rpizbox1 kernel: [  641.446422]  dump_backtrace+0x9c/0x100

Nov 11 18:01:46 rpizbox1 kernel: [  641.446451]  show_stack+0x20/0x38

Nov 11 18:01:46 rpizbox1 kernel: [  641.446469]  dump_stack_lvl+0x8c/0xd0

Nov 11 18:01:46 rpizbox1 kernel: [  641.446488]  print_report+0xfc/0x5d8

Nov 11 18:01:46 rpizbox1 kernel: [  641.446510]  kasan_report+0xc0/0x100

Nov 11 18:01:46 rpizbox1 kernel: [  641.446529]  __asan_report_store4_noabort+0x20/0x30

Nov 11 18:01:46 rpizbox1 kernel: [  641.446552]  ether_addr_copy+0xd0/0x1b8 [thnat]

Nov 11 18:01:46 rpizbox1 kernel: [  641.446627]  ip_thnat_mod_fnct+0xc18/0x11c8 [thnat]

Nov 11 18:01:46 rpizbox1 kernel: [  641.446699]  ip_output+0x140/0x4f8

Nov 11 18:01:46 rpizbox1 kernel: [  641.446722]  ip_send_skb+0xb0/0x2b8

Nov 11 18:01:46 rpizbox1 kernel: [  641.446741]  ip_send_unicast_reply+0x89c/0x11b8

Nov 11 18:01:46 rpizbox1 kernel: [  641.446761]  tcp_v4_send_reset+0x9f0/0x1a48

Nov 11 18:01:46 rpizbox1 kernel: [  641.446779]  tcp_v4_rcv+0x166c/0x31d8

 

   이런식의 커널 패닉이 발생 하였을 경우, 위의 로그에서는 위의 빨간색 부분(ether_addr_copy+0xd0/0x1b8 [thnat])에서 thnat - 커널 모듈이 패닉을 일으킨 모듈인데,

소스 코드의 어느 파일 몇번째 라인인지 알아내는 방법은 다음과 같음

 

 * 커널 소스 트리에서 실행

   # scripts/faddr2line path/to/thnat.ko ether_addr_copy+0xd0

 

   file.c:12345

 이렇게 알아 낼 수 있음

 

 * 전체 로그를 한 번에 풀기

# dmesg | scripts/decode_stacktrace.sh vmlinux /path/to/kernel/build > decoded.txt

   또는

# scripts/decode_stacktrace.sh vmlinux /lib/modules/$(uname -r)/build < /var/log/kern.log

 

 * 커널 소스가 없는 상태에서 모듈 파일만 가지고 체크

#  addr2line -e thnat.ko --section=.text -f -C 0xc18

 

 

댓글목록

등록된 댓글이 없습니다.