linux内核调试环境搭建-4 调试模块初始化函数

嵌入式Linux内核调试实战:从环境搭建到模块调试全解析 在嵌入式系统开发中,内核调试是确保系统稳定运行的关键技术。其核心原理在于通过调试器接管处理器执行流程,实现对内核代码的源码级单步跟踪与状态监控。这项技术的价值在于能够深入系统底层,精准定位启动失败、驱动异常等复杂问题,极大提升开发效率。在基于Power Architecture等处理器的嵌入式Linux开发场景中,内核调试广泛应用于板卡启动、驱动开发和性能优化。本文聚焦于使用CodeWarrior IDE进行嵌入式Linux内核调试的完整流程,详细解析了调试环境构建、内存布局规划、设备树处理等核心环节,并深 阅读详情

打开一终端执行:

qemu -m 512 -kernel bzImage -append "root=/dev/sda kgdboc=ttyS0,115200 kgdbwait" -boot c -hda busybox.img -k en-us -net nic -net tap,ifname=tap0,script=no -serial tcp::4321,server

显示等待调试端链接:

QEMU waiting for connection on: tcp:0.0.0.0:4321,server。

 再打开一终端

$cd linux-2.6.35.9

$gdb vmlinux

调试客户端:

(gdb) target remote localhost:4321

Remote debugging using localhost:4321

kgdb_breakpoint (new_dbg_io_ops=0xc07c27e0)

at kernel/debug/debug_core.c:967

warning: Source file is more recent than executable.

967            wmb(); /* Sync point after breakpoint */

 

开启运行:

(gdb) c

Continuing.

一直到虚拟机启动。

让虚拟机进入调试模式:

#echo g > /proc/sysrq-trigger

 

在调试端下断点:

(gdb)b sys_init_module

(这个函数名在源文件中找不到,是由宏定义SYSCALL_DEFINE3展开的)

让虚拟机开启运行:

(gdb) c

Continuing.

在虚拟机中加载模块:

#insmod globalmem.ko

此时调试端中断在函数sys_init_module中:

Breakpoint 1, sys_init_module (umod=0xb777c008, len=134933, uargs=0x81c4348 "")

    at kernel/module.c:2618

2618         if (!capable(CAP_SYS_MODULE) || modules_disabled)

 

下断:

(gdb) b add_sect_attrs

Breakpoint 2 at 0xc017251d: file kernel/module.c, line 1160.

执行:

(gdb) c

Continuing.

Breakpoint 2, add_sect_attrs (mod=0xe0a356c0, nsect=34, secstrings=0xe0a2b621 "",

    sechdrs=0xe0a2b754) at kernel/module.c:1160

1160         for (i = 0; i < nsect; i++)

 

用where显示调用栈:

(gdb) where

#0  add_sect_attrs (mod=0xe0a356c0, nsect=34, secstrings=0xe0a2b621 "", sechdrs=0xe0a2b754)

    at kernel/module.c:1160

#1  0xc0174029 in load_module (umod=<value optimized out>, len=<value optimized out>,

    uargs=<value optimized out>) at kernel/module.c:2552

#2  0xc01742e2 in sys_init_module (umod=0xb78b6008, len=134933, uargs=0x81c4348 "")

    at kernel/module.c:2622

 

下断第1192行:

(gdb) b 1192

Breakpoint 4 at 0xc01725db: file kernel/module.c, line 1192.

 

按c开启运行:

(gdb) c

Continuing.

Breakpoint 4, add_sect_attrs (mod=<value optimized out>, nsect=<value optimized out>,

    secstrings=<value optimized out>, sechdrs=0xe0a2b754) at kernel/module.c:1192

1192                   *(gattr++) = &(sattr++)->mattr.attr;

 

此时打印  sattr ->name:

(gdb) p sattr ->name

$4 = 0xdf412b60 ".note.gnu.build-id"

 

按若干次c之后:

(gdb) p sattr ->name

$2 = 0xdf8b25e8 ".text"

(gdb) p /x sattr ->address

$4 = 0xe0a35000

 

(gdb) p sattr ->name

$8 = 0xdf8b2600 ".data"

(gdb) p /x sattr ->address

$10 = 0xe0a356b8

 

在gdb中增加调试信息:

add-symbol-file /home/gudujian/06/globalmemDriver/globalmem.ko 0xe0a35000 -s .data 0xe0a356b8


此时就可以对globalmem.ko模块中的符号,正常下断点:

(这里仅仅使用模块的两个节.data,.text如果再使用其它节那么比较麻烦,如果有脚本可以做上面的事情就很好了)。

(gdb) b globalmem_init

Breakpoint 5 at 0xe0a35448: file /home/gudujian/06/globalmemDriver/globalmem.c, line 195.

 

按c让程序开始运行:

(gdb) c

Continuing.

Breakpoint 5, globalmem_init () at /home/gudujian/06/globalmemDriver/globalmem.c:195

195           dev_t devno = MKDEV(globalmem_major, 0);

 

此时程序中断在新加载模块的module_init函数中:globalmem_init。

