gdb调试驱动模块

2023-11-10

众所周知,要想使用gdb调试,那么在编译的时候一定要加上-g选项。因为编译器默认是不加-g选项的。
 
因此在编译模块的时候,我们需要在Makefile里面添加如下信息:
 
EXTRA_CFLAGS +=-g
 
在添加了上面的信息后,我们编译出来的.ko文件,就可以使用gdb来调试了。
 
我的oops信息如下:
 
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = 80004000
[00000000] *pgd=00000000
Internal error: Oops: 17 [#1] PREEMPT SMP ARM
Modules linked in: imx_eim(O)
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G           O    4.9.88 #67
Hardware name: Freescale i.MX7 Dual (Device Tree)
task: 80f06340 task.stack: 80f00000
PC is at tasklet_eim_rev_handle+0x6c/0x170 [imx_eim]
LR is at tasklet_eim_rev_handle+0x158/0x170 [imx_eim]
pc : [<7f000074>]    lr : [<7f000160>]    psr: 200e0113    //根据pc的值以及System.map可以知道问题在模块里面
sp : 80f01e30  ip : 80fd38e8  fp : 00000101
r10: 40000006  r9 : 80f02080  r8 : 80e77300
r7 : 80f91400  r6 : 00000000  r5 : 7f000e30  r4 : 7f000e00
r3 : 00000002  r2 : 00000000  r1 : 00000102  r0 : 00000000
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
Control: 10c53c7d  Table: a86d406a  DAC: 00000051
Process swapper/0 (pid: 0, stack limit = 0x80f00210)
Stack: (0x80f01e30 to 0x80f02000)
 
 
 
然后使用通过gdb调试ko文件:
 
gdb imx_eim.ko
 
进入gdb后,输入:
 
l *(tasklet_eim_rev_handle+0x6c)
 
gdb 就会提示你哪里出问题了,我的提示信息如下:
 
 
Reading symbols from imx_eim.ko...done.
(gdb) l *(tasklet_eim_rev_handle+0x6c)
0x74 is in tasklet_eim_rev_handle (./include/linux/dmaengine.h:807).
802    };
803    
804    static inline int dmaengine_slave_config(struct dma_chan *chan,
805                          struct dma_slave_config *config)
806    {
807        if (chan->device->device_config)
808            return chan->device->device_config(chan, config);
809    
810        return -ENOSYS;
811    }
(gdb)  
 
然后我根据gdb的提示,就找到我的问题出在哪里了。
 
 
 
注:如果你没有在Makefile里面添加EXTRA_CFLAGS +=-g信息,那么gdb调试的时候,gdb会提示你如下信息:
Reading symbols from imx_eim.ko...(no debugging symbols found)...done.
(gdb) l *(tasklet_eim_rev_handle+0x6c)
没有符号表被读取。请使用 "file" 命令。
(gdb) q
 
附录一下我的Makefile,留给自己以后备查:
 
ARCH=arm
CROSS_COMPILE=arm-poky-linux-gnueabi-  
 
 
obj-m += imx_eim.o
 
KDIR := /home/kernel    #如果是用于arm平台,则内核路径为arm内核的路径
 
EXTRA_CFLAGS +=-g
 
PWD = $(shell pwd)
all:
    make ARCH=arm CROSS_COMPILE=arm-poky-linux-gnueabi- -C $(KDIR) M=$(PWD) modules
    cp *.ko /nfs
clean:
    rm -rf *.o
    rm *.ko *.order *.mod.c *.symvers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gdb调试驱动模块 的相关文章

  • SpringBoot--基础--6.1--servlet的3大组件--Servlet

    SpringBoot 基础 6 1 servlet的3大组件 Servlet 代码位置 https gitee com DanShenGuiZu learnDemo tree mysql mybaties DB springboot lea
  • pip install conda之后出现问题

    本篇文章主要用于解决 在Linux环境下 在终端输入命令pip install conda之后出现异常报错 报错的结果粘贴如下 ERROR The install method you used for conda probably eit
  • C++11 新特性

    1 指针 智能指针 nullptr shared ptr std weak ptr 1 nullptr 作用 C 11 引入了 nullptr 关键字 专门用来区分空指针 0 原有问题 传统 C 会把 NULL 0 视为同一种东西 这取决于
  • 第二十三章、 Model/View便利类表格部件QTableWidget详解

    老猿Python博文目录 专栏 使用PyQt开发图形界面Python应用 老猿Python博客地址 一 引言 表格部件为应用程序提供标准的表格显示工具 在表格内可以管理基于行和列的数据项 表格中的最大数据项数为总行数和总列数的乘积 另外在表
  • ROC曲线与混淆矩阵的绘制

    20200813 引言 ROC曲线的绘制过程 混淆矩阵的绘制 问题 1 ROC曲线的绘制 ROC曲线的绘制绘制需要分类器能够返回相应的分类概率值 from sklearn metrics import roc curve ns fpr ns

