【driver3】调试:调用堆栈函数,printk,动态打印,top,dstat,perf,ftrace,proc,debugfs,性能优化,内存泄漏,主频,驱动稳定性

本文详细介绍了Linux内核中的关键调试工具,如printk用于控制日志输出,动态打印的灵活使用,以及top、dstat、perf和ftrace等性能监控方法。同时涵盖了内存管理、CPU瓶颈分析、主频设置和驱动稳定性等内容,为开发者提供了全面的内核优化指南。
摘要由CSDN通过智能技术生成


2.linux错误码:64位系统内核空间最后一页地址为0xfffffffffffff000~0xffffffffffffffff,这段地址是被保留的,如果指针落在这段地址内,说明是错误的无效指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.虚拟内存:物理内存和进程之间的中间层,ioremap将寄存器地址映射,或devmem

在这里插入图片描述

1.内核函数调用堆栈:4个函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.printk:cat /proc/cmdline查看console=ttyS0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.动态打印:printk是全局的且只能设打印等级,动态打印可控制选择模块的打印,在内核配置打开CONFIG_DYNAMIC_DEBUG

printk会关中断影响性能,如果在usb的read/write里printk,那么usb就没法直接用了。我想加很多调试信息,但是不想影响linux性能,所以用动态打印,调试时才打开,control节点默认不输出,如下操作才输出,+p是转为printk,相当于下面的define dev_dbg …。
在这里插入图片描述
在这里插入图片描述

4.top:idle和wait是cpu不工作时间

如下是top命令:idle是cpu无事可做,而wait是cpu想做事却做不了,所以wait是特殊的idle,是cpu上至少一个线程阻塞在i/o时的idle。
用户层us:这个比例越高,说明cpu利用率越好,因为我们目的就是为了让cpu将更多的时间用在执行用户代码上。
内核sy:比例越低越好,因为cpu不应该把时间浪费在执行内核函数上。
ni:运行一个进程后,默认nice值为0,通过renice增加该进程nice值(设为正数),该进程的CPU利用率会在ni中显示,减少进程nice值(设为负数)则不会在这里显示。
空闲id:整体cpu利用率=100减去id,为了提高资源利用率,目标是降低id。
wa:cpu阻塞在i/o上时间,如cpu从磁盘读取文件内容时,由于磁盘i/o太慢,导致cpu不得不等待数据就绪,才能继续执行下一步操作,这个值越高,说明i/o处理能力出问题。
硬中断hi:cpu消耗在硬中断里时间,正常情况这个值很低,因为中断处理很快,即使有大量硬件中断也不会消耗很多cpu时间。
软中断si:cpu消耗在软中断里时间,如进行网络数据大量收发,si会升高,因为有tx软中断和rx软中断处理才能发数据。
在这里插入图片描述

5.dstat:监视系统资源使用,/proc/interruptes(硬中断),/proc/irq/[irq_num]/smp_affinity是一个十六进制数值(每个位对应一个 CPU 核心)

在这里插入图片描述
如下软中断(如syscall函数,产生软中断的进程一定是当前正在运行的进程,不会中断CPU,但会中断调用代码的流程)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.perf:函数调用占比

在这里插入图片描述
在这里插入图片描述
如下记录过去60秒。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.ftrace:系统层面,功能需要打开,image大小会变大

如下查看debugfs和tracefs挂载点。
在这里插入图片描述
如下文件包含可追踪的所有场景。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下案例:mpstat,perf(看函数执行次数),ftrace看函数执行时间。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下sys_sync是系统调用。
在这里插入图片描述
如下可以打印出时间。
在这里插入图片描述
在这里插入图片描述

8.proc文件系统:/proc/cpuinfo,meminfo,net

在这里插入图片描述
在这里插入图片描述

9.debugfs:debugfs.h中api建立目录/sys/kernel/debug

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内核开发会遇到内核崩溃,如空指针异常,内存访问越界,如下会打印出异常调用栈信息定位。
在这里插入图片描述
在这里插入图片描述

10.性能优化:裸磁盘无法使用,一般都刷文件系统。驱动加上要考虑磁盘io,内存占用,cpu使用情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.Valgrind内存泄漏排查案例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下malloc加个死循环就是内存泄漏。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
dmesg会显示不全,因为环形buffer会覆盖。在这里插入图片描述

12.cpu瓶颈:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-p pid
在这里插入图片描述

13.主频设置

在这里插入图片描述
在这里插入图片描述

14.驱动稳定性

希望arg有多大
在这里插入图片描述
likely一般用在if判断里,cpu会把当前指令后面指令预取出来,等到执行时就去执行,效率提高,但是也要判断后面那条指令大概率执不执行,执行的话取出来,不执行则跳过。
在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农编程录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值