2017-10-17 212 views
0

我学习嵌入式系统如何从空间和内核空间打印调试

我需要从两个用户空间守护程序和内核空间的控制台上显示调试信息,我用printf进行用户空间和printk(KERN_CRIT)用于内核空间。

但是,输出混杂在一起乱七八糟。我猜KERN_CRIT速度非常快,有没有干净的方法来完成这项工作? 非常感谢

+0

* printk()*很慢。使用其他方法实现快速调试输出。甚至硬件辅助技术(英特尔PT,ARM ETM) – 0andriy

回答

0

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

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

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

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详细信息,路径为文档/跟踪/ ftrace.txt。

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

+0

这不提供对这个问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/17657746) –

+0

恩,也许答案太简单了,以显示我的想法,但ftrace可以记录你想登录用户空间和内核空间的信息。我正在寻找一些文件,并会提供一些详细信息。 – Forward