随机推荐

  • Vue+SpringBoot使用POI导出EXCEL

    https blog csdn net qq 44209274 article details 110087085
  • shell命令基本操作1

    sed指定行插入 sed i i 或者 a 插入列paste 或者awk http bbs chinaunix net thread 342540 1 1 html shell定义函数func 函数体 shell算术运算 c a b htt
  • servlet-url-map

    import javax servlet ServletConfig import javax servlet ServletContext import javax servlet ServletException import java
  • Python学习笔记

    安装python 3 6 8 下载地址 cd usr local tar xzvf Python 3 6 8 tgz 带上ssl模块 一会pip会用 cd Python 3 6 8 configure with ssl 安装gcc编译器 y
  • Hibernate各种主键生成策略

    Hibernate各种主键生成策略详解 1 assigned lt 特点 可以跨数据库 人为控制主键生成 应尽量避免 gt 主键由外部程序负责生成 在 save 之前必须指定一个 Hibernate不负责维护主键生成 与Hibernate和
  • 队列的数组实现(C语言描述)

    队列也是一种简单却很有用的数据结构 其特点是先进先出 基本操作是enqueue 入列 和dequeue 出列 下面给出数组实现的代码 ifndef QUEUE H INCLUDED define QUEUE H INCLUDED struc
  • 使用jsonfield做注解名称值替换

    package cn superred support utils import cn hutool db meta Column import com alibaba fastjson annotation JSONField impor
  • tomcat的启动过程分析

    一 了解类加载器 要了解类加载器首先要了解什么是类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存 并对数据进行校验 转换解析和初始化 最终形成可以呗虚拟机直接使用的Java类型 这就是虚拟机的类加载机制 虚拟机设计团队把类
  • 复制构造函数

    和普通构造函数的区别 普通构造函数在对象创建时被调用 复制构造函数在用已有对象复制到一个新对象时被调用 复制构造函数由编译器调用来完成一些基于同一类的其他对象的构建及初始化 其形参必须是引用 但并不限制为const 一般普遍的会加上cons
  • Invalid or unexpected token:数据格式错误

    Uncaught SyntaxError Invalid or unexpected token 翻译成中文是 捕获的查询无效或意外的标记 代码逻辑没问题 那么就是数据问题了 把页面要展示的数据全部检查一遍后 果然发现疑点 1 多了单引号
  • 7-10 查找指定字符 (15分)

    7 10 查找指定字符 15分 本题要求编写程序 从给定字符串中查找某指定的字符 输入格式 输入的第一行是一个待查找的字符 第二行是一个以回车结束的非空字符串 不超过80个字符 输出格式 如果找到 在一行内按照格式 index 下标 输出该
  • [CTFshow]吃瓜杯复现wp

    热身
  • 利用opencv通过点击鼠标获取一张图片上点的像素点坐标

    include stdafx h include opencv2 highgui highgui hpp include opencv2 imgproc imgproc hpp include
  • centos - 初始化服务器环境

    初始化服务器环境 包括 1 安装wget 2 安装vim 3 安装jdk 4 安装perl 前提准备 1 将建好目录 root soft 2 将jdk和perl的安装包上传到 root soft目录下 jdkjdk 7u65 linux i
  • 【MySQL】《狂飙》电视剧火了,如果程序一直狂飙,扛不住了,怎么办呢?

    程序如果狂飙了怎么办呢 狂飙 电视剧你看了吗 程序 狂飙 你担心吗 性能优化步骤 适合创建索引的情况 不适合创建索引的情况 Explain 性能分析 id说明 select type 说明 type字段说明 Extra说明一下 狂飙 电视剧
  • 工作学习之余如何学习Python?

    作为一个学生 可能平常除了上课也没有很多别的时间了 今天就给大家分享一下 工作学习之余 应该如何学习Python 1 明确目标 对于零基础的人而言 要明确你学习Python仅仅是为了满足好奇心 还是有工作需要 比如办公自动化的需要 转行的需
  • 史上最强最全网站资源整理

    一 找资源利器 胖次 http www panc cc 爱挖盘 http www iwapan com 盘多多 http www panduoduo net 盘窝窝 http www panww com 百度网盘搜索 http uzi8 c
  • Qt3.6.3编译pc版本的时候:collect2:ld terminated with signal 11

    Qt3 6 3编译pc版本的时候 collect2 ld terminated with signal 11 原因 是swap交换空间不够用 解决 扩大虚拟内存 具体参考下文 http hi baidu com seaeechou blog
  • PCB高速信号布线技巧

    转载 玩转嵌入式 2021 07 31 18 59 电源布局布线 数字电路很多时候需要的电流是不连续的 所以对一些高速器件就会产生浪涌电流 如果电源走线很长 则由于浪涌电流的存在进而会导致高频噪声 而此高频噪声会引入到其他信号中去 而在高速
  • gdb调试驱动模块

    众所周知 要想使用gdb调试 那么在编译的时候一定要加上 g选项 因为编译器默认是不加 g选项的 因此在编译模块的时候 我们需要在Makefile里面添加如下信息 EXTRA CFLAGS g 在添加了上面的信息后 我们编译出来的 ko文件