首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

printk消息未显示在dmesg日志中

printk是Linux内核中用于打印消息的函数。它可以将消息输出到内核日志缓冲区,然后通过dmesg命令查看。

然而,如果printk消息未显示在dmesg日志中,可能有以下几个原因:

  1. 日志级别设置不正确:printk函数有不同的日志级别,包括KERN_EMERG、KERN_ALERT、KERN_CRIT、KERN_ERR、KERN_WARNING、KERN_NOTICE、KERN_INFO和KERN_DEBUG。如果消息的日志级别高于当前内核的日志级别设置,那么消息将不会显示在dmesg日志中。可以通过修改内核的日志级别来解决此问题。
  2. 缓冲区溢出:内核日志缓冲区有限,如果打印的消息过多或过长,可能会导致缓冲区溢出,从而导致消息丢失。可以通过增大内核日志缓冲区的大小来解决此问题。
  3. 内核配置问题:某些Linux发行版可能会禁用或限制内核消息的打印。这可能是出于性能或安全考虑。可以通过检查内核配置文件或相关文档来确认是否存在此类限制,并根据需要进行调整。
  4. 内核模块加载顺序问题:如果printk消息位于一个动态加载的内核模块中,而该模块在dmesg命令执行之前加载,那么消息可能不会显示在dmesg日志中。可以尝试重新加载模块或在模块加载之前执行dmesg命令来解决此问题。

总结起来,要解决printk消息未显示在dmesg日志中的问题,可以检查日志级别设置、缓冲区溢出、内核配置和模块加载顺序等方面的问题。根据具体情况进行调整和排查。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

精致全景图 | linux内核输出的日志去哪里了

printk日志放到ring buffer后,会再调用系统console的相关方法,将还未输出到系统控制台的消息,继续输出到控制台,这个后面会详细说,这里就暂不赘述。...dmesg命令,默认情况下,是通过读取/dev/kmsg文件,来实现查看内核日志的。...当该命令运行时,dmesg会先调用open函数,打开/dev/kmsg文件,该打开操作在内核的逻辑,会为dmesg分配一个file实例,在这个file实例里,会有一个seq变量,该变量记录着下一条要读取的内核日志在...之后,dmesg会以打开的/dev/kmsg文件为媒介,不断的调用read函数,从内核读取日志消息,每读取出一条,seq的值都会加一,即指向下一条日志的位置,依次往复,直到所有的内核日志读取完毕,dmesg...但这种方式和前面讲的三种方式都不一样,它是完全被动的,是内核调用printk函数,将日志信息放到ring buffer后,再去通知系统控制台,告知其可以输出这些日志

2.8K30

使用动态输出打印内核的DEBUG信息

简介 printk()是很多嵌入式开发者喜欢用的调试手段之一,但是,使用printk()每次都要重新编译内核,很不方便。...control 你也可以应用标准的Unix文本过滤命令来过滤这些数据, 例如: grep -i rdma /sys/kernel/debug/dynamic_debug/control | wc -l 第三列显示了调试状态位的激活标志...p //产生一个printk()消息显示系统启动日志 t //包含了不在中断上下文中产生的消息里的线程ID 传递启动参数给内核 调试系统启动是时,像USB核心初始化等,这些代码系统进入shell...这时可以在内核启动时传递参数给内核,系统初始化时就打开它们。 例如,在内核命令行添加 usbnet.dyndbg=+plft ,就可以启动时打开 usbnet的动态输出。...也可以使用 tail -f /var/log/dmesg来实时监控dmesg日志输出。 本文参考 dynamic-debug-howto.txt 《奔跑吧Linux内核》 end

1.7K40

Linux Rootkit系列一:LKM的基础编写及隐藏

printk()函数将内容纪录在系统日志文件里,当然我们也可以用printk()将信息输出至控制台: printk(KERN_ALERT "output messages"); 其中KERN_ALERT...键入 insmod lkm.ko 回车,这时你会发现什么都没有发生,没有关系,这是因为我们并没有对于我们的消息指定KERN_ALERT优先级,此时printk消息传输到了系统日志syslog,我们可以...我们可以cat /var/log/messages或者利用dmesg命令查看printk输出的消息,如下图所示: ? 为了方便起见我只显示了最后一条信息,也就是我们LKM初始化函数所输出的信息。...2.从lsmod命令隐藏我们的模块 现在有个小问题,如果我们既不想让dmesg也不想让lsmod这两个命令察觉到我们的模块呢?...对于dmesg命令,我们只要删除掉printk()函数就好,这个函数所起的仅仅是示范作用。但是如何让lsmod命令无法显示我们的模块呢。

