调试 Linux 调度程序

5

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

2个回答

5

学习 Linux 内核的 ftrace 怎么样?使用它的方式略微依赖于内核版本。请参阅文件 /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

需要注意的事项:

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

b. 通过阅读文件并查找API,我们知道与调度相关的API以“irq_”和“sched_”开头,这就是为什么我们将其编码到上面的shell脚本中的原因。

c. 我系统上的上述shell脚本的输出位于下面(经过大量截断“open”相关函数后,它已被压缩,约有21K行):

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/


3

您可能需要提高内核的日志级别。请读取当前设置的级别:

cat /proc/sys/kernel/printk

这个条目应该比kernel/printk.c中定义的DEFAULT_MESSAGE_LOGLEVEL要大
你可以通过以下方式将其更改为其他值,例如2:

echo 2 > /proc/sys/kernel/printk

如果您不想更改DEFAULT_MESSAGE_LOGLEVEL,则可以在调用printk时提供更高优先级的flag,例如:
printk(KERN_ERR "Hello world"); //or any higher priority flag 

想要了解更多信息,请点击阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接