标签: printk

内核中的打印输出在哪里?

我正在调试linux的驱动程序(特别是ubuntu服务器9.04),代码中有几个printf语句.

我在哪里可以查看这些陈述的输出?

编辑1:我要做的是使用proc文件系统写入内核.打印代码是

static int proc_fractel_config_write(struct file *file, const char *argbuf, unsigned long count, void *data)
{
    printk(KERN_DEBUG "writing fractel config\n");
    ...
Run Code Online (Sandbox Code Playgroud)

在kern.log中,当我尝试覆盖文件/ proc/net/madwifi/ath1/fractel_config(当然具有不同的时间)时,我看到以下消息.

[ 8671.924873] proc write 
[ 8671.924919] 
Run Code Online (Sandbox Code Playgroud)

任何解释?

linux ubuntu linux-kernel printk

20
推荐指数
4
解决办法
4万
查看次数

printk和pr_info之间的区别

printkpr_info功能之间的确切区别是什么?在什么条件下,我应该选择一个而不是另一个?

c kernel-module linux-kernel printk

17
推荐指数
2
解决办法
8919
查看次数

printk在一个中断处理程序中,它真的那么糟糕吗?

大家都知道中断处理程序应该尽可能短.并且printk在中断处理程序中添加调试等功能是不应该做的.实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过,它破坏了驱动程序的时序.

我的问题是,为什么会发生这种情况? printk功能被缓冲!这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后.

那为什么不起作用呢?

c linux-kernel interrupt-handling printk

13
推荐指数
1
解决办法
1万
查看次数

printk loff_t类型的格式说明符?

我正在为学校作业开发一个Linux角色设备驱动程序,我不知道如何打印*ppos传入我的读取函数类型loff_t.

我知道我必须使用printk而不是printf内核中的标准库,但我似乎无法找出正确的格式说明符.

c linux linux-device-driver linux-kernel printk

11
推荐指数
1
解决办法
7937
查看次数

Linux内核调试打印输出?

有没有更好的方法来调试Linux内核中的打印输出?

现在乱丢代码:

printk(KERN_DBG "%s:%d - %s() <message>", __FILE__, __LINE__, __FUNCTION__ ); 
Run Code Online (Sandbox Code Playgroud)

哪个不是很干净.

整个行应该有一种方式#ifdef:以一种不错的方式编辑.

c debugging kernel linux-kernel printk

10
推荐指数
1
解决办法
6797
查看次数

dmesg和/var/log/kern.log之间的区别

我正在修改kvm模块,我在内核代码中添加了printk语句.在运行虚拟机之后,printk向我提供了有关客户操作系统的错误地址和其他信息.

我需要从这个信息生成统计信息.当我使用dmesg时,我只能看到内核空间中的错误地址,即它们的地址高于0XC0000000.(当VMEXIT发生时需要故障地址,即我们从guest虚拟机切换到主机模式)

当我在kern.log中看到相同的统计信息时,我也会从用户空间(低于0XC0000000)获得错误地址.所以在我看来dmesg的容量有限,而且给出的信息是kern.log的一个子集.
我的kern.log文件太大了可以从kern.log中删除旧数据,因为像grep,join,awk这样的文本处理命令在文件上运行的时间太长了.

我的问题是:
dmesg和kern.log 有什么区别?
如何将kern.log文件大小减少为cron作业?(擦除过去24小时内添加的所有数据)
有没有更好的方法从内核获取printf类型的功能?

logging linux-kernel printk

10
推荐指数
1
解决办法
1万
查看次数

放大Linux内核日志缓冲区超过2M

我正在收集某种Linux内核活动.我printk在内核源代码中放置了多个语句,并希望在常规内核活动期间监视这些语句.不幸的是,我已经意识到内核日志缓冲区大小(CONFIG_LOG_BUF_SHIFT)不能超过2 ^ 21,这基本上等于2M条目.

有没有其他方法来记录超过2M的内核消息?

logging kernel linux-device-driver linux-kernel printk

10
推荐指数
1
解决办法
6888
查看次数

如何在Linux内核中单行打印消息

我正在内核中创建一个简单的enque/deque程序.我想在内核中打印消息,这就是我得到的:

[18594.595747] Enqueue 3 
[18594.595748]  queue :  
[18594.595751] 2 
[18594.595751] 1 
[18594.595752] 3 
Run Code Online (Sandbox Code Playgroud)

但我想打印这个没有换行符:

[8594.595747] Enqueue 3 
[18594.595748]  queue : 2 1 3
Run Code Online (Sandbox Code Playgroud)

这是我的代码的一部分:

   printk(KERN_ALERT "Enqueue %d \n queue :  ", a);
   rear++;
   for(i = front; i<rear; i++)
      printk(KERN_ALERT "%d ", queue_test[i]);  
Run Code Online (Sandbox Code Playgroud)

简而言之,我想在内核中打印一行消息.但如果我使用printk,它会自动更改行.如何在一行中打印消息?

line linux-kernel printk

9
推荐指数
1
解决办法
3554
查看次数

如何避免 Linux 内核中 printk 日志丢失

是否有任何提示或方法可以避免内核日志丢失或日志缓冲区溢出?

我通过以下代码更改将日志缓冲区大小增加到最大值。我只在高端设备上运行。但是,当我想从驱动程序获取完整日志(写入大量日志)时,我仍然看到 printk 日志有时会被删除。我将 printk 与 KERN_INFO 一起使用,通过动态调试(dprintk)启用。

我做的改变:

--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -55,7 +55,7 @@ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...)
 {
 }

-#define __LOG_BUF_LEN  (1 << CONFIG_LOG_BUF_SHIFT)
+#define __LOG_BUF_LEN  (1 << 17)
Run Code Online (Sandbox Code Playgroud)

我用来写入文件的命令:

cat "/proc/kmsg">/sdcard/klog.txt
Run Code Online (Sandbox Code Playgroud)

仅在调试时,如果驱动程序的性能下降,我没关系,但是,我不想删除任何日志。我知道我们无法让工作队列/线程等待打印完成。但是,仍然有任何方法可以保证日志不会丢失。

logging linux-device-driver linux-kernel embedded-linux printk

7
推荐指数
2
解决办法
1万
查看次数

Linux内核:来自"open"系统调用的printk不起作用

我有个疑问.

我打开内核,然后更改了目录linux-3.1.1/fs/open.c

我在open.c中更改了以下代码.

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
{
    long ret;
    printk(KERN_EMERG "Testing\n");
    ... 
}
Run Code Online (Sandbox Code Playgroud)

我只把这一行: printk(KERN_EMERG "Testing");

我包括库:<linux/kernel.h><linux/printk.h>

所以我编译并重新启动了我的linux(Ubuntu).在重新启动期间,屏幕上出现了很多"测试".所以到现在为止它好了.


但现在我有一个问题.我在c中创建了这个程序.

int main()
{
    size_t filedesc = open("testefile2.txt",O_CREAT | O_WRONLY,0640);
    printf("%d",filedesc);
}
Run Code Online (Sandbox Code Playgroud)

我编译了这个程序并执行并且运行良好.但我不明白为什么"测试"没有出现在shell上.我的意思是,如果我重新启动电脑时会出现很多"测试"这个词,为什么当我执行上面的程序时,这个词并没有出现.只是添加我在上面的代码中包含这些库:

unistd.h,fcntl.h,stdio.h,stdlib.h

感谢你们.

c linux system-calls linux-kernel printk

6
推荐指数
2
解决办法
2039
查看次数