QEMU에서 실행되는 커널을 디버깅하기 위해 GDB를 사용하려고 합니다.
커널은 다음 옵션으로 컴파일되었습니다:
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y
다음 명령을 사용하여 qemu에서 커널을 시작합니다.
qemu-system-x86_64 -s -S -kernel arch/x86_64/boot/bzImage
별도의 터미널에서 동일한 경로에서 GDB를 시작하고 다음 명령을 순서대로 실행했습니다.
gdb ./vmlinux
(gdb) target remote localhost:1234
(gdb) hbreak start_kernel
(gdb) c
나는 지금 완전한 작동 시스템이 아닌 커널에만 관심이 있기 때문에 rootfs를 제공하지 않습니다. 나는 또한 hbreak/break 조합을 시도했습니다.
커널이 방금 부팅되었고 rootfs를 찾을 수 없기 때문에 커널 패닉이 발생했습니다... 이는 예상된 일이었습니다. start_kernel에서 멈추고 코드를 단계별로 실행하고 싶습니다.
관찰: 즉시 중단점을 설정하면 작동하고 중지되지만 start_kernel /startup_64/main에서는 작동하지 않습니다.
qemu가 이러한 모든 기능을 호출하지 않거나 어떤 방식으로든 차단될 가능성이 있습니까?
Kernel: 4.13.4
GDB: GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
GCC: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
system: ubuntu 14.04 LTS
참고: 이와 똑같은 프로세스는 커널 3.2.93에서는 작동하지만 4.13.4에서는 작동하지 않으므로 더 많은 구성이 필요한 것 같습니다. 커널 4.0 이상에서 이 디버깅 프로세스를 활성화하는 리소스를 온라인에서 찾을 수 없으므로 지금은 3.2를 사용하겠습니다. 이에 대한 모든 의견은 환영합니다.
답변1
저도 같은 문제가 있었는데 해결책을 찾았어요Linux 커널 초보자 메일링 리스트.
비활성화해야 해카슬라우어커널 명령줄에서 옵션을 사용 nokaslr
하거나 커널 옵션을 비활성화하세요."커널 메모리 부분을 무작위로 지정"~에"프로세서 유형 및 기능"커널 이미지를 빌드할 때.
답변2
tcg 가속기를 사용하는 경우 "nokaslr" 외에도 qemu에 gdbstub 버그도 있습니다. 버그 수정 버전이 있는지 확인하세요.
아래에서 내가 제출한 패치를 확인하세요.