4.4K100

嘘,我已经瞒着开发解锁APP日志文件抓取及分析啦!

不同等级log信息显示的颜色不同,使用起来方便直观。ddms监控系统或应用日志、监控线程状态、VM使用状况(内存泄漏通过它来判断)、模拟短信电话事件、生成logcat日志、文件管理及截屏等功能。..., logcat区会显示该设备的相关日志信息,默认显示verbose; 3.选择日志信息等级为error ,若程序崩溃,抓取error等级下与所测应用相关的日志即可; 使用示例: ?...4.kmsg抓取 adb shell cat /proc/kmsg > kmsg.txt,打开后查msm_kgsl字段 说明:用于检索用printk生成的内核消息,任何时刻只能有一个具有超级用户权限的进程可以读取这个文件...5.dmsg抓取 adb shell dmesg > dmesg.txt 说明:dmesg用来显示开机信息,kernel会将开机信息存储ring buffer。...dmesg是kernel的log,凡是跟kernel相关的,比如driver出了问题(相机,蓝牙,usb,启动,等等)开机信息亦保存在/var/log目录,名称为dmesg的文件里,more /var

2.1K20

操作系统 | 编写内核模块

编译并输入ls查看是否编译成功如图5-3至图5-4. 3.输入命令insmod xxx.o加载这个模块如图5-5. 4.输入命令lsmod查看系统中所有的模块如图5-6至图5-7. 5.输入命令dmesg...看系统日志(最后一行)如图5-8至图5-9. 6.输入命令rmmod hello卸载模块并再次输入命令dmesg看系统日志如图5-10至图5-11. 1.4 实验过程 ​​图5-1 ​​图5-2...​​图5-4 ​​图5-5 ​​图5-6 ​​图5-7 ​​图5-8 图5-9 ​​图5-10 ​​图5-11 1.5 心得体会 通过此次实验,我成功编写了操作系统的内核模块,因在核心态下运行故采用printk...()函数,输入insmod加载此模块,结果显示loaded表示加载成功,使用dmesg分别成功查看在自己添加内核模块后的系统日志,这次实验相比实验3和实验4显得较为简单但需有耐心,比如自己操作规程应该输入...lsmod结果输入lsmode显示错误以及编译时gcc -c -I…这里的大写I写成了小写l,所以还要多多留意细节。

10310

dmesg总结

1.dmesg介绍 dmesg里我们可以查看到开机信息,printk产生的信息等。若研究内核代码,代码插入printk函数,然后通过dmesg观察是一个很好地方法。...2.dmesg输出含义 dmesg 输出的数字含义是什么,纠结了一会儿,下面给出解释 终端输入dmesg,可以看到每行最开始显示的是一个综括号,里面的数字为timestamp,时间戳,该时间指示的系统从开机到现在的运行时间...图1 3.dmesg -c 显示的同时,clean掉dmesg缓存中信息 4.dmesg -T 以当前时间的方式显示时间信息,而不是图1所示的开机时间 图2 3 dmesg -d 显示dmesg...两条打印信息的时间间隔 图3 我们可以计算,上一行的时间戳 + 下一行的间隔 = 下一行的时间戳 例如:第一行和第二行,1069.638561 + 0.000003 = 1069.638564 这里的时间单位为秒...4.dmesg -d -T -d和-T参数混合使用,效果可想而知 图4 5.dmesg | tail 显示dmesg最近一次的输出 由上面我们可以看到dmesg可以让我们获得很多信息,包括函数进入时间等

1.6K40

内核必须懂(四): 撰写内核驱动

首先是源码部分, 这里由于是内核, 所以c库的函数就不能用了, 比如printf这样的, 要用printk替代, 这里的k就是指kernel....当然, 可以用改进的Makefile再操作一次, 这次用lsmod查看一下安装的模块, 用dmesg查看信息是否打印出来. ? 安装与卸载 成功看到模块和打印的消息: ? lsmod ?...dmesg ---- 自定义设备驱动 接下来更进一步, 写一下驱动代码, 这里可以自定义驱动的open, ioctl等等函数....然后你可以查看/proc/devices, 也出现了设备名和设备号: ? lsmod ? 设备信息 所以需要链接它们, 之后就可以成功运行了. 然后dmesg看下打印的信息: ?...dmesg ---- 最后 目前来看, 内核驱动模块好像比用户态程序难不了多少, 但是当程序复杂下去, 调试就会越发困难了, 不比用户态.

