linux驱动--调试方法总结

【基础技能】Linux PHY驱动调试方法 https://gitee.com/lee790608/linuxPhyDriver STEP1 准备硬件环境 1. 开发环境,可以修改内核代码,编译 2. 硬件开发板,可以进入系统调试,可以传送代码(常用的ADB打通即可) 3. PHY芯片,最好是贴在开发板上,如果飞线,对走线信号要求非常高(尤其是SGMII) 4. 示波器,方便抓取MDIO / SGMII总线信号 STEP2 获取VDD和V... 阅读详情


关键词: linux驱动,调试,内核


 

内核编译

设备驱动程序的调试需要内核的支持,因此通常应该根据需要对内核进行重编译。

wuchao@wuchao-VirtualBox:/usr/src/linux-headers-3.2.0-23-generic-pae$sudo make menuconfig

make menuconfig 需要安装sudoapt-get insatll ncurses-dev,否则出现错误:

 

***Unable to find the ncurses libraries or the

***required header files.

*** ‘makemenuconfig’ requires the ncurses libraries.


 

 menuconfig图

调试工具

Binutils

objdump反汇编,addr2line转换地址到函数名, nm查看符号,gprof分析各个函数使用情况。

make vmlinux 表示对生成的内核镜像不压缩, 生成的内核镜像大约150M。

objdump -Dvmlinux > vmlinux.dis 内核镜像反汇编,生成的vmlinux.dis大约500M。

用内核错误处的ip指针,在vmlinux.dis中搜索,查找执行指令。

printk

printk()会将内核信息输出到内核信息缓冲区中。内核信息缓冲区是一个环形缓冲区(ring buffer),因此,如果塞入的消息过多,就会将之前的消息冲刷掉。通过/proc/sys/kernel/printk文件可以调节printk 的输出等级。

 

# echo 8 > /proc/sys/kernel/printk


上面命令可以使得Linux内核的任何printk都被输出。

Gdb/KDB/KGDB

kgdb提供了一种使用 gdb调试 Linux 内核的机制。使用KGDB可以象调试普通的应用程序那样,在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。使用KGDB调试时需要两台机器,一台作为开发机(Development Machine),另一台作为目标机(Target Machine)。

安装kgdb调试环境需要为Linux内核应用kgdb补丁,补丁实现的gdb远程调试所需要的功能包括命令处理、陷阱处理及串口通讯3个主要的部分。kgdb补丁的主要作用是在Linux内核中添加了一个调试Stub。调试Stub是Linux内核中的一小段代码,提供了运行gdb的开发机和所调试内核之间的一个媒介。gdb和调试stub之间通过gdb串行协议进行通讯。gdb串行协议是一种基于消息的ASCII码协议,包含了各种调试命令。当设置断点时,kgdb负责在设置断点的指令前增加一条trap指令,当执行到断点时控制权就转移到调试stub中去。此时,调试stub的任务就是使用远程串行通信协议将当前环境传送给gdb,然后从gdb处接受命令。gdb命令告诉stub下一步该做什么,当stub收到继续执行的命令时,将恢复程序的运行环境,把对CPU的控制权重新交还给内核。

OOPS/PANIC

oops是内核级(特权级)的Segmentation Fault。

 

 

其他调试方法

进程跟踪工具strace

系统性能测试gprof

代码覆盖率测试gcov

core dump

内存泄漏检测工具 valgrind,  memwatch

 

 

 

2.6.18编译错误

linux内核2.6.18版本打kdb补丁后编译错误, 不建议使用kdb。 Kdb已经很久没更新,对i686及其他平台也没有支持了。


scripts/mod/sumversion.c: In function ‘get_src_version’:  

scripts/mod/sumversion.c:384:16: error: ‘PATH_MAX’ undeclared (first use in this function)  

scripts/mod/sumversion.c:384:16: note: each undeclared identifier is reported only once for each function it appears in  

scripts/mod/sumversion.c:384:7: warning: unused variable ‘filelist’ [-Wunused-variable]  

make[2]: *** [scripts/mod/sumversion.o] Error 1 

