JTAG + GDB를 사용하여 Linux 커널을 디버깅하는 방법은 무엇입니까?

JTAG + GDB를 사용하여 Linux 커널을 디버깅하는 방법은 무엇입니까?

내 보드에 JTAG 연결과 직렬 포트 연결을 성공적으로 설정했습니다. 나는 아래 다이어그램을 따랐습니다 (약간의 차이가 있음).

내 거GDB_클라이언트내 Linux 호스트에는 있지만OCD 열기내 Windows 호스트에 있으며 다음을 사용하여 서로 통신합니다.GDB 서버인터넷을 통해. 그들은 서로 쉽게 통신할 수 있으며 다음을 통해 내 보드에 애플리케이션을 로드할 수 있습니다.광둥개발은행내 Linux에서 JTAG를 통해.

1

이 내 꺼야플랫폼 사양:

SOC: STM32H743 (Cortex m7 single core -> ARMv7E-M)
Internal Flash: 2MB (only u-boot is in the flash memory)
Board: Waveshare CoreH7XXI dev board
On-board DRAM: 8MB
SDCARD: 1GB (the ROOTFS and Linux kernel are in the SD card)
Bootloader: mainline U-boot
kernel:     mainline Linux kernel

Debug Probe: STLink V2

~에 따르면이 가이드: 커널을 메모리에 로드하기 gdb를 사용하여 커널을 디버깅하는 데 익숙해지면 gdb를 사용하여 타겟에 직접 커널을 로드할 수 있습니다. 가장 실용적인 방법은 커널 시작 시 하드웨어 중단점을 설정하고 JTAG 재설정 신호를 사용하여 보드를 재설정하는 것입니다. 부트로더는 보드를 초기화하고 커널이 시작되면 실행이 중지됩니다. 그런 다음 커널을 메모리에 로드하고 실행할 수 있습니다.

커널 시작 부분에 부리 포인트를 배치했고,그런데 문제는 중단점에서 멈추지 않는다는 것이다.로드하자가상 머신Linux내 기억에 파일을 저장하세요.

이것이 내가 하는 일이다:

(gdb) file vmlinux
(gdb) target remote 192.168.1.53:8888
(gdb) break __init_begin
(gdb) cont
(gdb) mon reset #perhaps this needs to be done from the openocd telnet session..
Breakpoint 1, 0xc0008000 in stext ()
(gdb) load vmlinux

나도 이것을 시도했지만 다시 중단점에서 멈추지 않습니다.

(gdb) break *0xD0008000
Breakpoint 9 at 0xd0008000: file arch/arm/kernel/head-nommu.S, line 61.

고쳐 쓰다:

때로는 작동하지만 때로는 작동하지 않습니다. 보드를 재설정한 후 gdb를 사용하여 프로그램을 빠르게 일시 중지한 다음 다시 시작하여 작동하게 해야 할 것 같습니다. 왜 이런 일이 발생합니까?

답변1

"kaslr" 옵션을 비활성화해 보셨나요? 또한 중단점을 설정하려고 시도했지만 중단점이 도달하지 못했습니다. bootargs에 "nokaslr"을 전달하여 비활성화하려고 시도했지만 작동하지 않습니다. 대상 보드(Xilinx Zynq Ultrascale+)에서 여전히 "Full Randomize" 옵션이 선택되어 있기 때문에 이것이 적용되지 않는 것으로 가정합니다.

cat /proc/sys/kernel/randomize_va_space저는 타겟보드에 사용합니다 .

이것이 올바른 접근 방식인지는 확실하지 않지만 주소 불일치로 인해 중단점이 적중되지 않는 것으로 직감적으로 알 수 있습니다.

관련 정보