카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/31

리눅스 커널: 메모리 손상 - 디버그 트릭

리눅스 커널: 메모리 손상 - 디버그 트릭
참고: 커널 컴파일 사용, 메모리 손상에 관련된 디버그 방법.

커널 메세지 확인.
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

댓글 없음:

댓글 쓰기