使用KGDB调试内核和模块

使用kgdb调试内核之模块调试 昨天搭建的kgdb调试环境,今天面临的第一个问题就是调试我的模块。调试内核根据上一篇文章的介绍已经够了http://blog.youkuaiyun.com/zr_lang/article/details/8107015,但是调试模块还需要一些额外的工作。下面针对用kgdb调试内核模块的问题的重点部分简要说明一下。 首先,有一个小技巧先说明一下,那就是如果你想在gdb没有进入断点的情况下从目标机运行中将主动权 阅读详情

转载:使用KGDB调试内核和模块

内核空间的代码(包括内核和模块)无法像应用程序那样使用gdb进行简单直观的调试.

代码调试一般有两种方法:

一种是通过调试器辅助调试, 如gdb, Visual C++的集成调试环境, JTAG仿真器的集成调试环境; 这种调试方法可以对代码进行单步跟踪, 所以一次运行基本上就可以排查一条运行路径; 也可以在程序出错时检查调用栈信息, 从而迅速定位问题所在; 所以这种调试方法尤其适合于初期排查代码中的初级/低级错误, 可以大量的节省调试时间, 尤其是对那些一次编译和部署需要耗费大量时间的代码工程, 节省的时间更是可观.

另一种是打印/记录程序运行状态来间接观察程序的运行逻辑是否正确. 这种方法需要仔细分析程序的状态信息, 而且对于一个bug, 往往需要多次增加打印/记录代码才能彻底定位问题真正所在,  所以调试效率非常低; 而且一次编译部署运行一般只能定位一个错误, 因为一旦程序运行出错, 后续的状态信息基本上也就没有分析价值了. 所以这种调试方法一般不用于初期排查代码中的初级/低级错误(一般只在没有合适的辅助调试器的情况下选用). 但这种方法广泛用于后期程序的性能瓶颈问题/时序相关问题的调试. 因为调试器辅助调试往往会影响程序的执行性能和代码的执行时序, 从而无法暴露性能问题/时序问题的真正所在, 所以不适合用于调试此类要求严格贴近程序真实运行环境才能复现的问题.

 

所以KGDB对于内核空间代码早期错误排查具有显著意义, 能够显著加快早期的调试进度.

 

以下是使用KGDB进行内核和模块代码调试的简略过程:

1.准备开发机和调试机. 调试机运行的内核和模块必须是开发机上编译出来的. 开发机和调试机之间通过串口连接; 如果内核和模块调试不影响网络, 也可以通过网口连接进行调试; 一般都通过串口连接进行调试.

2.参照<Linux内核编译简略步骤>在开发机上编译内核和模块, 并在调试机上安装编译好的内核和模块.

3.修改调试机上新安装的内核的启动参数, 增加" kgdboc=ttyS0,115200 kgdbwait"参数(参考<修改Linux内核启动参数>一文).  重新引导系统并选择刚才修改的内核启动项.
4.在开发机内核编译目录下运行:

    gdb vmlinux

    进入gdb界面后运行下面两条命令连接调试机:

        set remotebaud 115200

        target remote /dev/ttyS0

    连接上调试机后其内核会被断在"wmb()"函数处, 键入"c"命令继续引导调试机内核

5.在调试机内:

    1) "sudo chmod 222 /proc/sysrq_trigger" 使得任意用户可以写访问该文件(否则只有root用户可以写访问该文件, sudo都不行)

    2) 任意时刻运行 "echo g > /proc/sysrq-trigger" 可使调试机进入kgdb中断状态; 开发机在kgdb中断状态下可对调试机上代码设置断点, 加载模块的符号文件等; 

6.模块调试:

在开发机内:

        "scp test.ko user@host:/directory/": 将开发机内编译好的模块拷贝到调试机内

在调试机内:

        "insmod test.ko": 加载模块

        "cat /sys/module/test/sections/.text": 获得模块在内核中的加载地址, 如"0xc0ae7000"

        "echo g > /proc/sysrq-trigger": 使调试机进入中断状态

在开发机内:

        gdb进入中断状态

        "add-symbol-file /test/test.ko 0xc0ae7000": 加载模块符号文件; "0xc0ae7000"为调试机中模块在内核中的加载地址.

        现在就可以像gdb调试应用程序一样调试内核模块了, 诸如设置断点; 模块进入断点后单步跟踪, 查看变量等等.

 

7.也可以在两台虚拟机上使用KGDB进行内核和模块的调试.

     使用虚拟机进行调试部署更方便, 对硬件环境要求更低(一台主机即可, 但配置要高一些, 要能跑得动两台虚拟机).

    先在开发机上将要调试的内核和模块编译好, 然后将开发机克隆一份为调试机, 这样可以简化开发机和调试机的部署过程;

    参照<Windows下VMWare虚拟机串口设置>一文设置好两台虚拟机之间的串口设置.

   后续的步骤就和上面的描述一样了.