解决方法:# viscripts/mod/sumversion.c头文件包含中查看是否有limits.h,若没有,包含进去即可,,#inlcude <limits.h>

 

gcc: 错误: elf_i386:没有那个文件或目录

解决方法:arch/i386/kernel/Makefile文件,把"-m elf_i386" 替换为 "-m32"

 

drivers/video/sstfb.c:150:6:error: #elif with no expression

解决方法:将#elif 改为#else

 

kernel/built-in.o:In function `.text.lock.mutex':

mutex.c:(.sched.text+0x17a7):undefined reference to `__mutex_lock_slowpath'

mutex.c:(.sched.text+0x17b1):undefined reference to `__mutex_unlock_slowpath'

make: ***[.tmp_vmlinux1] Error 1

解决方法:将.config文件中的CONFIG_DEBUG_MUTEXES宏值必为y即可。

                   CONFIG_DEBUG_MUTEXES=y

 





Linux驱动开发(外传)---驱动开发调试方法 简单学习一下内核开发的调试方法 阅读详情

相关推荐

Linux 驱动与调试大全 - 总目录

欢迎大家来到 Linux 驱动与调试大全,手把手带你 debug

qq_38769551的博客 1408

Linux驱动调试方法

嵌入式系统,Linux,调试

propor的专栏 3081

企业级AI项目落地实战指南

企业级 AI 项目落地需构建“分阶段实施 + 多维度风控”的双轮驱动体系:实施端通过 POC 验证技术可行性、试点建立评估标准、规模化实现价值复制,各阶段需结合行业案例(如东阳光药、旺盈集团)提炼可复用经验;风险端则需覆盖技术(数据安全、模型稳定性)、合规(全球监管动态)、组织(人才与文化)维度,通过工具化框架(AI TRISM)与案例策略(邮储银行可解释性设计、拓斯达培训体系)实现风险可控。最终通过“场景聚焦 - 合规嵌入 - 持续优化”的循环机制,实现 AI 技术从“试点成功”到“全面价值创造”的跨越。

2509_93209761的博客 1438

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

由于内核是一个不与特定进程相关的功能集合,所以内核代码无法轻易地放在调试器中执行,而且也很难跟踪跟踪,本章节将介绍监视内核代码并跟踪错误的技术。

明天你好的博客 3101

Dify+MCP 双剑合璧:告别知识库模糊统计,让AI精准查询数据库数据!

本文详细介绍了如何通过Dify和MCP的结合,解决知识库在数据库查询中的模糊统计问题。通过MCP中间件将自然语言实时转换为SQL语句,实现精准数据查询,并支持SSE协议持续更新数据。文章包含MySQL环境搭建、MCP服务端部署、Dify工作流配置等实战步骤,帮助用户高效构建智能数据库查询系统。

weixin_33737774的博客 370

Quanto option期权公式推导(更新中)

Quanto期权不同于以标的股票或资产的计价货币支付最终收益的普通欧式期权,它以另一种货币以预先确定的汇率支付最后的收益。以股票B的计价货币来计价的quanto看涨期权的收益为F0×max⁡(Sa(T)−K,0)×Sb(T)F_0 \times \max(S_a(T)-K, 0) \times S_b(T)F0​×max(Sa​(T)−K,0)×Sb​(T) 其中SaS_aSa​以货币A计价,SbS_bSb​以货币B计价,F0F_0F0​是预先固定的汇率. 假设上述股票均遵循几何布朗运动,可以得到以下恒等式

qq_41782124的博客 3684

Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置

接博文《Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)》。上篇博文中,仅简单介绍使用串口的Kgbd的流程(kgdboc方式),本文将重点介绍KGDB调试Linux内核的原理。内核版本在2.6.26以前的Linux,kgdb是通过补丁安装的,过程非常复杂,而且问题比较多.Linux内核从 2.6.26开始已经在内部集成kgdb,只需要配置kgdb并重新编译2.6.26(或更高)

GQB的专栏 1万+

告别编译失败:详解Keil MDK中ARM编译器V5与V6的区别及项目迁移选择

本文深入解析Keil MDK中ARM编译器V5与V6的核心差异,提供STM32项目迁移的完整指南。从代码生成策略、优化重点到语法支持,详细对比两版本特性,并给出项目兼容性评估框架和双版本共存配置方案,帮助开发者高效解决编译器版本冲突问题。

weixin_28684757的博客 516

Linux内核学习5--Linux驱动的调试(TODO)

printk` 是最简单和最常用的方法,但对于复杂的驱动程序,使用 `gdb`、`ftrace`、`kprobes`、`kgdb` 等工具可以提供更深入的调试能力。- 使用 `kgdb`(Kernel GNU Debugger)或 `kgdboc`(Kernel GNU Debugger over Console)来调试内核模块。`kgdb` 是用于调试运行中的 Linux 内核的调试工具。通过 `/sys` 和 `/proc` 文件系统,可以访问和检查内核状态、驱动程序状态、设备配置等信息。

