Skip to main content
 首页 » 编程设计

linux-kernel之调试 Linux 调度程序

2024年12月31日19JeffreyZhao

我正在尝试实现一个新的内核调度程序作为我的学术项目。我知道这可能会减慢系统速度,但出于调试目的,我在上下文切换和调度函数中编写了一个 printk 语句,以便我可以在 dmesg 输出中看到该事件。但是我在 dmesg 文件中没有得到任何输出。我试图在不同的地方插入 printk 语句,但没有得到任何输出。我在做某事吗?有没有更好的工具或技术来调试这种任务?

请您参考如下方法:

学习 ftrace for linux kernel 怎么样?使用它的方式稍微依赖于内核版本。只需阅读文件/sys/kernel/debug/tracing/README 了解详细信息。

如果上面的目录不存在,那么你可能需要挂载它:

mount -t debugfs nodev /sys/kernel/debug 

然后编写一个 bash shell 脚本来生成用户空间跟踪:
#!/bin/bash 
echo 0 >/sys/kernel/debug/tracing/tracing_enabled 
echo 'sched_*' 'irq_*' > /sys/kernel/debug/tracing/set_ftrace_filter 
echo function >/sys/kernel/debug/tracing/current_tracer 
echo 1 >/sys/kernel/debug/tracing/tracing_enabled 
 
ls -al /tmp/ 1>/dev/null & 
ls -al /tmp/ 1>/dev/null & 
ls -al /tmp/ 1>/dev/null & 
ls -al /tmp/ 1>/dev/null & 
ls -al /tmp/ 1>/dev/null & 
ls -al /tmp/ 1>/dev/null & 
 
sleep 3 
 
echo 0 >/sys/kernel/debug/tracing/tracing_enabled 
 
cat /sys/kernel/debug/tracing/trace 

注意事项:

一种。 Linux内核调度是在内核源代码的kernel/sched目录下实现的。一个例子是 fair.c 中的 CFQ。

湾看文件找API,我们知道调度涉及的相关API都是以“irq_”和“sched_”开头的,所以我们把它编码到上面的shell脚本中。

C。上面shell脚本在我的系统上的输出位于下面(它是gzipped,大约21K行,在大量截断“open”相关函数之后):

https://drive.google.com/file/d/0B1hg6_FvnEa8dDBMcl9tcEs2VEU/edit?usp=sharing

基本上你可以看到哪个内核函数涉及到哪个进程上下文。从内核函数的名称,你可以通过阅读源代码继续跟踪。

更多细节你可以进一步谷歌,例如:

http://tthtlc.wordpress.com/2013/11/19/using-ftrace-to-understanding-linux-kernel-api/