Linux kernel 使用gdb进行远程linux内核调试时未命中断点

Linux kernel 使用gdb进行远程linux内核调试时未命中断点,linux-kernel,gdb,remote-debugging,jtag,Linux Kernel,Gdb,Remote Debugging,Jtag,我正在尝试使用jtag probe和gdb远程调试运行在arm cortex-a9目标上的linux内核。 我可以连接到内核并用gdb停止它。我能够在内核代码中设置断点,gdb也确认了断点的位置,但问题是一旦我开始执行并发出continue命令,断点就不会被命中,内核就会继续运行 在这方面请帮助我。 谢谢。如上所述,您应该使用hbreak命令将断点设置为硬件断点。只有这样才会命中断点。如上所述,您应该将断点设置为硬件断点,即-使用hbreak命令。只有在这之后,断点才会被命中。对于阅读本文的任何

我正在尝试使用jtag probe和gdb远程调试运行在arm cortex-a9目标上的linux内核。 我可以连接到内核并用gdb停止它。我能够在内核代码中设置断点,gdb也确认了断点的位置,但问题是一旦我开始执行并发出continue命令,断点就不会被命中,内核就会继续运行

在这方面请帮助我。
谢谢。

如上所述,您应该使用hbreak命令将断点设置为硬件断点。只有这样才会命中断点。

如上所述,您应该将断点设置为硬件断点,即-使用hbreak命令。只有在这之后,断点才会被命中。

对于阅读本文的任何人,调试器在默认情况下不会与软件断点一起中断,请参阅相关文档:

如果您使用的架构支持内核选项CuffiStRultTuxKelnILRWX,则应该考虑关闭它。此选项将阻止使用软件断点,因为它将内核内存空间的某些区域标记为只读。如果kgdb支持您正在使用的体系结构,那么如果您希望在打开CONFIG\u STRICT\u KERNEL\u RWX选项的情况下运行,则可以使用硬件断点,否则需要关闭此选项


禁用RWX并重新编译,则软件断点应能正常工作。在此之后,软件断点开始正常工作。对于阅读此文件的任何人,调试器默认不会使用软件断点中断,请参阅相关文档:

如果您使用的架构支持内核选项CuffiStRultTuxKelnILRWX,则应该考虑关闭它。此选项将阻止使用软件断点,因为它将内核内存空间的某些区域标记为只读。如果kgdb支持您正在使用的体系结构,那么如果您希望在打开CONFIG\u STRICT\u KERNEL\u RWX选项的情况下运行,则可以使用硬件断点,否则需要关闭此选项


禁用RWX并重新编译,那么软件断点应该可以正常工作。在这种情况下,KASLR内核地址空间布局随机化可能是罪魁祸首。
即使您设置了hbreak,实际的代码位置也可能与使用KASLR时从.elf文件中看到的地址不同,因此要么将pass-append nokaslr添加到内核引导参数,要么使用RANDOMIZE_BASE=n配置内核。这适用于arm64和x86_64。也可能是其他架构。

在某些情况下,KASLR内核地址空间布局随机化可能是罪魁祸首。
即使您设置了hbreak,实际的代码位置也可能与使用KASLR时从.elf文件中看到的地址不同,因此要么将pass-append nokaslr添加到内核引导参数,要么使用RANDOMIZE_BASE=n配置内核。这适用于arm64和x86_64。可能还有其他架构。

我在编译内核时关闭了所有优化,并从menuconfig内核黑客选项中启用了build with debug info选项……我在编译内核时关闭了所有优化,从menuconfig内核黑客选项中启用了build with debug info选项。。。。