Linux 커널 개발 이중 컴퓨터 디버깅 (KGDB)

리눅스 커널을 배우는 것은 많은 프로그래머의 꿈입니다. 커널 오류는 종종 시스템 다운 타임을 유발합니다. 오류 발생 당시의 상황을 유지하기가 어렵습니다. Linux 커널 개발 및 드라이버 디버깅을 위해 듀얼 컴퓨터 디버깅 환경은 다음과 같습니다. 일반적으로 필요합니다. KGDB는 커널 버전 2.6.26에 있으며 공식적으로 지원되어 커널 및 드라이버의 디버깅을 용이하게 할 수 있습니다.

예비 준비

1. vmware 가상 머신, 낮은 버전 커널 학습에 더 적합한 centos6 운영 체제 (커널 버전 2.6.32)
설치 2. 개발 도구 체인 설치 sudo yum groupinstall "개발 도구"
3. ncurses 설치 : sudo yum install ncurses- make menuconfig가 ncurses에 의존하기 때문에 devel

커널 컴파일

리눅스 커널 코드의 압축을 풀고 소스 디렉토리에 들어가서 다음을 실행하십시오 : make menuconfig

Kernel Hacking --> 
      (1)选中Compile the kernel with frame pointers 
      (2)去掉Write protect kernel read-only data structures(否则不能用软件断点)
清理以前的编译痕迹(如果需要)
make mrproper
make clean
编译内核: 
make -j4 bzImage 

컴파일은 압축 된 커널 파일 인 / boot 디렉토리의 vmlinuz 파일에 해당하는 bzImage 파일을 생성합니다. 운영 체제는 부팅로드 중에 파일이 메모리로 압축 해제 된 후에 만 ​​실행할 수 있습니다.

编译内核模块: 
make -j4 modules 

커널이 실행 중일 때 커널 파일 외에도 일부 주변 모듈 (예 : 드라이버)을로드하여 실행해야합니다.

커널 및 모듈 설치

커널 모듈 설치 : make modules_install
은 이전 단계에서 컴파일 된 커널 모듈을 설치하며 일반적으로 / lib / modules 디렉토리에 설치됩니다.
커널 설치 : make install

[root@localhost linux-2.6.32.27]# make install
sh /root/build/linux-2.6.32.27/arch/x86/boot/install.sh 2.6.32.27 arch/x86/boot/bzImage \
                System.map "/boot"
ERROR: modinfo: could not find module xt_CHECKSUM
ERROR: modinfo: could not find module nf_defrag_ipv6
ERROR: modinfo: could not find module vmware_balloon
ERROR: modinfo: could not find module vmwgfx

이러한 오류는 무시할 수 있습니다.

生成initrd.img
mkinitrd /boot/initrd-2.6.32.27.img 2.6.32.27 

새 커널 부팅

시스템을 다시 시작하고 방금 컴파일 한 커널 시작 항목을 선택합니다. 다시 시작한 후 다음을 찾습니다.

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32.27 #1 SMP Fri Mar 12 17:47:47 CST 2021 i686 i686 i386 GNU/Linux

커널이 업데이트되었습니다.

이중 시스템 디버깅 구성

가상 머신 스냅 샷을 생성하고 스냅 샷을 기반으로 새 머신을 생성 한 후 대상 머신에 사용합니다.
대상에 직렬 포트를 추가하고 (먼저 프린터 장치를 제거)
Linux 커널 개발 이중 컴퓨터 디버깅 (KGDB)
개발 시스템에 직렬 포트를 추가합니다 (먼저 프린터 장치를 제거).
Linux 커널 개발 이중 컴퓨터 디버깅 (KGDB)

GRUB 파일 수정

대상 머신을 시작하고 grub 파일을 수정합니다.

[root@localhost ~]# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32.27)
        root (hd0,0)
        kernel /vmlinuz-2.6.32.27 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=128M rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet kgdboc=ttyS0,115200 kgdbwait
        initrd /initramfs-2.6.32.27.img
title CentOS 6 (2.6.32-754.el6.i686)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=128M rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-754.el6.i686.img

kgdboc = ttyS0,115200 : ttyS0 사용, 전송 속도 115200
kgdbwait : 시작 프로세스 동안 커널이 gdb 연결을 기다리도록합니다. 그런 다음 대상을 다시 시작하면 시스템이 kgdbwait에서 일시 중지되어 호스트 측에서 gdb 연결을 기다립니다.
grub 파일을 수정 한 후 시스템을 다시 시작하면 시스템이 다음 상태로 유지됩니다.
Linux 커널 개발 이중 컴퓨터 디버깅 (KGDB)

디버깅을 위해 개발 머신을 시작하고 커널 컴파일 디렉토리를 입력 한 다음 gdb ./vmlinux를 실행하십시오.

(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
kgdb_breakpoint (new_kgdb_io_ops=0xc0a0b7d8) at kernel/kgdb.c:1721
1721 wmb(); /* Sync point after breakpoint */
(gdb) c  (继续运行)

대상 컴퓨터가 시스템에 들어간 다음 디버그 모드로 돌아 가려는 경우 : 대상 컴퓨터에서 실행 : echo g> / proc / sysrq-trigger

추천

출처blog.51cto.com/14207158/2657966