8.内核自2.6.22版本开始内嵌KGDB支持; 2.6.16之前版本需要在网上找kgdb的补丁; 2.6.16和2.6.22之间的版本在网上找不到合用的补丁; 对于低于2.6.22版本的内核空间代码, 在实际调试时, 如果不是特别复杂, 建议花点时间先移植到2.6.22以上的版本上并调试通过, 然后再回到实际要求内核版本上进行调试.

38、使用KGDB调试ARM目标系统和内核模块 本文介绍了如何使用KGDB通过QEMU对ARM目标系统的Linux内核及内核模块进行调试。内容涵盖测试环境的搭建、内核和模块的调试方法、调试初始化函数的技巧,以及常见问题的解决方法。通过详细的命令示例和流程图解,帮助开发者高效定位和解决内核相关问题。 阅读详情

相关推荐

从零组装一台会‘看’的无人机:手把手教你配置NUC机载电脑与D435深度相机(环境搭建篇)

本文详细介绍了如何从零开始组装一台具备视觉能力的智能无人机,重点讲解了NUC机载电脑与D435深度相机的配置方法。通过Ubuntu系统安装、ROS环境搭建、深度学习框架配置等步骤,帮助开发者实现无人机的自主避障和目标跟踪功能。文章还提供了性能优化和常见问题解决方案,是无人机视觉系统开发的实用指南。

weixin_30915275的博客 397

kgdb原理

1 kgdb原理 kgdb提供了一种使用gdb调试Linux内核的机制,是一种源码级调试。我们可以在本机上调试生成的linux内核镜像,还可以调试内核模块.ko。 我们需要使用两台Linux,一台目标机,或称target、服务器,运行kgdb,另一台开发机,或称host、客户端,运行gdb,两台机器使用串口相连,也可以使用网络相连。 被调试的内核运行在目标机上。需要调试时,目标机将启动kgdb,就...

asd1147170607的博客 1826

用SOEM库搞定汇川SV660N伺服电机:一个Linux C程序员的EtherCAT实战笔记

本文详细介绍了如何在Linux系统下使用SOEM库驱动汇川SV660N伺服电机,包括环境搭建、EtherCAT从站设备识别、PDO映射配置、状态机切换与运动控制等关键步骤。通过实战代码示例和常见问题排查指南,帮助开发者快速掌握工业自动化中的EtherCAT通信技术,实现对伺服电机的精准控制。

weixin_29185199的博客 424

kgdb的源代码分析

Kgdb 源码分析

ruixj的专栏 6620

Argoverse2数据集保姆级导入教程:从下载到预处理全流程解析

本文详细解析了Argoverse2数据集的完整导入流程,从环境配置、数据下载到预处理和高效加载策略。作为自动驾驶领域的标杆数据集,Argoverse2提供多模态传感器数据和高精地图信息,帮助研究者快速搭建数据处理流水线。文章包含实用代码示例和性能优化技巧,特别适合自动驾驶算法开发者参考。

weixin_29035405的博客 336

OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

数据集制作主要是在windows进行,比较方便。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3326

Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)

如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大、逻辑复杂、与硬件交互的特性。因此,有着不同于应用程序的调试方法,据统计Linux内核开发者使用最普遍的调试方法是printk方法,而其他的方法大多是在特殊情况下才会使用。本文介绍的Kgdb调试方法是一种源码级的Linux内核调试器。使用Kgdb调试内核时,需要结合gdb一起使用,使用他们可以对内核进行单步调试,设置断点,

GQB的专栏 1万+

OpenOCD入门到精通:第 1 章 OpenOCD 概述

OpenOCD是一款开源的片上调试工具,支持60+调试适配器和8大处理器架构。它提供三大核心功能:片上调试、在系统编程和边界扫描测试。作为嵌入式开发工具链的中间桥梁,OpenOCD连接上层IDE/GDB与底层硬件,采用分层架构设计实现硬件兼容性。其配置基于Tcl脚本语言,支持网络服务接口,广泛应用于ARM、RISC-V等芯片的调试与烧录场景。

从事嵌入式linux android驱动开发,拥有全栈能力 1401

linux 内核三种调试方法比较(gdb、kdb、kgdb)

1. kdb:只能在2.6版旧内核使用,需要打上补丁;优点是不需要两台机器进行调试,直接在本机进行操作。Kdb(Kernel Debug)是SGI公司开发的遵循GPL的内建Linux内核调试工具。标准的Linux内核不包括kdb,需要从ftp://oss.sgi.com/www/projects/kdb/download/ix86 下载对应标准版本内核的kdb补丁,对标准内核打补丁,然后,编译打过...