此时因为编译这个内核模块时带有调试信息  EXTRA_CFLAGS=-g -O0

所以可以正常调试linux模块。

小技巧:
)当不知道一个指针指向具体哪个函数的时候可以用打印的方式;
比如: ret = info->fbops->fb_check_var(var, info);
可以打印: printk("info->fbops->fb_check_var is %x\n",info->fbops->fb_check_var);
得到这个函数指针的地址之后一切就好办了,可以用 cat /proc/kallsyms,或者用
map文件。或者用addr2line工具得到对应的具体哪个函数。
​​​​​​​

Linux内核开发入门:从环境搭建到模块编写与调试实践 操作系统内核是计算机系统的核心,负责管理硬件资源、提供系统服务并保障进程隔离与安全。其核心原理在于通过系统调用、中断处理等机制,实现用户空间与内核空间的权限隔离与高效交互。掌握内核开发技术,对于深入理解系统性能瓶颈、排查底层故障、构建高可靠基础设施具有重要价值。在Linux环境下,内核模块作为动态扩展内核功能的基础单元,广泛应用于设备驱动、文件系统、网络协议栈等场景。本文聚焦于Linux内核模块开发,通过搭建实验环境、编译调试内核、编写交互模块等实践,帮助开发者掌握内核开发的核心流程与调试方法,为深入理解系 阅读详情

相关推荐

基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析

基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析

qq_63508131的博客 912

OVS与DPDK vHost User端口

DPDK数据路径提供DPDK支持的vHost User端口作为与客户机交互的主要方式。有关vHost User的详细信息,请参阅’qemu’在同一文件上。 重要: 要使用任何基于DPDK的端口,你必须确保网桥已正确配置。更多信息请参见bridge. 快速示例 本示例演示如何添加两个dpdkvhostuserclient端口到已有的网桥br0中: $ ovs-vsctl add-port br0 d...

redwingz的博客 8116

在Windows上搭建Linux内核编译环境

本文详细介绍了在Windows系统上使用WSL2搭建Linux内核编译环境的完整方案。主要内容包括:1)推荐使用Ubuntu 22.04 LTS作为Linux发行版;2)通过wsl--install命令启用WSL2并安装Ubuntu;3)安装内核编译所需的工具链和依赖包;4)分阶段完成内核源码获取、配置裁剪、编译部署的全过程;5)演示如何编写和加载简单的内核模块。该方案充分利用WSL2的轻量级虚拟化优势,实现了近乎原生的Linux开发体验,为Windows用户提供了高效的内核开发环境。

元直的博客 1205

用GDB反汇编调试linux内核

