[리눅스/개발] 오류에 대해 디버깅 팁
페이지 정보
작성자 최고관리자 작성일25-11-11 21:25 조회65회 댓글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
댓글목록
등록된 댓글이 없습니다.