리눅스 커널: 메모리 손상 - 디버그 트릭
참고: 커널 컴파일 사용, 메모리 손상에 관련된 디버그 방법.
커널 메세지 확인.
shell> dmesg
BUG : 커널 페이징 처리 문제
nvalid opcode: 0000 [#1] SMP
general protection fault: 0000 [#1] SMP
BUG: unable to handle kernel NULL pointer dereference at 0000000000000258
메모리 손상 확인
shell> dmesg
[ 37.183009] IP: [<ffffffff817c69f0>] _raw_spin_lock_irqsave+0x20/0x80
[ 37.183130] Call Trace:
두개의 메세지 확인
- IP(명령어 위치)주소
- 호출 추적
IP : 명령 위치 주소 정보. 이 주소가 오류를 생성한 주소임.
해당 주소 확인
$ addr2line -e path_to_your_kernel_tree/vmlinux 0xffffffff817c69f0
path_to_your_kernel_tree//./arch/x86/include/asm/spinlock.h:106
path_to_your_kernel_tree: 커널 소스 위치
vmlinux : 압축되지 않은 커널 이미지
참고: 커널 컴파일시 debug 플래그 추가 옵션 설정 확인.
호출 추적
[ 37.183130] Call Trace:
함수 코드 섹션 확인.
$ nm drivers/media/vmc/vmc.ko | grep vmc_cap_destroy
0000000000000680 T vmc_cap_destroy
$ addr2line -e path_to_your_kernel_tree/drivers/media/vmc/vmc.ko 0x6c0
path_to_your_kernel_tree/drivers/media/vmc/vmc-capture.c:396
디버그 출력 활성화.
$ sudo sh -c "echo -n 'module media +p' > /sys/kernel/debug/dynamic_debug/control"
동작 하지 않으면 DYNAMIC_DEBUG 옵션 설정 확인
테스트 한 모듈(생생한 모듈)의 경우, vivid_debug 매개 변수 변경
$ sudo modprobe vivid vivid_debug=8
이미 실행중일 때 매개변수 변경
sudo sh -c "echo -n 0 > sys/module/vivid/parameters/vivid_debug"
동적 디버그:
커널이 DYNAMIC_DEBUG 플래그로 컴파일 된 경우 printk를 사용해 dmage에 로그를 남길 수 있음.
shell> sudo modprobe media
디버그 정보 기록 시작 +p, =p는 해당 줄 출력 사용
$ sudo sh -c "echo -n 'module media +p' > /sys/kernel/debug/dynamic_debug/control"
$ sudo cat /sys/kernel/debug/dynamic_debug/control | grep "\[media\]" drivers/media/media-entity.c:301 [media]media_entity_pipeline_start =p "\042%s\042:%u must be connected by an enabled link\012" drivers/media/media-entity.c:287 [media]media_entity_pipeline_start =p "link validation failed for \042%s\042:%u -> \042%s\042:%u, error %d\012"
디버그 정보 출력 비 활성화 -p, =_ 해당 줄 출력 않함
$ sudo sh -c "echo -n 'module media -p' > /sys/kernel/debug/dynamic_debug/control"
$ sudo cat /sys/kernel/debug/dynamic_debug/control | grep "\[media\]" drivers/media/media-entity.c:301 [media]media_entity_pipeline_start =_ "\042%s\042:%u must be connected by an enabled link\012" drivers/media/media-entity.c:287 [media]media_entity_pipeline_start =_ "link validation failed for \042%s\042:%u -> \042%s\042:%u, error %d\012"
특정 출력 사용.
$ sudo sh -c "echo -n 'file media-entity.c +p' > /sys/kernel/debug/dynamic_debug/control"
$ sudo sh -c "echo -n 'file media-entity.c line 301 +p' > /sys/kernel/debug/dynamic_debug/control"
디버그 메세지 실시간 확인
$ tail -f /var/log/kern.log
댓글 없음:
댓글 쓰기