fanged的专栏 1124

PyTorch、Torchvision、Torchaudio历史版本whl文件下载地址、版本对应关系与离线安装全攻略

本文详细解析了PyTorch、Torchvision和Torchaudio历史版本whl文件的下载地址、版本对应关系及离线安装全攻略。针对无网络环境下的安装挑战,提供了官方whl文件获取路径、版本匹配技巧和完整安装流程,帮助开发者高效解决兼容性问题,确保深度学习环境的稳定部署。

weixin_31960565的博客 378

使用 MATLAB/Simulink 构建一个基于FOC控制的PMSM矢量控制仿真模型

本教程详细介绍了基于MATLAB/Simulink的永磁同步电机(PMSM)磁场定向控制(FOC)系统建模与仿真方法。主要内容包括:PMSM电机模型参数设置、Clarke/Park变换模块设计、电流环PID控制器配置、SVPWM调制实现以及系统仿真参数优化。文章提供了模块化设计思路和具体参数设置示例,并给出了PID整定建议和进阶优化方向。通过该仿真模型,可深入理解PMSM矢量控制原理,掌握高性能电机控制系统的建模技巧,适用于伺服系统、电动汽车驱动等高端控制场景。教程还推荐了实时仿真和高级控制策略等扩展应用。

xiaoheshang_123的博客 530

Linux驱动开发常用调试方法汇总

在 Linux 驱动开发中,调试是一个至关重要的环节。开发者需要了解多种调试方法,以便能够快速定位和解决问题。

你要拥有一个你喜欢并且热爱的人生 1万+

BDD测试用例:Playwright的MCP Server实战

Playwright MCP Server建立了大模型和真实的浏览环境之间的桥梁,可以让大模型操作多款浏览器完成测试任务。

Criss@陈磊 453

linux驱动调试方法

linux驱动调试方法 声明: 文章的内容来自于韦东山老师的第二期驱动视频中的驱动调试一章。 第一次写博客,写的目的是为了将自己的所学的东西记录下来,防止像以前一样学了就忘了。内容写的乱七八糟,主要是为了以后看的时候有个印象 ,内容可能会有很多错误,欢迎指正。下面就是具体内容: 驱动程序的调试的方法: 打印: printk,自制proc文件 1.1 打印 启动开发板,进入u-boot prin...

qq_38493139的博客 5235

机器人的“大脑”进化论:从专用控制器到高性能SoC的异构计算时代

摘要:随着AI与机器人技术融合,高性能芯片成为机器人智能化的关键。本文分析了机器人对芯片的核心需求,包括多模态数据处理、实时控制和智能决策能力。系统级芯片(SoC)因集成CPU、GPU/NPU等模块而成为主流选择。市场呈现分层格局:中低端设备(如扫地机器人)采用"MCU+轻量SoC"方案,满足基础功能;高端机器人则依赖"高性能SoC+独立GPU"处理复杂任务。除主控芯片外,完整的机器人系统还需传感器接口、驱动、通信等配套芯片。未来,芯片技术的进步将持续推动机器人智能化

致力于lidar应用开发 83

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux驱动调试方法整理

