当前位置: 首页 > article >正文

019驱动调试与性能优化:printk、动态调试、ftrace、perf工具链

从一次诡异的I2C超时说起上周排查一个车载IVI系统的触摸屏失灵问题现象是冷启动后触摸完全无响应但系统日志里没有任何错误信息。用逻辑分析仪抓I2C波形发现主机发了START信号后SCL就被拉低了——典型的从设备忙状态。但驱动代码里对应的错误分支根本没打印日志因为开发阶段为了“性能”把很多调试信息都关掉了。这种场景咱们都遇到过线上问题发生了日志却干干净净。今天就来聊聊嵌入式Linux驱动调试的那些事儿怎么在需要的时候拿到足够的信息又不在平时拖慢系统。printk最原始也最可靠先别瞧不起printk关键时刻能救命的往往是它。但很多人用printk的方式有问题// 别这样写级别不对查日志能累死printk(i2c transfer error\n);// 也别这样生产环境刷屏会被运维追杀printk(KERN_DEBUGaddr 0x%x reg 0x%x value 0x%x\n,addr,reg,val);// 建议这样分级控制dev_err(client-dev,i2c transfer timeout, slave 0x%x\n,client-addr);dev_dbg(client-dev,write reg 0x%02x 0x%02x\n,reg,val);printk的级别从0紧急到7调试是个好东西。通过/proc/sys/kernel/printk可以动态调整控制台输出级别比如线上环境设成4只显示警告以上信息调试时改成7什么细节都看得见。这里踩过坑某些嵌入式系统串口速度慢大量printk会拖慢启动过程。这时候可以用pr_cont()合并多行输出减少串口中断关键路径上使用printk_once系列宏实在要性能就用printk_deferred但注意可能丢失时序信息动态调试不用重新编译的魔法改代码-编译-烧写-重启这个循环太折磨人了。动态调试Dynamic Debug就是为此而生// 代码里正常加调试语句dev_dbg(dev,probe called, irq%d\n,irq);// 运行时动态控制echofile i2c-*.c p/sys/kernel/debug/dynamic_debug/control echomodule mydriver func probe -p/sys/kernel/debug/dynamic_debug/controlp是打开打印-p是关闭还能用func限定函数名、line指定行号。更实用的是条件打印# 只在传输失败时打印echofile i2c-core.c p/sys/kernel/debug/dynamic_debug/controlechoformat timeout p/sys/kernel/debug/dynamic_debug/control动态调试依赖CONFIG_DYNAMIC_DEBUG配置现在主流内核都默认开启了。有个细节dev_dbg()只在开启DEBUG或设置了CONFIG_DYNAMIC_DEBUG时才有效所以驱动Makefile里最好加上ccflags-y -DDEBUGftrace内核的“示波器”printk是看结果ftrace是看过程。那次I2C超时问题最终就是用ftrace找到的元凶# 先确认可用跟踪点cat/sys/kernel/debug/tracing/available_events|grepi2c# 开启i2c相关跟踪echo1/sys/kernel/debug/tracing/events/i2c/enableecho1/sys/kernel/debug/tracing/events/irq/enable# 设置缓冲区大小防止丢数据echo50000/sys/kernel/debug/tracing/buffer_size_kb# 开始记录echo1/sys/kernel/debug/tracing/tracing_on# 触发问题后停止并查看echo0/sys/kernel/debug/tracing/tracing_oncat/sys/kernel/debug/tracing/trace/tmp/trace.log分析trace文件发现I2C中断处理函数执行时间长达20ms进一步追踪发现是某个驱动在中断里做了内存拷贝。这就是ftrace的价值——告诉你“发生了什么”而不仅仅是“结果是什么”。function_graph跟踪器更强大能显示函数调用关系和时间echofunction_graph/sys/kernel/debug/tracing/current_tracerecho100/sys/kernel/debug/tracing/max_graph_depth注意嵌入式设备内存有限trace缓冲区别开太大一般50MB足够。另外ARM平台可能要用trace-cmd工具因为有些嵌入式文件系统不支持debugfs。perf性能瓶颈的显微镜perf能告诉你“为什么慢”。车载系统上有个CAN总线数据处理延迟问题用perf定位的# 采样CPU使用情况perf record-g-p$(pidof can_app)-operf.data --sleep30# 嵌入式设备上采集PC上分析需要vmlinux符号scptarget:/perf.data.perf report-iperf.data--symfs/path/to/rootfs火焰图是更直观的方式perf script|./stackcollapse-perf.pl|./flamegraph.plflame.svg嵌入式环境用perf要注意内核配置需要CONFIG_PERF_EVENTS交叉编译perf工具时需要目标机的内核源码和编译配置某些SoC支持PMU性能监控单元能统计缓存命中率、分支预测失败等硬件事件组合拳实战内存泄漏排查物联网设备最怕内存泄漏跑几天就OOM。上周查的一个GPIO驱动泄漏# 先用ftrace监控kmalloc/kfreeecho1/sys/kernel/debug/tracing/events/kmem/kmalloc/enableecho1/sys/kernel/debug/tracing/events/kmem/kfree/enable# 同时用perf统计分配热点perf record-ekmem:kmalloc-g-okmem.data# 发现某个函数频繁分配加上动态调试echofile gpio-xxx.c p/sys/kernel/debug/dynamic_debug/control# 最终定位到中断下半部里漏了释放个人工具箱配置建议printk生产环境保持默认级别但关键错误路径必须用dev_err()这些信息要进系统日志syslog动态调试驱动里多写dev_dbg()成本几乎为零。线上通过脚本管理开关#!/bin/bash# debug_i2c.shechofile i2c-*.c p/sys/kernel/debug/dynamic_debug/control# 复现问题echofile i2c-*.c -p/sys/kernel/debug/dynamic_debug/controlftrace准备几个常用脚本放设备里。比如跟踪调度的#!/bin/bashecho0tracing_onechonopcurrent_tracerecho10000buffer_size_kbecho1events/sched/enableecho1tracing_onperf交叉编译好perf连同依赖的libelf一起放到目标板。采集数据尽量用--call-graph dwarfARM平台栈回溯更准确。最朴素的招数有时候/proc/interrupts、/proc/vmstat、/proc/slabinfo比高级工具更直接。那个I2C问题其实看/proc/interrupts发现中断次数异常增长就已经指向了方向。调试就像破案工具是放大镜、指纹粉但最重要的是思路。先想清楚“可能是什么”再用工具验证别一头扎进数据里。嵌入式系统资源紧张现场可能只能保留一种工具的输出这时候选哪个工具就看你对问题性质的预判了。记住最好的调试是预防性的代码结构——关键路径加注释、错误处理要完整、数据结构要可追溯。真出了问题这些“代码习惯”比任何工具都管用。

