【问题标题】:how to print debug from both user-space and kernel-space如何从用户空间和内核空间打印调试
【发布时间】:2018-03-28 16:11:30
【问题描述】:

我正在学习嵌入式系统

我需要在控制台上打印来自用户空间守护进程和内核空间的调试信息,我将 printf 用于用户空间,将 printk(KERN_CRIT) 用于内核空间。

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

【问题讨论】:

  • printk() 很慢。使用其他方式进行快速调试输出。甚至是硬件辅助技术(Intel PT、ARM ETM)

标签: linux-kernel embedded


【解决方案1】:

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

【讨论】:

  • 嗯,也许答案太简单了,无法展示我的想法,但是 ftrace 可以记录您要登录到用户空间和内核空间的信息。我正在寻找一些文件,并将提供一些详细信息。
【解决方案2】:

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

首先,创建一个 debugfs 或 sysfs 接口,它只保存一个表示二进制信号量的值。在打印之前,用户程序和内核都将首先“降低” debugfs 或 sysfs 文件中的值。打印后它将“向上”。这可以通过包装函数或宏来实现。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2011-10-22
    • 2012-06-21
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多