- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 Linux
发行版是 RHEL7
,内核版本是 3.10.0
。
形成printk文档,我知道 minimum_console_loglevel 定义:
- minimum_console_loglevel: minimum (highest) value to which console_loglevel can be set
查询printk
的当前日志级别:
[root@localhost kernel]# cat /proc/sys/kernel/printk
7 4 1 7
修改当前控制台日志级别:
[root@localhost kernel]# echo 0 > /proc/sys/kernel/printk
[root@localhost kernel]# cat /proc/sys/kernel/printk
0 4 1 7
据我了解,minimum_console_loglevel 为1
,因此将console_loglevel 修改为0
应该会失败。但从 cat 输出来看,似乎是成功的。
来自 printk.c
代码:
case SYSLOG_ACTION_CONSOLE_LEVEL:
error = -EINVAL;
if (len < 1 || len > 8)
goto out;
if (len < minimum_console_loglevel)
len = minimum_console_loglevel;
console_loglevel = len;
/* Implicitly re-enable logging to console */
saved_console_loglevel = -1;
error = 0;
break;
我还认为不应修改 console_loglevel 值。
最佳答案
您正在查看错误的代码。 /proc/sys/kernel/printk
由kernel/sysctl.c
提供。 printk
的定义looks like this :
{
.procname = "printk",
.data = &console_loglevel,
.maxlen = 4*sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
这定义了一个名为 printk
的文件,它控制一个包含 4 个元素的 int 数组。至关重要的是,处理函数 proc_dointvec
是一个对整数数组进行操作的通用函数,它不会验证其参数。
因此,作为 root,您可以向 /proc/sys/kernel/printk
写入任何您想要的垃圾数字,内核将很乐意接受它们。演示:
root@ubuntu:/proc/sys/kernel# echo '-989897 42 -2147483648 0' > printk
root@ubuntu:/proc/sys/kernel# cat printk
-989897 42 -18446744071562067968 0
(第三个实际上是我刚刚发现的一个有趣且可能无害的错误...)
来自 printk.h
您可以看到四个日志级别参数直接来自这个四元素数组:
extern int console_printk[];
#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
那么,那么,您发布的代码有什么作用呢?它实现了 syslog
系统调用,如函数名称 (do_syslog
) 所示。如 the man page 所述:
SYSLOG_ACTION_CONSOLE_LEVEL (8)
The call sets console_loglevel to the value given in len,
which must be an integer between 1 and 8 (inclusive). The
kernel silently enforces a minimum value of
minimum_console_loglevel for len. See the log level section
for details. The bufp argument is ignored.
我们可以看到 syslog
系统调用也可以让您设置控制台日志级别,但它实际上会检查这些值是否有效。让我们用一个简单的测试程序进行测试(注意 glibc 调用函数 klogctl
而不是 syslog
,因为用户空间的 syslog
函数做了其他事情):
#include <sys/klog.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define SYSLOG_ACTION_CONSOLE_LEVEL 8
int main(int argc, char **argv) {
if(klogctl(SYSLOG_ACTION_CONSOLE_LEVEL, NULL, atoi(argv[1])) < 0) {
perror("klogctl");
} else {
printf("klogctl succeeded\n");
}
return 0;
}
运行它(在将 printk
重置回 7 4 1 7
之后):
root@ubuntu:/tmp# ./test 1 ; cat /proc/sys/kernel/printk
klogctl succeeded
1 4 1 7
root@ubuntu:/tmp# ./test 0 ; cat /proc/sys/kernel/printk
klogctl: Invalid argument
1 4 1 7
因此您可以看到 syslog
(通过 klogctl
调用)确实会检查您的参数的有效性。
关于c - 为什么 printk console_loglevel 可以低于 minimum_console_loglevel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31310629/
据我了解系统控制变量,kernel.printk 中的第一个值是内核消息必须小于的数字才能写入控制台。因此,如果它是 4,那么由此生成的消息将只能通过 dmesg 可见: printk(KERN_IN
我正在尝试从 mm/filemap.c 中打印 __generic_file_write_iter() 中的一些信息. 我修改了函数如下: struct file *file = iocb->ki_f
我有一个关于在 3.10 内核中实现 printk() 的问题。我看到了calls local_irq_save一开始。然后我看到了 calls raw_spin_lock(&logbuf_lock)
我正在为 Linux 内核编写一个系统调用,但到目前为止它并没有像我预期的那样工作(这并不奇怪)。我正在尝试使用 printk 消息在一个函数中对其进行调试,但它们不起作用。然而,单独功能中的功能确实
有没有办法记录/打印内核中的 float 值。它是否取决于运行内核的 FPU? 编译 printk(KERN_DEBUG "error = %f ",floatvalue) 时,出现错误: 对 __a
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我使用 printk 在内核级别输出中断时间戳,这意味着每个中断一个 printk(在 irg_handler_ 方法中)。在使用那个新内核时,我注意到我的设备运行速度变慢了。 所以我的问题是每个 p
我正在尝试实现我自己的新 schedule()。我想调试我的代码。 我可以在 sched.c 中使用 printk 函数吗? 我使用了 printk 但它不起作用。我错过了什么? 最佳答案 你知道 s
在 Linux 应用程序级别,所有 printf 消息都转到 stdout,所有 err 消息都转到 stderr。在哪里 stderr 通常是无缓冲的, 标准输出是行缓冲的 所以在 kernel s
假设我想使用 printk()在 arch/x86/boot/string.c 内在编译内核之前。我必须包含哪个头文件,以便链接器知道在哪里可以找到 printk() ?我试过 #include 和
只是一个关于内核级别 printk() 函数的快速问题,如果我调用它,消息将打印到哪里?(我在 i386 架构上使用 Ubuntu 并下载最新的内核) 到处都找不到, 如果有人也可以为我指出正确的方向
我在内核代码中放了一些调试信息。 已经检查了/var/log/messages、dmesg 并且那里没有这样的转储。 syslogd 正在机器上运行 我还将/proc/sys/kernel/print
当我 printk(KERN_INFO, ...) 时,我得到这样的结果: [116584.000183] ... 方括号之间的数字到底是多少? 最佳答案 启动后的秒数。您可以控制是否使用内核配置中的
我正在做一些内核修改,并试图让 printk 将信息输出回控制台。我用它传递了任何内核日志级别,即使是最高日志级别,也没有在控制台上正确地返回任何响应。 我检查过,printk 的当前日志配置是 4
我在我的内核可加载模块中使用 printk 来记录系统调用的参数。对于每个系统调用,使用几个 printk 来打印变量,它们以“\t”作为分隔符出现。要将内核日志缓冲区中的数据重定向到系统/var/l
从原子上下文调用 printk 是否安全,例如IRQ? 最佳答案 是的,明确允许在原子上下文中使用它;该函数实际上非常强大,因为它也可能在紧急情况下被调用。 printk 只会尝试锁定控制台来打印消息
systemd 的 journald 支持内核风格的日志记录。因此,该服务可以在 stderr 上写入以“”开头的消息,它们将像信息一样被解析,“”- 警告。 但是在开发服务时,它是在 systemd
我试图让我的模块显示一个printk。我是新手,所以我可能会遇到一些编程错误。这是我的模块 C 文件: #include #include #include asmlinkage long sy
我是 Linux 内核开发的新手,当我尝试通过在 timekeep.c 文件中添加一个 printk 函数来修改系统调用函数时,比如 printk("BEGIN!$$$$$\n"); dmesg 实
printk()打印的信息只有在Alt+Ctrl+F1 ~ F7 控制台。这些控制台非常不方便调试,因为它们无法回滚。我正在使用 KDE 桌面环境和控制台终端,如何将 printk() 消息重定向到控
我是一名优秀的程序员,十分优秀!