ARM-Linux 1万+

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 197

ABAP 里解构引用操作符 ->* 的使用方法详解

解除引用操作符->*可用于将“类型为REF TO …的引用变量”的值(即该引用所指向内存)取出,从而访问其实际值或内部组件。具体地,若dref是一个“引用变量”,则表达式dref->*代表对该引用进行“解除引用”,使得程序按静态类型将其视为实际类型的值对象。例如,若lr类型声明为,则lr->*表示“将 lr 引用的INT4对象看作INT4类型并访问其值”。注:若 “数据引用变量” 的静态类型是通用类型DATA,则只能在这种上下文中使用->*。

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

kgdb调试linux内核以及驱动模块

kgdb调试linux内核以及驱动模块 本文将简要描述如何配置kgdb进行内核以及驱动模块调试,以嵌入式开发为例,但同样对于其他有需要调试kernel有一定的参考价值。本文实验环境为qemu搭建的riscv64模拟器环境,笔者之前有系列博客详细描述了环境搭建,可供参考——《基于qemu-riscv从0开始构建嵌入式linux系统》。 修改内核配置 在linux 5.10版本上,KGDB已经受支持,因此仅需要修改内核配置就可以打开此功能。 CONFIG_KGDB 配置CONFIG_KGDB=y,以启用kgdb

Quard_D的博客 8754

飞牛fnNAS搭建私有云音乐库

本文介绍了在飞牛NAS上部署Navidrome音乐服务器的完整流程。首先创建音乐存储目录并安装Navidrome应用,然后配置管理员账号、语言设置和音乐路径。接着详细说明使用"音乐标签"软件刮削音乐元数据的方法,包括获取软件、导入音乐文件和自动匹配标签。针对远程访问需求,推荐使用ZeroTier实现内网穿透,并给出注册、创建网络及设备加入的具体步骤。最后介绍移动端使用"音流"APP连接Navidrome服务器的配置方法,实现手机端音乐播放。通过这套方案,用户可以搭建专

dgnankai的专栏 1824

利用GDB、KGDB调试应用程序及内核驱动模块

利用GDB、KGDB调试应用程序及内核驱动模块 2017-03-13孙 建坡GDB,GDB KGDB,GDB双机调试,KGDB调试应用程序,利用GDB,核驱动模块,编译内核,调试应用程序,配置串口调试,配置双机通信 文章目录 阅读:12,063 这几天看了一下linux内核提权的一个漏洞,里面涉及到了驱动程序漏洞及驱动调试内容,由于各类linux操作系统版本的不同,如果不能在自己机器上亲自调试驱动程序,可以说即使给了漏洞利用的POC源码也根本无法成功利用。因为内核漏洞的利用涉及...

u014426028的博客 936

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

树莓派kgdb配置使用

配置kgdb调试树莓派的内核及内核模块代码。

前行路上的专栏 1768

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

KGDB调试Linux内核与模块

内核 5.10 版本openEuler 使用 yum install 下载了源码,并且通过两个 VMware 虚拟机进行调试ubuntu 直接使用 git 拉取了下 5.10.235 分支的代码,物理主机作为开发机,通过 virtualbox 建立虚拟机作为调试机本文主要汇总了下近期调试内核与内核模块的配置方式。使用两台虚拟机通信,一台启动 gdb,另一台启动 kgdb物理机本身为 linux 系统启动 gdb,使用虚拟机启动 kgdb。

weixin_41045927的博客 113

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

EOF#chmod +x debugkernel这个脚本主要是调用gdbstart程序设置target机上使用的串口及其速率,并使内核处于调试状态3.3 开始调试target上的内核或内核模块处于调试状态时,可以查看其变量、设置断点、查看堆栈等,并且是源码级的调试,和用gdb调试用户程序一样3.3.1 内核启动后调试*在target机器上重启系统,选择以 2.4.23-kgdb内核启动,启动完成后...

weixin_31752923的博客 409

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

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

1087

【Linux内核模块】调试技巧

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

byte轻骑兵的技术小窝 2376

在VMware环境下,使用KGDB调试内核及内核模块---基于kernel 2.6.36

参考博文:http://blog.youkuaiyun.com/jie12310/article/details/4564853 一、系统安装与配置 系统环境: 虚拟环境:   VMWare Workstation 7.1.4(英文版) 操作系统:   CentOS-6.0-i386(原内核2.6.32,将会把内核升级至2.6.36) 注:CentOS 是RedHat的一个社区版本.

BoArmy的专栏 1447

使用KGDB构建Linux内核调试环境

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

jkggd41g 326
上一篇: kgdb-调试内核和模块-靠谱
下一篇: linux内核调试环境搭建-4 调试模块初始化函数
孜孜不倦
博客等级 码龄16年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值