我正在调试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)
任何解释?
printk和pr_info功能之间的确切区别是什么?在什么条件下,我应该选择一个而不是另一个?
大家都知道中断处理程序应该尽可能短.并且printk在中断处理程序中添加调试等功能是不应该做的.实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过,它破坏了驱动程序的时序.
我的问题是,为什么会发生这种情况?
printk功能被缓冲!这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后.
那为什么不起作用呢?
我正在为学校作业开发一个Linux角色设备驱动程序,我不知道如何打印*ppos传入我的读取函数类型loff_t.
我知道我必须使用printk而不是printf内核中的标准库,但我似乎无法找出正确的格式说明符.
有没有更好的方法来调试Linux内核中的打印输出?
现在乱丢代码:
printk(KERN_DBG "%s:%d - %s() <message>", __FILE__, __LINE__, __FUNCTION__ );
Run Code Online (Sandbox Code Playgroud)
哪个不是很干净.
整个行应该有一种方式#ifdef:以一种不错的方式编辑.
我正在修改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类型的功能?
我正在收集某种Linux内核活动.我printk在内核源代码中放置了多个语句,并希望在常规内核活动期间监视这些语句.不幸的是,我已经意识到内核日志缓冲区大小(CONFIG_LOG_BUF_SHIFT)不能超过2 ^ 21,这基本上等于2M条目.
有没有其他方法来记录超过2M的内核消息?
我正在内核中创建一个简单的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,它会自动更改行.如何在一行中打印消息?
是否有任何提示或方法可以避免内核日志丢失或日志缓冲区溢出?
我通过以下代码更改将日志缓冲区大小增加到最大值。我只在高端设备上运行。但是,当我想从驱动程序获取完整日志(写入大量日志)时,我仍然看到 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
我有个疑问.
我打开内核,然后更改了目录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
感谢你们.
linux-kernel ×10
printk ×10
c ×5
linux ×3
logging ×3
kernel ×2
debugging ×1
line ×1
system-calls ×1
ubuntu ×1