相关文章:

019驱动调试与性能优化:printk、动态调试、ftrace、perf工具链

从一次诡异的I2C超时说起 上周排查一个车载IVI系统的触摸屏失灵问题,现象是冷启动后触摸完全无响应,但系统日志里没有任何错误信息。用逻辑分析仪抓I2C波形发现,主机发了START信号后SCL就被拉低了——典型的从设备忙状态。但驱动代码里对应的…...

猫抓资源嗅探扩展完整配置指南:从零开始掌握网页资源捕获

猫抓资源嗅探扩展完整配置指南:从零开始掌握网页资源捕获 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法下载网页视频而烦恼…...

OpenClaw异常处理指南:千问3.5-35B-A3B-FP8任务失败的8种排查方法

OpenClaw异常处理指南:千问3.5-35B-A3B-FP8任务失败的8种排查方法 1. 当OpenClaw遇上千问3.5:我的踩坑起点 上周三凌晨2点,我正试图用OpenClaw自动整理一批会议录音转写的文本。这个任务需要先调用千问3.5-35B-A3B-FP8模型提取关键信息&…...

3dsconv:任天堂3DS游戏格式转换的全流程解决方案

3dsconv:任天堂3DS游戏格式转换的全流程解决方案 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 问题导入&…...

Boost电路与SMC滑模控制策略:文章复现及性能优化探讨

boost电路,smc滑模控制,文章复现Boost电路在电力电子里算是老熟人了,但真要玩转它的闭环控制可不容易。最近在复现一篇用滑模控制(SMC)搞Boost电路的论文,实测发现这货对付负载突变确实有两把刷子。今天咱们…...

VS Code官宣:全面支持Rust!

当"宇宙第一编辑器"遇上"内存安全的叛逆少年",这场联姻比想象中更甜~最近微软悄悄放了个大招:VSCode 要深度集成 rust-analyzer 了! 🎉 什么意思呢?以前你用 VSCode 写 Rust&#xff0…...

DENSO电装机器人软件授权序列号 wincaps3软件授权和软件安装包及软件手册

