QEMU를 사용하여 Linux 커널 디버깅

QEMU를 사용하여 Linux 커널 디버깅

커널 디버깅을 위해 QEMU를 사용하려고 합니다. 처음에 시도했지만 가상 파일 시스템이 없어서 실패했습니다. 대답이 게시물가상 파일 시스템을 사용하는 것이 좋습니다. 그러나 커널 디버깅을 위한 가상 FS를 생성하는 방법과 이를 qemu에 전달하는 방법은 논의하지 않습니다. 도와주세요?

답변1

사용하려는 배포에 따라 다음과 같은 파일 시스템 이미지를 생성하는 여러 가지 방법이 있습니다.이 기사당신을 힘든 길로 인도하는"처음부터 리눅스"체계.

일반적으로 말하면, 너누구나다음을 사용하여 QEMU 이미지를 qemu-img생성 합니다.QEMU 사용설치 미디어를 사용하여 이미지를 준비합니다(이 페이지는 Debian GNU/Linux 프로세스를 설명합니다.)또는다른 사람이 준비한 이미지를 사용하세요.

QEMU 위키북의 이 섹션필요한 모든 정보가 포함되어 있습니다.

편집하다: 연결된 질문에 대한 Giles의 답변에서 알 수 있듯이 테스트하는 데 전체 루트 파일 시스템이 필요하지 않습니다.이미지 사용 initrd(예: 아래 표시된 Arch Linux의 initrd)

답변2

Ubuntu 16.10 호스트에서 테스트된 QEMU + GDB 단계별 절차

처음부터 빠르게 시작하기 위해 다음 위치에서 최소한의 완전 자동화된 QEMU + Buildroot 예제를 만들었습니다.https://github.com/cirosantilli/linux-kernel-module-cheat주요 단계는 다음과 같습니다.

먼저 루트 파일 시스템을 얻으십시오 rootfs.cpio.gz. 필요한 경우 다음을 고려하십시오.

그런 다음 Linux 커널에서:

git checkout v4.9
make mrproper
make x86_64_defconfig
cat <<EOF >.config-fragment
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
                   -initrd rootfs.cpio.gz -S -s

다른 터미널에서 다음에서 디버깅을 시작한다고 가정해 보겠습니다 start_kernel.

gdb \
    -ex "add-auto-load-safe-path $(pwd)" \
    -ex "file vmlinux" \
    -ex 'set arch i386:x86-64:intel' \
    -ex 'target remote localhost:1234' \
    -ex 'break start_kernel' \
    -ex 'continue' \
    -ex 'disconnect' \
    -ex 'set arch i386:x86-64' \
    -ex 'target remote localhost:1234'

이제 끝났습니다!

커널 모듈에 대해서는 다음을 참조하세요.QEMU를 사용하여 Linux 커널 모듈을 디버깅하는 방법은 무엇입니까? |스택 오버플로

hbreakUbuntu 14.04의 경우 GDB 7.7.1이 필요하며 break소프트웨어 중단점이 무시됩니다. 16.10에서는 더 이상 그렇지 않습니다. 또한보십시오:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

혼란 disconnect과 다음에 일어나는 일은 오류를 해결하는 것입니다.

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000

관련 주제:

또한보십시오:

알려진 제한사항:

관련 정보