作为一名内核开发者,调试需求具有更高优先级
CONFIG_DEBUG_KERNEL
该选项仅仅使得其他的调试选项可用。我们应该打开该选项,但它本身不会打开所有的调试功能。
CONFIG_DEBUG_SLAB
这是一个非常重要的选项,它打开内核分配函数中的多个类型的检查;打开该检查后,就可以检测许多内存溢出以及忘记初始化的错误。在将已分配内存返回给调用者之前,内核将其中的每个字节设置为0xa5,而在释放后将其设置为0x6b。如果读者在自己驱动程序的输出中,或者在oops信息中看到上述“毒剂”字符,则可轻松判断问题所在。在打开该选项后,内核还会在每个已分配内存对象的前面和后面放置一些特殊的防护值,这样当这些防护值发生变化时,内核就可以知道有些代码超出了内存的正常访问范围。同时,该选项还会检查更多的隐藏错误。
CONFIG_DEBUG_PAGEALLOC
在释放时,全部内存页从内核地址空间中移除。该选项将大大降低运行速度,但可以快速定位特定的内存损坏错误的所在位置。
CONFIG_DEBUG_SPINLOCK
内核将捕获自旋锁的错误操作,比如操作未初始化自旋锁、两次解开同一锁的操作等其他错误。
CONFIG_DEBUG_ATOMIC_SLEEP
该选项将会检查拥有原子锁的休眠企图。
CONFIG_DEBUG_INFO
该选项将使内核的构造包含完整的调试信息。如果读者打算用gdb调试内核,将需要这些信息,还需要打开CONFIG_FRAME_POINTER。
CONFIG_DEBUG_STACKOVERFLOW
CONFIG_DEBUG_STACK_USAGE
这些选项帮助跟踪内核栈溢出问题。栈溢出的确切信号是不包含任何合理的反向跟踪信息的oops清单。第一个选项将在内核中增加明确的溢出检查;第二个选项将让内核监视栈的使用(打印最大栈深度),并通过sysrq按键输出一些统计信息。
CONFIG_DEBUG_KMEMLEAK
kmemleak是内核提供的一种检测内存泄露工具,启动一个内核线程扫描内存,每隔一定时间扫描内存(默认10分钟),并打印发现新的未引用对象数量。
CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=16000
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y---关闭此选项,则不需要在命令行添加kmemleak=on
使用方法:
立即触发保存扫描结果
echo scan > /sys/kernel/debug/kmemleak
显示可能的内存泄漏的详细信息,需要先挂载debugfs文件系统:
mount -t debugfs nodev /sys/kernel/debug
cat /sys/kernel/debug/kmemleak
参考:
基于SLUB的DEBUG功能,如何帮忙检测内存越界和访问已经释放的内存-电子发烧友网
slub检测原理
https://www.elecfans.com/d/632431.html