printk打印不能显示到终端的解决方法

本文介绍了 Linux 中 printk 函数的特点及使用方法,详细解释了 printk 的日志级别概念,并展示了如何通过 /proc/sys/kernel/printk 文件调整日志级别的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

printk与printf有个不同的地方,就是printk有打印级别

使用printk时,Linux内核根据日志级别,可能把消息打印到当前控制台上,这个控制台是一个字符设备。这些消息从终端输出的前提是日志输出级别小于console_loglevel。(越小级别越高)

日志级别有八个:0-7

通过读写/proc/sys/kernel/printk文件可以读取、修改控制台的日志级别。

查看这个文件:

cat /proc/sys/kernel/printk 


上面显示的数字:6、7、1、6分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。

可以使用下面命令设置当前日志级别:

etho 8 > /proc/sys/kernel/printk



这样所有级别小于8的都可以打印在控制台终端上了。

重新运行程序,看到自己写的驱动代码打印出信息:


### 关于 `bpf_printk` 的输出问题 `bpf_printk` 是一种用于调试 BPF 程序的工具,但它存在一些局限性和特定条件才能正常显示输出。以下是关于 `bpf_printk` 输出可见的原因及其解决方案: #### 1. **内核配置** `bpf_printk` 使用的是内核的日志机制 (`printk`),这意味着它的输出会受到内核日志级别的控制。如果当前系统的内核日志级别设置得过高,则可能无法看到 `bpf_printk` 的输出。 可以通过调整 `/proc/sys/kernel/printk` 文件中的值来更改内核日志级别。该文件包含四个由空格分隔的数值,其中第一个表示当前的控制台日志级别。将其设置为较低的值(如 8 或更高)可以确保所有消息都可见[^2]。 ```bash echo 8 > /proc/sys/kernel/printk ``` #### 2. **查看日志的方式** 即使设置了合适的日志级别,也需要正确的方法来捕获 `bpf_printk` 的输出。通常情况下,可以通过读取 dmesg 日志来获取这些信息。然而,默认情况下,dmesg 可能会立即刷新缓冲区的内容。为了确保能够及时获得最新的日志条目,建议定期清理并更新 dmesg 缓冲区[^3]。 ```bash dmesg -c && cat /sys/kernel/debug/tracing/trace_pipe ``` 注意:某些发行版可能会禁用 tracing 子系统或者未加载必要的模块,在这种情形下需要手动启用它们。 #### 3. **性能开销与限制** 由于 `bpf_printk` 实际上调用了底层的 `printk` 接口,这使得它具有较高的执行成本,并适合频繁调用或大规模部署场景下的生产环境使用。此外,单次调用所能携带的数据量也十分有限,仅支持固定长度字符串格式化操作。对于复杂数据结构传输需求而言,推荐改用其他替代方案比如 BPF Maps 结合用户态应用实现交互功能[^1]。 ```python import ctypes as ct from bcc import BPF program = """ #include <linux/sched.h> int hello(struct pt_regs *ctx) { char msg[] = "Hello, World!"; bpf_trace_printk("%s\\n", msg); return 0; } """ b = BPF(text=program) fn = b.load_func("hello", BPF.KPROBE) b.attach_kprobe(event="__x64_sys_clone", fn_name="hello") while True: try: (task, pid, cpu, flags, ts, message) = b.trace_fields() print(f"{message.decode('utf-8')}") except KeyboardInterrupt: break ``` 以上脚本展示了如何利用 Python 和 libbcc 库编写简单的 eBPF 程序并通过 `bpf_trace_printk` 打印自定义消息到终端窗口中去。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值