QEMU + (K)GDB를 사용하여 Linux 커널 디버깅 - 몇 가지 의심과 질문

QEMU + (K)GDB를 사용하여 Linux 커널 디버깅 - 몇 가지 의심과 질문

QEMU를 통해 Linux 커널(v3.13)을 디버깅하려고 합니다. 나는 사용하고있다이것,이것그리고이것참조. 내 호스트는 Linux Mint Victoria이므로 v3.13(2014년경) 커널과 rootfs를 컴파일하는 것은 너무 많은 문제입니다.

그래서 나는 다음과 같이 Ubuntu Trust Tahr를 얻기 위해 도커 컨테이너를 사용했습니다.

mkdir docker
FROM ubuntu:14.04" > docker/Dockerfile
RUN apt-get update && apt-get install -y vim wget unzip bc git python rsync build-essential libncurses5-dev locales" >> docker/Dockerfile
docker build --tag "ubuntu-trusty" docker/

컨테이너에 진입한 후 buildroot를 복제하고 태그를 체크아웃했습니다 2014/08. 그런 다음 buildroot에게 커널(v3.13.5)을 빌드해 달라고 요청했습니다. 이것은 내 빌드 루트 디렉토리입니다구성그리고 커널구성옵션.

참고로 저는 rootfs를 커널에 통합하기로 결정했습니다.initramfs로상술 한 바와 같이여기. 완료되면 아카이브 rootfs.cpiobzImage아래에 output/images. 모든 작업이 완료되면 다음과 같이 qemu를 호출합니다.

sudo qemu-system-x86_64 --enable-kvm -serial tcp::1234,server,nowait -m 512M -kernel ./bzImage -append "kgdbwait kgdboc=ttyS0,115200 nokaslr ip=dhcp" -net nic,model=virtio -device virtio-blk,drive=drive0 -drive file=./disk.img,format=raw,if=none,id=drive0

그러면 시작 로그를 표시하는 새 창이 열리고 결과적으로 getty 프로세스가 실행되어 로그인할 수 있습니다. 그래서 이것은 내 쿼리입니다

  1. QEMU 로 이동하면 -nographic로그인 프롬프트가 표시되지 않습니다. 왜?
  2. -swhich를 사용하면 -gdb tcp:1234gdb 클라이언트가 올바르게 연결할 수 없는 것 같습니다(사용할 때와 커널의 다른 위치에서 중단됨 -serial tcp::1234,server,nowait). 원격 GDB
  3. 이와 같은 ext2 이미지를 생성했지만 qemu-img create disk.img 10G && mkfs.ext2 -F disk.img부팅 중에 연결/감지되는지 확실하지 않습니다. 기계가 시작된 후 확인하는 방법은 무엇입니까?

답변1

이 문제에 대해 질문이 너무 많습니다. #2에 답하겠습니다.

while -s-gdb tcp::1234은 동등합니다. -serial tcp::1234,server,nowait뭔가를 하고 있는 중입니다.완전히 다른.

처음 두 옵션( -s및 이에 상응하는 항목 -gdb tcp::1234)은 유익합니다.게임디버거 연결을 수신합니다.

이 옵션은 -serial tcp::1234,server,nowait단순히 qemu에게 가상 머신 직렬 포트를 TCP 소켓에 연결하라고 지시합니다. 그 자체로는 디버깅과 관련이 없습니다.

하지만...

KGDB를 지원하도록 커널을 구성하고 설정한 kgdboc=ttyS0,115200경우핵심직렬 포트에서 gdb 연결을 수신합니다.

두 메커니즘 모두 커널 디버깅을 허용 gdb하지만 첫 번째 메커니즘은 qemu의 디버깅 기능을 활용하는 반면 후자는 커널에서 kgdb 지원을 활성화해야 합니다.

관련 정보