DENSO电装机器人软件授权序列号 wincaps3软件授权和软件安装包及软件手册 永久使用序列号 给机器人工程师的WinCaps3安装避坑指南 最近在调试DENSO机械臂的时候,发现不少同行在WinCaps3的安装和授权环节翻车。今天就结合自己的踩坑经验,聊聊怎么搞定这个…...

改进蚁群算法结合Dijkstra与MAKLINK图理论实现二维空间最优路径规划

【改进蚁群算法】/蚁群算法/Dijkstra算法/遗传算法/人工势场法实现二维/三维空间路径规划 本程序为改进蚁群算法Dijkstra算法MAKLINK图理论实现的二维空间路径规划 算法实现: 1)基于MAKLINK图理论生成地图,并对可行点进行划分; 2…...

AI赋能前端开发:让快马平台智能生成仪表盘页面架构与代码

最近在做一个数据可视化项目时,遇到了一个典型的前端开发需求:需要快速搭建一个专业级的仪表盘页面。这个页面需要包含数据概览卡片、图表展示区和用户留言列表三大核心模块。作为一个独立开发者,既要考虑UI美观度,又要兼顾代码质…...

深入理解 C# 架构思维:继承的界限、多态的解耦与属性的封装

C#学习笔记面向对象编程:继承什么是继承继承的语法方法的重写构造函数的重载与 base 关键字动物世界完整实例踩坑汇总面向对象编程:多态多态的实现步骤踩坑汇总面向对象编程:封装核心套路:私有字段 公开属性代码实例踩坑汇总面向…...

新手福音:用claude code和快马平台开启你的Python编程第一课

最近在帮朋友入门Python编程时,发现很多新手都会遇到类似的问题:看教程时觉得简单,但自己动手写代码就无从下手。经过几次尝试,我发现用InsCode(快马)平台结合claude code生成的教学项目,能很好地解决这个痛点。下面分…...

科技信息最前沿——TurboQuant:以极致压缩重新定义人工智能效率

谷歌TurboQuant技术突破:高效压缩AI内存需求谷歌TurboQuant技术通过创新的免训练压缩方法,有效解决了大语言模型面临的内存瓶颈问题。该技术采用两阶段压缩方案:PolarQuant极坐标量化和QJL误差修正,在不损失精度的前提下实现显著优…...

体验ai辅助开发:在快马平台与ai协作构建智能任务管理应用

最近尝试用AI辅助开发了一个任务管理应用,整个过程就像有个经验丰富的编程伙伴在旁边随时提供建议。在InsCode(快马)平台上,这种协作体验特别流畅,分享下具体实现过程: 初始框架搭建 输入"创建一个Vue3任务列表应用&#xff…...

