카테고리

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

Qemu 사용 커널 디버깅 하기.

Qemu 사용 커널 디버깅 하기.

Kmemleak 커널 옵션 설정
커널 메모리 누수 활성화.
초기 로그 항목 최대값 지정, 값이 너무 낮으면 부팅시 비활성화 됨.
-> Memory Debugging
                [*]Enable kernel memory leak detector.
                (2000) Maximum kmemleak early log entries

주기적 커널 메모리 누수 감지. 메모리 누출이 감지되면, dmesg에 log를 남긴다.
수동 트리거 설정
$ echo scan >> /sys/kernel/debug/kmemleak
$ cat /sys/kernel/debug/kmemleak

메몰리 누수 검사는 일정한 시간동안 탐지 한므로, 메모리 누수를 바로 확인 할 수 없다.
누수가 감지되지 않으면 log를 남기지 않는다.
누수가 감지되면, 누출이 된 곳에서 여러 차례 수동 검사를 해야함.

자세한 내용
https://www.kernel.org/doc/Documentation/kmemleak.txt

네트워크 설정
ssh 접근해 잡업을 위해 설정

auto eth0
iface eth0 inet dhcp

$ apt-get install openssh-server
$ adduser user

ssh 게스트 접근.
host port -net nic -net user,hostfwd=tcp::5555-:22.

$ qemu-system-x86_64 -kernel bzImage
                     -append "root=/dev/sda console=ttyS0 single"
                     -drive file=toto.img,index=0,media=disk,format=raw
                     --enable-kvm --nographic
                     -net nic -net user,hostfwd=tcp::5555-:22

호스트 컴퓨터 접근
$ ssh -p 5555 user@localhost

QEMU에서 USB 장치 브리짓
$ lsusb
-usb -usbdevice host:050d:016a. 공급 업체 확인.

GDB 부팅
커널 디버깅, Kernel hacking” 옵션에서 들어간다.
        [*] KGDB: kernel debugger  --->
                <*>   KGDB: use kgdb over the serial console
        -> Compile-time checks and compiler options
                [*] Compile the kernel with debug info


-s 옵션 추가
게스트 사용자 커널 디버깅을 위해 포트 생성.
호스트 TCP 소켓으로 gdb와 연결.
$ qemu-system-x86_64 -kernel arch/x86/boot/bzImage
                     -hda toto.img
                     -append "root=/dev/sda" -s

동일한 부팅 같지만, gdb로 커널 디버깅 가능하게 설정한 상태이다.

vmlinux는 비압축 bzImage이며 심볼은 바이너리에 포함된다.
이러한 이유 때문에 gdb를 사용할 수 있데 된다.

$ gdb vmlinux

gdb 시스템 연결.
(gdb) target remote localhost:1234

가상 컴퓨터 중지, gdb 명령을 사용 역 추적 검사.
(gdb) breakpoint spin_lock
(gdb) continue

커널 디버깅 옵션 추가
동적 디버그 사용.
-> printk and dmesg options
                [*] Enable dynamic printk() support

유용할 수 있으므로 추가.
-> Tracers (FTRACE [=y])

-s 옵션으로 2대의 시스템을 디버깅 할 때, 프로세스마다 전용 통신포트를 생성해야 함.

동일한 디스크의에서 다른 이미지 두개를 사용해 디버깅시 정의하지 않은 결과가 생성될 수 있으며, 이러한 이유 때문에 이미지가 손살될 수 있다.
이미지를 새로운 이름으로 복사해 작업.
qemu에서 지원하는 copy-to-write 를 사용해 원본 파일 시스템 변경 사항을 별도의 파일로 작성해 관리하므로 해당 문제 해결.

댓글 없음:

댓글 쓰기