커널 디버깅을 위해 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
. 필요한 경우 다음을 고려하십시오.
- 최소
init
실행 가능 이미지:단 하나의 프로그램, 단 하나의 프로그램만 실행하도록 Linux 배포판 사용자 정의 | - Busybox 대화형 시스템:가장 작은 Linux 구현은 무엇입니까? Unix 및 Linux 스택 교환 |
그런 다음 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 커널 모듈을 디버깅하는 방법은 무엇입니까? |스택 오버플로
hbreak
Ubuntu 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
관련 주제:
- https://sourceware.org/bugzilla/show_bug.cgi?id=13984GDB 버그일 가능성이 있음
- gdb - 원격 'g' 패킷 응답이 너무 깁니다.
- http://wiki.osdev.org/QEMU_and_GDB_in_long_modeosdev.org는 평소와 마찬가지로 이러한 질문에 대한 훌륭한 소스입니다.
- https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html
또한보십시오:
- https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst공식 Linux 커널 "문서"
- GDB 및 QEMU를 사용하여 Linux 커널을 디버깅하는 방법은 무엇입니까? |스택 오버플로
알려진 제한사항:
- Linux 커널에서는 지원되지 않습니다(패치 없이는 컴파일할 수도 없음)
-O0
.Linux 커널을 최적화 해제하고 -O0으로 컴파일하는 방법은 무엇입니까? |스택 오버플로 - 수정 후에도 GDB 7.11은 몇 가지 유형의 탭 완성 기능으로 여러분을 놀라게 할 것입니다
max-completions
.대용량 바이너리 파일의 탭 완료 중단 스택 오버플로 |이번 패치에서 다루지 않는 코너 케이스가 있을 수 있습니다. 따라서ulimit -Sv 500000
디버깅하기 전에 이 작업을 수행하는 것이 좋습니다. 특히file<tab>
다음 매개변수에 대한 탭을 완료할 때filename
:sys_execve
Linux 커널의 sys_execve() 시스템 호출이 절대 경로와 상대 경로를 모두 받을 수 있습니까? |스택 오버플로