在搭建好linux内核调试环境之后还会遇到各种问题,比如linux内核是不允许已最低优化等级编译的,因此有时候打印一个变量值就会显示 &lt;optimized out&gt; 这个时候就需要采用其它的方式来显示变量值了,反汇编就是其中一种方式: 当调试linux模块初始化函数的时候(http://blog.youkuaiyun.com/xsckernel/article/deta...

XscKernel的专栏 记录工作中做的点滴 6141

QEMU虚拟机网卡及网络配置

介绍了多种QEMU虚拟机的网卡虚拟化技术和具体实现方法,同时给出了相应的网络配置步骤

RT-Thread QEMU TAP 网卡驱动

使用 RT-Thread QEMU BSP 的时候,如果需要用到网络,需要使用 TAP 网卡来为 QEMU 提供网络支持。

qemu虚拟机配置网络

这里只简单梳理下操作流程,以便快速实现网络互通。

千墨 的优快云《断剑情雪》《月颜牌》,本人文章全部免费,仅供学习。 1万+

Pika Labs vs Runway ML:零基础小白如何选择最适合自己的AI视频生成工具?

本文详细对比了Pika Labs和Runway ML两款AI视频生成工具,从操作界面、生成效果、隐藏成本、工作流适配性和未来兼容性五个维度进行分析。Pika Labs适合零基础用户快速生成社交媒体短内容,而Runway ML则更适合专业级视频制作。帮助用户根据自身需求选择最适合的AI视频生成工具。

wood5的博客 599

【Linux内核模块】调试技巧

Linux内核模块开发中,调试是确保系统稳定性的关键环节。本文将系统讲解2025年最新调试技术,结合实战案例与工具使用技巧,帮助开发者快速定位内核问题。

byte轻骑兵的技术小窝 2375

【G4基础08】GPS-2-Macro Commands宏命令

GPS-2

adelall的博客 3738

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

Linux内核调试方法

内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。 一 调试前的准备 在调试一个bug之前,我们所要做的准备工作有: 有一个被确认的bug。 包含这个bug的内核版本号,需要分析出这个bug在哪一个版本被引入,这个对于解决问题有极大的帮助。可以采用二分查找法来逐步锁定bug引入版本号。 对内核代码理解越深刻越好,同时还需要一点点运气。 该bug可以复现。如果能够找到复现规律,那么离找到问题的原因...

咸鱼弟的博客 1万+

第14.7章 高翔博士最新开源框架Lightning-LM源码解读(七):PoseExtrapolator模块深度剖析,揭秘激光SLAM高频位姿外推核心技术

PoseExtrapolator是Lightning-LM框架中负责高频位姿外推的核心模块,通过融合DR(航位推算)、激光里程计和PGO(位姿图优化)数据实现精准实时定位。模块初始化依赖PGO数据,后续通过DR数据进行高频位姿更新,并利用PGO结果进行误差补偿。关键函数AddDRLocAndExtrapolate处理DR增量位姿,结合速度补偿机制逐步修正误差,保证高频输出的同时提升精度。该模块体现了多传感器融合思想,通过互补性数据(高频DR与低频高精PGO)实现鲁棒定位,代码中使用了SE3位姿表示、互斥锁保

行知SLAM 348

使用kgdb调试linux内核及内核模块

 1. 几种内核调试工具比较kdb:只能在汇编代码级进行调试;     优点是不需要两台机器进行调试。gdb:在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括反汇编内核函数。kgdb:能很方便的在源码级对内核进行调试,缺点是kgdb只能进行远程调试,它需要一根串口线及两台机器来调试内核(也可以是在同一台主机上用vmware软件运行两个操作系统来调试)使用kd

dofeel的专栏 2117

《QT+PCL》点云的点选与框选

【代码】《QT+PCL》点云的点选与框选。

阁楼 3600

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 210

内核模块的调试方法

内核可加载模块的调试具有其特殊性。由于内核模块中各段的地址是在模块加载进内核的时候才最终确定的,所以develop机的gdb无法得到各种符号地址信息。所以,使用kgdb调试模块所需要解决的一个问题是,需要通过某种方法获得可加载模块的最终加载地址信息,并把这些信息加入到gdb环境中。 I、在Linux 2.4内核中的内核模块调试方法 在Linux2.4.x内核中,可以使用insmod -m命令输

myxmu的专栏 1674

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 305

GDB 调试 Linux 内核模块

与用户空间程序不同,内核模块直接操作硬件并管理系统资源,因此调试内核代码时,我们需要使用特定的工具和方法。然而,使用 GDB 调试内核模块,可以让我们深入了解内核的运行机制,查找和修复硬件驱动、内存管理等底层问题。掌握内核调试技术,不仅能提升你的系统级编程技能,还能让你在开发高性能、稳定的系统时游刃有余。调试内核就像修复一台复杂的机器:它是一个由无数细小部件组成的庞大系统,任何一处小问题都有可能导致系统的整体故障。KDB 是 Linux 内核的交互式调试器,允许你在内核崩溃时调试内核。

底层软件设计内幕 1389

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2465

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux内核模块开发的快速上手(三)

帮助用户搭建内核的调试环境

always_on_way的博客 1477

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux 内核揭秘:initcall 机制,内核初始化函数的调用顺序

你是否曾好奇 Linux 内核启动时,成百上千的初始化函数是如何有条不紊地执行的?为何有些驱动总是在特定服务之前加载?本文将深入解析内核初始化的核心机制——initcall,带你揭开函数调用顺序的神秘面纱。读完本文,你将掌握:initcall 等级划分规则、优先级控制方法、实战调试技巧,以及如何在自己的内核模块中合理使用 initcall 机制。 ## initcall 机制的核心价值 在 L...

gitblog_00981的博客 963

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux内核调试方法总结

https://www.cnblogs.com/cslunatic/p/3639099.html 【转】Linux内核调试方法总结 目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_stack() 五 printk() 1 printk函数的健壮性 2 printk函数脆弱之处 3 LOG等级 4 记录缓冲区 5 sysl...

yumiano0的博客 1566

(转载)使用kgdb调试linux内核及内核模块

使用kgdb调试linux内核及内核模块创建时间:2005-09-09文章属性:原创文章提交:xcspy (xcspy.com_at_gmail.com)作者:xcspy成员 ladybugE-mail:xcspy.com@gmail.com主页:www.xcspy.com1. 几种内核调试工具比较kdb:只能在汇编代码级进行调试;     优点是不需要两台机器进行调试。gdb:在调试模块时缺少一

Kendiv's Box 2936

Linux内核实战精髓实录4 - 编写Linux内核模块:初始化/退出函数与参数定义详解

本文介绍了Linux内核模块的开发技术。内核模块是动态加载到内核空间的二进制文件,支持设备驱动等功能扩展,具有无需重新编译内核、按需加载等优势。文章详细讲解了模块的核心结构(初始化/退出函数)、参数定义与使用方法,并提供了基础模块和带定时器的高级模块示例。同时介绍了模块编译所需的特殊Makefile编写方法,以及常见问题排查技巧。内核模块开发需要谨慎处理权限问题,错误的代码可能导致系统崩溃,调试时可借助dmesg查看日志。通过模块机制,开发者能够灵活扩展内核功能,实现设备驱动等核心功能。

文石_2009的博客 990
上一篇: linux内核调试环境搭建-3 调试内核模块
下一篇: 自己写 Netfilter 匹配器
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值