1.2K20

Linux设备驱动程序(四)——调试技术

1、printk 相对于 printf,printk 的不同之处:差别之一就是,通过附加不同日志级别 (logevel),或者说消息优先级,可让printk 根据这些级别所表示的严重程度对消息进行分类。...这个文件包含了4个整数值,分别是:当前的日志级别、未明确指定日志级别时的默认消息级别、最小允许的日志级别以及引导时的默认日志级别。向该文件写人单个整数值,将会把当前日志级别修改为这个值。...例如,可以简单地输入下面的命令使所有的内核消息显示到控制台上: echo 8 > /proc/sys/kernel/printk 2、重定向控制台消息 对于控制台日志策略,Linux 允许有某些灵活性:...4、开启及关闭消息 下面给出了一个调用 printk 的编码方法,它可个别或全局地开关 printk 语句;这个技巧是定义一个宏,需要时,这个宏展开为一个 printk(或printf) 调用: 可以通过宏名字删减或增加一个字母来启用或禁用每一条打印语句...5、速度限制 有时会一不小心利用 printk 产生了上千条消息,从而让日志信息充满控制台,更可能使系统日志文件溢出。

58141

Linux驱动实践:如何编写【 GPIO 】设备的驱动程序?

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章,我们一块讨论了: Linux 系统,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这两方面触发。...这篇文章,我们就以此为基础,写一个有实际应用功能的驱动程序: 驱动程序,初始化 GPIO 设备,自动创建设备节点; 应用程序,打开 GPIO 设备,并发送控制指令设置 GPIO 口的状态; 示例程序目标...因此,驱动代码,与硬件相关部分的代码,使用宏 MYGPIO_HW_ENABLE 控制起来,并且在其中使用printk输出打印信息来体现硬件的操作。...应用程序,可以分别打开以上这 4 个 GPIO 设备,并且通过发送控制指令,来设置 GPIO 的状态。...再来看一下 dmesg的打印信息: 可以看到:驱动程序的 gpio_driver_exit( ) 被调用执行了。

4.9K30

Linux 命令(160)—— dmesg 命令

dmesg 命令用于检查和控制内核的环形缓冲区。Kernel 会将开机信息存储 ring buffer ,我们可以从中获得诸如系统架构、CPU、挂载的硬件,RAM 等多个运行级别的大量的系统信息。...加载的过程中会显示很多的信息,在这些信息我们可以看到内核检测硬件设备。因此我们可以利用 dmesg 进行设备故障的诊断。...-e, --reltime 以易读格式显示本地时间和时间差。 -E, --console-on 启用向终端打印消息。 -F, --file 用文件代替内核日志缓冲区。...-k, --kernel 显示内核消息。 -L, --color 显示彩色消息。 -l, --level 限制输出级别。...dmesg -c 我们可以使用如下命令来清空 dmesg日志。该命令会清空 dmesg 环形缓冲区日志。但是你依然可以查看存储 /var/log/dmesg 文件日志

2.8K30

你真的会调试 Linux 内核故障吗,看完这一篇后你会茅塞顿开的!

引导过程以及系统运行时,内核会将各种消息写入内核环形缓冲区。这些消息包括有关系统操作的各种信息。 内核环形缓冲区是物理内存的一部分,用于保存内核的日志消息。...它具有固定的大小,这意味着一旦缓冲区已满,较旧的日志记录将被覆盖。 dmesg 命令行实用程序用于 Linux 和其他类似 Unix 的操作系统打印和控制内核环形缓冲区。...对于检查内核启动消息和调试与硬件相关的问题很有用。 本教程,我们将介绍 dmesg 命令的基础。...例如,要仅显示内核和系统守护程序消息,可以使用: $ dmesg -f kern,daemon 每条日志消息都与一个显示消息重要性的日志级别相关联,dmesg 支持以下日志级别: emerg-系统无法使用...终端输入 man dmesg,你可以获取有关所有可用 dmesg 选项的信息。 本文翻译自:「Linuxize」,原文:https://url.cn/5PN5NmU,版权归原作者所有。

3.4K50

Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?

