如何从用户空间和内核空间打印调试

时间:2017-10-17 03:50:08

标签: linux-kernel embedded

我正在学习嵌入式系统

我需要在用户空间守护程序和内核空间的控制台上打印调试信息,我使用printf作为用户空间,使用printk(KERN_CRIT)作为内核空间。

然而,输出混合成乱并且乱序。我猜KERN_CRIT非常快,有没有干净的方法来做这个工作? 非常感谢

2 个答案:

答案 0 :(得分:2)

ftrace可以解决您的问题。

在linux内核中,您可以使用“trace_printk”而不是“printk”来记录信息,同时在用户空间中可以将日志写入文件“trace_marker”。

对于内核空间:

#include/linux/kernel.h
...
trace_printk("Hello, kernel trace printk  !\n"); 
...

对于用户空间

...
trace_fd = open("trace_marker", WR_ONLY);
void trace_write(const char *fmt, ...)
{
    va_list ap;
    char buf[256];
    int n;

    if (trace_fd < 0)
        return;
    va_start(ap, fmt);
    n = vsnprintf(buf, 256, fmt, ap);
    va_end(ap);
    write(trace_fd, buf, n);
}
...
trace_write("Hello, trace in user space \n");
...

您可以在linux内核源代码中找到有关ftrace的详细信息,路径为Documentation / trace / ftrace.txt。

关于ftraces有一些介绍,请关注trace_printk和trace marker。 Debugging the kernel using Ftrace - part 1 Debugging the kernel using Ftrace - part 2

答案 1 :(得分:0)

这似乎是用户和内核空间之间同步的问题。想到两种解决方案。

首先,创建一个debugfs或sysfs接口,它只包含一个表示二进制信号量的值。在打印之前,用户程序和内核每个都将首先&#34; down&#34; debugfs或sysfs文件中的值。打印后,它会&#34; up&#34;它。这可以通过包装函数或宏来实现。

其次,创建一个debugfs接口。内核将始终将其日志发送到该接口而不是printk它们。用户空间守护程序可以不断检查debugfs文件。想要打印的用户程序也会将其日志发送到用户空间守护程序。守护程序可以使用适当的同步机制,如互斥锁,以确保日志永远不会重叠。