(97页PPT)DG华为流程管理全景从定位到优化的高效增长策略(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/AI_data_cloud/89624196 资料解读:《(97页PPT)DG华为流程管理全景从定位到优化的高效增长策略》 详细资料请看本解读文章…...

GEE数据集:全球6400万地点数据免费开放(世界实体的点):商家、学校、医院、宗教组织、地标、山峰等

数据描述 Overture Maps Places 主题包含超过 6,400 万个现实世界实体的点表示形式:商家、学校、医院、宗教组织、地标、山峰等等。 每个地点记录都包含位置坐标、名称、类别、联系信息(网站、社交媒体、电子邮件地址、电话号码)、品牌信息、…...

典型的TCP客户端单次事务处理VI 通过已建立的TCP连接,发送一段数据(命令/字符串),等待设备响应后读取指定字节数的返回数据

这个VI程序框图详细解析(LabVIEW TCP通信事务VI)这是一个典型的TCP客户端单次事务处理VI(常命名为“TCP Send & Receive.vi”或“TCP通信子VI”)。 它的核心功能是:通过已建立的TCP连接,发送一段数据&a…...

响应 (接上文)

在我们前⾯的代码例⼦中&#xff0c;都已经设置了响应数据,Http响应结果可以是数据,也可以是静态⻚⾯,也可 以针对响应设置状态码,Header信息等.返回静态⻚⾯创建前端⻚⾯index.html(注意路径)html代码如下:<!DOCTYPE html> <html lang"en"> <head>…...

【27】软考软件设计师——数据流图(DFD)补全题满分精讲|下午15分大题深度拆解

摘要:本文是《软件设计师50讲通关|从零基础到工程师职称》专栏第27篇,深度精讲下午案例题第1道必考大题:数据流图(DFD)补全,该题单题分值高达12 ~ 15分,是整张试卷最稳的保底得分大题。我结合多年备考复盘与真题阅卷规则,超详细拆解DFD四大核心元素标准定义、机考绘图…...

突破暗黑破坏神2单机限制:PlugY全方位增强工具深度指南

突破暗黑破坏神2单机限制&#xff1a;PlugY全方位增强工具深度指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 暗黑破坏神2作为ARPG游戏的经典之作&#xff0c;其…...

消息队列5-RabbitMQ的高级特性和MQ的应用问题与解决方案-事务、消息分发的应用、幂等性保证、顺序性保证、消息积压的解决

文章目录一. 事务1. 模版开启事务功能2. 配置事务管理器3. 声明队列4. 生产者5. 运行图二. 消息分发1. 限流(1) yml配置文件(2) 声明队列与交换机及绑定关系(3) 生产者(4) 消费者(5) 运行图2. 负载均衡(1) yml配置(2) 消费者代码(3) 运行图三. MQ的幂等性保证1. MQ中存在的问题…...

3步解锁高效采集:让小红书素材获取效率提升80%的XHS-Downloader开源工具

3步解锁高效采集&#xff1a;让小红书素材获取效率提升80%的XHS-Downloader开源工具 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作…...

《YOLOv11 实战:从入门到深度优化》002、环境搭建:从零配置YOLOv11开发与训练环境

002、环境搭建&#xff1a;从零配置YOLOv11开发与训练环境 昨天深夜调试一个边缘设备上的推理异常&#xff0c;问题最终定位到CUDA版本和torch不匹配——这种环境配置埋下的坑&#xff0c;往往比算法本身更难排查。今天咱们就老老实实把YOLOv11的环境从头搭一遍&#xff0c;这份…...

三月七小助手:如何用智能自动化工具将星穹铁道日常效率提升300%

三月七小助手&#xff1a;如何用智能自动化工具将星穹铁道日常效率提升300% 【免费下载链接】March7thAssistant 崩坏&#xff1a;星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否每天花费大量时间在《崩坏&#xf…...

定义适应度函数,也就是我们要算的总能耗,越小越好

基于粒子群优化算法的地表水源热泵机组优化调度 以水源热泵机组角度对地表水源热泵系统建模&#xff0c; 并采用粒子群优化算法优化算法求解热泵机组每小时最佳制冷量和制热量最近帮朋友做了个小区地表水源热泵的调度优化项目&#xff0c;一开始以为就是调调空调温度&#xff0…...

XHS-Downloader:解决小红书内容采集痛点的开源工具创新方案

XHS-Downloader&#xff1a;解决小红书内容采集痛点的开源工具创新方案 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接…...

c语言实战:基于快马平台ai生成可部署的tcp聊天室服务器

今天想和大家分享一个用C语言实现的TCP聊天室服务器项目&#xff0c;这个项目完全在InsCode(快马)平台上完成&#xff0c;从代码生成到调试部署一气呵成。作为一个网络编程的经典案例&#xff0c;这个聊天室服务器涵盖了socket编程、多线程处理、IO复用等核心知识点&#xff0c…...

实战演练:基于快马平台与OpenClaw实现颜色分拣机器人应用

最近在做一个工厂自动化的小项目&#xff0c;正好用到了OpenClaw机械爪控制库&#xff0c;结合颜色识别实现了一个智能分拣系统。这个实战案例特别适合在InsCode(快马)平台上快速验证&#xff0c;下面分享下我的实现思路和关键要点。 项目整体架构设计 系统主要分为三个核心模块…...

4.4【A】

进程之间不能直接访问对方内存所以必须用 Socket 共享内存 通信每个进程独立运行每个进程自己负责自己的连接网卡模拟器进程&#xff1a;监听 PCIe 连接QEMU 进程&#xff1a;主动连接 PCIe它们通过 Socket 建立连接&#xff0c;交换自我介绍然后用共享内存高速通信底层状态初…...

Nginx性能优化-压缩

但很多开发者在配置nginx时容易混淆两个概念&#xff1a;Gzip动态压缩和Gzip静态压缩。本文将带你彻底搞懂这两者的区别、配置方法以及最佳实践。什么是Gzip动态压缩&#xff1f;原理&#xff1a; 当客户端&#xff08;浏览器&#xff09;发起请求时&#xff0c;Nginx接收到请求…...

G-Helper终极指南:开源硬件性能管理工具如何彻底改变华硕设备体验

G-Helper终极指南&#xff1a;开源硬件性能管理工具如何彻底改变华硕设备体验 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF…...