但是,我们参考的文章就没法做到:很详细的把文章中所描述内容的背景介绍清楚,往往都是文章作者自己的实际工作环境,测试某种方法解决了自己的问题,于是就记录成文。...旧的 API 函数 Linux内核代码2.4版本和早期的2.6版本,注册、卸载字符设备驱动程序的经典方式是: 注册设备: int register_chrdev(unsigned int major...加载驱动模块 加载驱动模块之前,先来看一下系统,几个与驱动设备相关的地方。 先看一下 /dev 目录下,目前还没有我们的设备节点( /dev/driver1 )。...来查看一下 /proc/devices 目录下显示的设备号: 可以看到 driver1 已经挂载好了,并且它的主设备号是244。...,继续用dmesg命令查看一下: 卸载驱动模块 卸载指令: $ sudo rmmod driver1 继续用dmesg指令来查看驱动程序的打印信息: 说明驱动程序的 driver1_exit(

1.8K20

Linux驱动实践:一步一步编写字符设备驱动程序

静态注册:由我们的驱动程序来指定主设备号,即参数1:from; 动态注册:由操作系统来分配,驱动程序提供一个变量来接收该设备号,即参数1: dev 指针; 另外,Linux 2.6后期的内核版本,引入了...void cdev_del(struct cdev *); 从系统删除一个 cdev,注销字符设备,需要在驱动被卸载的时候调用。 后面代码演示的时候,可以看到cdev结构是如何被使用的。...调用 alloc_chrdev_region( ) 时,操作系统分配了主设备号,并且保存在 dev_no 变量,然后 cdev_add() 再把设备号与cdev结构体进行关联。...加载驱动模块 加载驱动模块之前,先来检查一下系统,几个与驱动设备相关的地方。 先看一下 /dev 目录下,目前还没有我们的设备节点( /dev/driver2 )。...再来看一下 dmesg的打印信息: 可以看到:驱动程序的 driver2_exit( ) 被调用执行了! 小结 以上就是利用“新的” API 函数,来编写字符设备的驱动程序。

3.3K30

Linux D 状态的进程与平均负载

D 状态的进程是什么 如何编写内核模块模拟 D 状态进程 Linus 对 D 状态进程的看法 平均负载的概念 top 和 uptime 命令输出的第一行有一个 load average 字段,由三个数字表示...当使用 fork() 等系统调用来创建一个新进程时,新进程的状态是 Ready 状态, linux ,就绪态的进程也属于 TASK_RUNNING 状态,这个时候只是还没有拿到 CPU 的使用权。...图中 Ready 和 Running 状态的进程都属于「可运行状态」的进程,对应 top 命令 R 标记。 处于 Running 状态的进程等待某些事件或资源时会进入 Blocked 状态。...D 状态的进程 TASK_UNINTERRUPTIBLE top 命令显示为 D 标记,也就是大名鼎鼎的 「D 状态」进程。...printk 用于打印内核打印,使用 dmesg 可以查看输出的信息。 然后编写一个 Makefile 文件,如下所示。

2K40

Linux驱动开发入门 demo

obj-m := hello.o endif 修改部分信息和执行 当编译的内核为系统本身的内核,但是make以后生成的ko文件无法加载,即通过insmod xxx.ko无法加载,格式不对 查看dmesg...信息,参考解决:https://www.cnblogs.com/blfbuaa/p/6907027.html 正常执行后再dmesg中会有相应的加载和卸载模块的message信息。...未得到预期的效果,主要是顺次加载后,并在加载过程添加a,b等参数,无法从dmesg获得一个调用输出 将模块编译到内核 如在drivers下建立add_sub_Kconfig文件夹,然后放入对应的源码文件...add_sub_Kconfig/Kconfig" 然后修改上层的Makefile文件,添加如下内容: obj-$(ADD_SUB) += add_sub_Kconfig/ 就可以主目录下执行...make menuconfig后,驱动下找到对应的驱动和编译信息了

4.2K10

Linux驱动实践:中断处理的【工作队列】 workqueue 是什么鬼?

刚开始介绍中断处理的时候,曾经贴出下面这张图: 图中描述了中断处理的下半部分都有哪些机制,以及如何根据实际的业务场景、限制条件来进行选择。...也正因为此,它们之间的使用方式几乎是大同小异,至少是API接口函数的使用方式上,从使用这的角度来看,都是非常类似的。...工作队列是什么 工作队列是Linux操作系统,进行中断下半部分处理的重要方式! 从名称上可以猜到:一个工作队列就好像业务层常用的消息队列一样,里面存放着很多的工作项等待着被处理。...驱动程序 之前的几篇文章,驱动程序测试中断处理的操作流程都是一样的,因此这里就不在操作流程上进行赘述了。 这里直接给出驱动程序的全貌代码,然后查看 dmesg 的输出信息。...的输出信息: $ dmesg ... [ 188.247636] myirq_init is called

1.8K40
领券