debugging - Depuración del Kernel de Linux usando GDB en qemu incapaz de presionar la función o dirección dada
linux-kernel embedded-linux (1)
No puede poner puntos de corte en ninguna función que preceda start_kernel porque no está cargando símbolos para ellos. De hecho, estás comenzando qemu con una zImage del kernel pero cargando los símbolos de vmlinux. No son lo mismo: zImage es básicamente vmlinux comprimido como una carga de datos que luego se adjunta a un stub que lo descomprime en la memoria y luego salta a start_kernel.
start_kernel es el punto de entrada de vmlinux, cualquier función que lo preceda, incluyendo descompress_kernel, son parte del stub y no están presentes en vmlinux.
No sé si hacer "arm-none-linux-gnueabi-gdb zImage" me permite depurar el stub, siempre he hecho depuración temprana de kernels ARM con depuradores JTAG en hardware real, y nunca he usado qemu para eso, lo siento
Estoy tratando de entender la secuencia de arranque del kernel paso a paso usando GDB en el entorno qemu.
A continuación está mi configuración: -
En un terminal estoy ejecutando
~/Qemu_arm/bin/qemu-system-arm -M vexpress-a9 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./arch/arm/boot/zImage -append "root=/dev/mmcblk0 console=ttyAMA0" -sd ../Images/RootFS.ext3 -serial stdio -s -S
En otra terminal
arm-none-linux-gnueabi-gdb vmlinux
Reading symbols from vmlinux...done.
(gdb) target remote :1234
Remote debugging using :1234
0x60000000 in ?? ()
Mi pregunta es cómo configurar el punto de interrupción para el código en / arch / arm / boot / compressed / * files.
por ejemplo, intenté configurar el punto de interrupción para descompress_kernel definido en misc.c.
Caso 1:
(gdb) b decompress_kernel
Function "decompress_kernel" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (decompress_kernel) pending.
(gdb) c
Continuing.
El anterior no puede presionar la función qemu está arrancando.
Caso 2
(gdb) b *0x80008000
Breakpoint 1 at 0x80008000: file arch/arm/kernel/head.S, line 89.
(gdb) c
Continuing.
En este caso también no es capaz de golpear, en cambio qemu está arrancando.
Caso 3:
(gdb) b start_kernel
Breakpoint 1 at 0x8064d8d8: file init/main.c, line 498.
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:498
498 {
(gdb)
En este caso, la función está golpeando y puedo depurar paso a paso.
Nota: He habilitado la depuración, Early printk y he probado hbreak
Entonces mi consulta es
1)why some funtions are not able to hit break points?
2)Is this qemu limitation or do i need enable something more ?
3)do i need to append any extra parameters ?
4)how to Debug early kernel booting