linux驱动调试方法整理
一般我喜欢把linux驱动的调试按矛盾分为几大类:1.驱动工程师和内核/自己的 2.应用工程师和驱动工程师的。其中我们需要掌握linux众多的调试控件才能灵活运用。
驱动工程师和内核/自己的
1.驱动加载和驱动调试信息
使用printk(per_log)打印需求
使用动态打印,即需要手动开启的打印模式,减少运行使用资源。(需要手动输入需要打印的内容 -p 至 /sys/kernel/debug/dynamic_debug/control文件)
2.CPU相关的问题
这类问题排查方法及其重要
首先使用top查看 用户cpu使用概率 平均使用负载 软中断使用率。
如果用户cpu使用概率升高,可以通过pidstat查看用户/系统cpu使用率排查特定线程
如果平均负载高的话可以使用vmstat查看不可中断以及运行进程,如果是不可中断,就要查看io的分析,如果是运行状态可以使用top和pidstat查看分别是哪些进程
如果是软件中断,需要使用/proc/softirqs文件找出各种类型,perf的event也可找出软中断函数,如果定位在网络可以使用专用工具。
做性能优化可以用到perf的stat命令
3.IO问题
和cpu一样排查方法很总要
首先使用iostat或者iotop(各个线程io吞吐量)查看IO设备的性能瓶颈,然后根据pidstat定位瓶颈出现的原因,找出拼劲线程,通过分析线程的瓶颈(分析应用程序和驱动之间的调用,以及一些列方法)排查出来
有时候也可以cat一下文件
4.软中断问题
使用dstat查看软中断中的一些吞吐量、中断之类的数据,如果数据有一场可以分别查看硬中断和软中断:cat /proc/interrupts(差中断和频率)查看中断亲和性cat /proc/irq/中断号/smp_affinity 查看软中断:cat /proc/softirqs
找到了发生源可以使用相关指令查看软件中断的频率和执行时间等等如下:
/sys/kernel/debug/tracing/events/irq/softirq_entry /sys/kernel/debug/tracing/events/irq/softirq_exit
5.线程问题
对于线程问题的排查一般都是通过监视的方法(strace ltrace ftrace ptrace)
其中ptrace和ftrace是系统调用,ltrace和strace建立在ptrace上的。
ptrace可以获取制定进程的制定调试指令下的寄存器值和地址空间
ltrace可以跟踪应用程序对共享库的调用
ftrace可以跟踪内核中的函数的调用过程,一般使用ftrace-cmd多一点
strace可以跟踪用户程序和内核函数的调用过程
6.内存问题
oops打印也可看出
内存问题可以分为应用层问题、内核、内存优化的问题
应用
使用例如:Valgrind(泄露之类的问题)
内核
调试方案
dump_stack(调试)
WARN_ON(驱动使用) --- 警告 ---- 定位谁调度
BUG_ON(驱动使用) --- 严重缺陷 ----- 定位缺陷 ---- 可以进行判断
panic(驱动使用)----- 没有判断条件
Page Cache问题
查看/proc/vmstat 和 /sys/kernel/debug/tracing/trace_pipe
内存优化
内存泄露(Androd Profiler 和 MAT)
bitmap(统一图片库 统一监控)
设备分级(设备分级 缓存 进程 安装包)
7.其他工具
blktrace vmstat sar .proc/meminfo df slabtop biosoop biotop uptime(cpu负载) Cgroup
调节cpu工作频率
/sys/devices/system/cpu/cpufreq/policy0下节点
(调度策略:Performance Powersave Userspace SchedInteractiveConservative)
cpuinfo_max_freq
cpuinfo_min_freq
scaling_available_governors :支持策略集合
scaling_governor:当前的策略(需要你后期来配置)
应用工程师和驱动工程师的
1.排查:用户调用了,但是驱动没调用的效果
使用strace ./指定应用程序
