gpt4 book ai didi

c - 内核模块中的调试堆栈溢出

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:51 26 4
gpt4 key购买 nike

我正在编写驱动程序代码,这会导致堆栈溢出问题和内存损坏。目前运行模块给出,“异常堆栈”和堆栈跟踪看起来已损坏。

模块有编译警告。警告已解决使用 gcc 选项“-WFrame-larger-than=len”。

问题可能是由过多的内联和大量函数参数和大量嵌套函数。我需要继续测试并继续重构代码,是否有可能对内核进行任何修改以增加堆栈大小?另外,您将如何调试此类问题。

最佳答案

虽然您的模块会编译带有“-WFrame-larger-than=len”的警告,但它仍然会导致堆栈溢出并可能破坏核心数据结构,从而导致系统进入不一致状态。

Linux 内核堆栈大小限制为 8KiB(在 3.18 之前的内核版本中),现在为 16KiB(对于 3.18 之后的版本)。由于 virtioqemu-kvm 中的许多问题,最近提交了一次,内核堆栈已扩展到 16KiB。

现在,如果您想将堆栈大小增加到 32KiB,则需要在内核源文件中进行以下更改后重新编译内核:(arch/x86/include/asm/page_64_types.h)

    // for 32K stack
- #define THREAD_SIZE_ORDER 2
+ #define THREAD_SIZE_ORDER 3

Linux 内核版本 3.18 的最新提交显示内核堆栈大小已经增加到 16K,这在大多数情况下应该足够了。

commit 6538b8ea886e472f4431db8ca1d60478f838d14b
Author: Minchan Kim <minchan@kernel.org>
Date: Wed May 28 15:53:59 2014 +0900

x86_64: expand kernel stack to 16K

引用LWN: [RFC 2/2] x86_64: expand kernel stack to 16K

至于调试此类问题,没有单行答案如何解决,但这里有一些我可以分享的技巧。在您的模块中使用 dump_stack() 以在 syslog 中获取堆栈跟踪,这确实有助于调试与堆栈相关的问题。

使用 debugfs,打开堆栈深度检查功能:

# mount -t debugfs nodev /sys/kernel/debug
# echo 1 > /proc/sys/kernel/stack_tracer_enabled

并定期捕获以下文件的输出:

# cat /sys/kernel/debug/tracing/stack_max_size
# cat /sys/kernel/debug/tracing/stack_trace

上述文件将报告模块加载和测试时的最高堆栈使用情况。

让下面的命令继续运行:

while true; do date; cat /sys/kernel/debug/tracing/stack_max_size;
cat /sys/kernel/debug/tracing/stack_trace; echo ======; sleep 30; done

如果您看到 stack_max_size 值可能超过 ~14000 字节(对于内核的 16KiB 堆栈版本),那么堆栈跟踪将值得进一步研究。此外,您可能还需要设置崩溃工具以在发生紧急情况时捕获 vmcore 核心文件。

关于c - 内核模块中的调试堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27478788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com