文章目录
04. 调试技术
4.1 printk
-
打印优先级(
<linux/kernel.h>
):KERN_EMERG
>KERN_ALERT
>KERN_CRIT
>KERN_ERR
>KERN_WARNING
>KERN_NOTICE
>KERN_INFO
>KERN_DEBUG
-
console_loglevel
:其初始值为DEFAULT_CONSOLE_LOGLEVEL
,可通过klogd -c
指定,也可通过proc/sys/kernel/printk
修改控制台记录级别 -
调用时机:
printk
可以从任何地方调用,甚至中断中 -
频率限制:过量
printk
消息会压倒控制台,拖慢系统;常常重复的消息,使用printk_ratelimit
限制打印频率;可以通过修改/proc/sys/kern/printk_ratelimit
(在重新使能消息前等待的秒数)和/proc/sys/kernel/printk_ratelimit_burst
(限速前可接收的消息数)来定制 -
基本原理:
printk
将消息写入环形缓存中(__LOG_BUF_LEN
,长度值由配置内核时选择),若环形缓存填满,printk
将绕回并覆盖开头的数据,因此可能丢失部分数据 -
备注:
printk
只有提供一个结尾的新行才会刷新
4.2 /proc
文件系统
4.2.1 基本概念
- 概念:
/proc
文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制,是一个虚拟的文件系统,让用户可以和内核内部数据结构进行交互;/proc
存在于内存之中而不是硬盘上;proc
文件系统以文件的形式向用户空间提供了访问接口,这些接口可以用于在运行时获取相关部件的信息或者修改部件的行为 - 内容读取:
cd /proc && ls
可看到带数字的文件夹,每个数字对应一个进程的ID,每个数字文件夹基本有以下内容
cmdline - 启动进程时调用的命令
environ - 进程环境变量
status - 进程状态信息
exe - 运行的进程的可执行程序
fd - 指向进程使用的文件描述符的链接
除数字文件夹之外,还有其他重要的文件
/proc/cpuinfo - CPU 的信息(型号, 家族, 缓存大小等)
/proc/meminfo - 物理内存、交换空间等的信息
/proc/mounts - 已加载的文件系统的列表
/proc/devices - 可用设备的列表
/proc/filesystems - 被支持的文件系统
/proc/modules - 已加载的模块
/proc/version - 内核版本
/proc/cmdline - 系统启动时输入的内核命令行参数
4.2.2 相关源码
/proc
下每个文件都绑定到一个内核函数上;ps
、top
、uptime
等都是从/proc
下获取信息read_proc
(<linux/proc_fs.h>
)在文件被读时产生数据,当某个进程读文件时(使用 read 系统调用),这个请求通过该函数到达模块
int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data);
creat_proc_read_entry
(将read_proc
连接到/proc
的入口)
struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode,struct proc_dir_entry *base, read_proc_t