一般我喜欢把linux驱动的调试按矛盾分为几大类:1.驱动工程师和内核/自己的 2.应用工程师和驱动工程师的。其中我们需要掌握linux众多的调试控件才能灵活运用。

m0_73991989的博客 379

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux 驱动调试添加调试宏方法

linux 驱动调试添加调试宏 1.修改Makefile 添加是否开启debug宏 #Comment / uncomment the following line to disable / enable debugging DEBUG = y #Add your debugging flag (or not) to CFLAGS ifeq ($(DEBUG),y)  DEBFLAGS

业余飘向linux深谷 1296

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

arm-linux驱动调试方法

工欲善其事必先利其器,写驱动掌握调试办法将事半功倍。本文参考韦东山和宋宝华驱动调试的办法做总结。 1. 利用内核打印函数printk() 在linux中, printk()会将内核信息输出到内核信息缓冲区中。内核信息缓冲区是一个环形缓冲区(ring buffer),因此,如果塞入的消息过多,就会将之 前的消息冲刷掉。环形缓冲区的数据,兵分两路,一路输出到控制台,一通过/proc/kmsg文件读取缓冲区。用户可以通过cat /proc/kmsg或者mesg显示内核信息。 ...

yuanzhexu的博客 1072

《Linux设备驱动开发详解(第3版)》 第11章 Linux设备驱动中的调试方法

以下是一个简单的示意,展示如何在驱动中配合kgdb进行调试(实际使用需要更多的内核配置和环境搭建)。在实际的驱动开发中,通过这些调试方法的组合使用,可以更高效地定位和解决问题,提高驱动的稳定性和性能。需要注意的是,不同的调试方法在不同的场景下有各自的优势,开发者应根据具体问题选择合适的调试手段。在驱动开发中,内存问题(如内存泄漏、越界访问等)是常见的错误。内核打印是一种简单而常用的调试方法,通过在内核代码中插入打印语句,可以输出变量值、函数调用信息等,帮助开发者了解代码的执行流程和状态。

qq_40844444的博客 285

linux kernel内核、驱动日志调试方法(一)

对于正在运行的内核,所谓的core文件就是这个内核在内存中的核心映像,即/proc/kcore。proc文件系统是一种无存储的文件系统,当读其中的文件时,其内容由文件关联的读函数动态生成,当写文件时,文件所关联的写函数被调用。printk是打印内核消息的函数,printk通过附加不同日志级别(loglevel)或者说消息优先级,让printk对消息进行分类,这是与printf最大的区别,在编译时,日志级别宏会被展开为一个字符串,然后与消息本文拼接在一起,因此printk中优先级和格式字符串之间没有逗号。

rjszcb的博客 7245

linux设备驱动第四篇:驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类情况后往往会直接造成系统宕机,并会抛出oops信息。那么我们如何来分析oops信息呢,甚至根据oops信息来定位

Vic的博客 918

linux内核驱动崩溃oops调试方法

计算崩溃地址 0x3b0+0x18=0x3c8,获取实际崩溃位置(addr2line 0x3c8后面的选项可以自行调整)根据 PC is at icm20608_reginit+0x18/0x1d0 [icm20608]找到icm20608_reginit位置。没有打印信息修改makefile。找到0x18偏移处0x3c8。查看文件是否添加了-g选项。提取问题代码附近位置。

qq_38292379的博客 209

linux驱动程序调试方法

驱动程序开发的一个重大难点就是不易调试。 本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是: 利用printk 查看OOP消息 利用strace 利用内核内置的hacking选项 利用ioctl方法 利用/proc 文件系统 使用kgdb 1. 使用 printk 这是驱动开发中最朴实无华,同时也是最常用和有效的手段。scull驱动的main.c第338行如下,就是使用printk进行调试的例子,这样的例子相信大家在阅读驱动源码时随处可见。 338 // printk(KERN_ALER

chumingqian的博客 3615

linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类

haomcu的专栏 4220
上一篇: linux驱动--内核和驱动关系
下一篇: 南京大学软件质量研究所
cutter2002
博客等级 码龄20年 51粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值