我學習嵌入式系統如何從空間和內核空間打印調試
我需要從兩個用戶空間守護程序和內核空間的控制檯上顯示調試信息,我用printf進行用戶空間和printk(KERN_CRIT)用於內核空間。
但是,輸出混雜在一起亂七八糟。我猜KERN_CRIT速度非常快,有沒有乾淨的方法來完成這項工作? 非常感謝
我學習嵌入式系統如何從空間和內核空間打印調試
我需要從兩個用戶空間守護程序和內核空間的控制檯上顯示調試信息,我用printf進行用戶空間和printk(KERN_CRIT)用於內核空間。
但是,輸出混雜在一起亂七八糟。我猜KERN_CRIT速度非常快,有沒有乾淨的方法來完成這項工作? 非常感謝
這似乎是在用戶和內核空間之間進行同步的問題。想到兩個解決方案。
首先,創建一個debugfs或sysfs接口,它只保存一個表示二進制信號量的值。在打印之前,用戶程序和內核將首先「調低」debugfs或sysfs文件中的值。印刷後它會「起來」它。這可以通過包裝函數或宏來實現。
其次,創建一個debugfs接口。內核將始終將其日誌發送到該接口,而不是打印它們。用戶空間守護進程可以不斷檢查該debugfs文件。想要打印的用戶程序也會將其日誌發送到用戶空間守護進程。守護進程可以使用適當的同步機制(如互斥鎖)來確保日誌不會重疊。
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
這不提供對這個問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/17657746) –
恩,也許答案太簡單了,以顯示我的想法,但ftrace可以記錄你想登錄用戶空間和內核空間的信息。我正在尋找一些文件,並會提供一些詳細信息。 – Forward
* printk()*很慢。使用其他方法實現快速調試輸出。甚至硬件輔助技術(英特爾PT,ARM ETM) – 0andriy