我正在尝试实现一个新的内核调度程序作为我的学术项目。我知道这可能会减慢系统的速度,但出于调试目的,我在上下文切换和调度函数中编写了一个printk语句,以便我可以在dmesg输出中看到事件。但是我在dmesg文件中没有得到任何输出。我尝试在各个位置插入printk语句,但仍然没有输出。我做错了什么吗?是否有更好的工具或技术可用于调试这种任务?
我正在尝试实现一个新的内核调度程序作为我的学术项目。我知道这可能会减慢系统的速度,但出于调试目的,我在上下文切换和调度函数中编写了一个printk语句,以便我可以在dmesg输出中看到事件。但是我在dmesg文件中没有得到任何输出。我尝试在各个位置插入printk语句,但仍然没有输出。我做错了什么吗?是否有更好的工具或技术可用于调试这种任务?
学习 Linux 内核的 ftrace 怎么样?使用它的方式略微依赖于内核版本。请参阅文件 /sys/kernel/debug/tracing/README 以获取详细信息。
如果上述目录不存在,则可能需要挂载它:
mount -t debugfs nodev /sys/kernel/debug
#!/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/
您可能需要提高内核的日志级别
。请读取当前设置的级别:
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
想要了解更多信息,请点击阅读。