我已经构建了一个linux内核模块,它有助于将TCP套接字从一个服务器迁移到另一个服务器。该模块工作正常,除非导入服务器尝试关闭迁移套接字,整个服务器挂起并冻结。
我无法找到问题的根源,我相信它超出了我的内核模块代码。当我在导入机器中重新创建套接字并初始化其状态时,我遗漏了一些东西。似乎系统正在进入无限循环。但是当我从客户端关闭套接字时,根本不会出现此问题。
所以我的问题是,调试内核模块并弄清楚发生了什么的合适方法是什么,为什么它会冻结?如何转储错误消息,特别是在我的情况下,我无法看到任何内容,一旦我关闭与服务器端迁移的套接字相关的文件描述符,机器就会冻结。
注意:我使用printk打印所有值,但我无法在代码中找到错误。
答案 0 :(得分:1)
考虑到您的系统正在冻结,您是否在迁移套接字时检查了系统是否处于高负载状态,您是否查看了任何sar报告以确认这一点,看看您是否可以使用vmcore(在配置kdump之后)并使用崩溃 - 工具缩小问题范围。首先,安装并配置kdump,然后您可能需要将以下行添加到/etc/sysctl.conf并运行sysctl -p
kernel.hung_task_panic=1
kernel.hung_task_timeout_secs=300
接下来获取内存的vmcore /转储:
echo 'c' > /proc/sysrq-trigger
#===> 1
如果您仍然可以访问终端,请使用sysrq-trigger在syslog中转储内核线程的所有堆栈跟踪:
echo 't' > /proc/sysrq-trigger
如果系统挂起,请尝试使用键盘热键 Alt + PrintScreen +'c'====>与 1
相同您可能想尝试的其他事项,假设您已尝试过以下某些方法: 1.代码中的dump_stack() 2. printk(KERN_ALERT“Hello msg%ld”,错误);在代码中添加这些行。 dmesg -c; dmesg