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

nat*_*han 1 embedded linux-kernel

我正在学习嵌入式系统

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

然而,输出混杂成一团乱麻和乱序。我猜 KERN_CRIT 非常快,有什么干净的方法可以完成这项工作吗??非常感谢

For*_*ard 5

ftrace 可以解决您的问题。

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

对于内核空间:

#include/linux/kernel.h
...
trace_printk("Hello, kernel trace printk  !\n"); 
...
Run Code Online (Sandbox Code Playgroud)

对于用户空间

...
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");
...
Run Code Online (Sandbox Code Playgroud)

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

还有一些关于ftraces的介绍,请关注trace_printk和trace marker。 使用 Ftrace 调试内核 - 第 1 部分 使用 Ftrace 调试内核 - 第 2 部分