通过KGDB进行双机内核调试

通过KGDB进行双机Linux内核调试 Kgdb是双机在线调试,一端是Host端(linux),运行GDB,另一端是Target端,运行带Kgdb的linux内核。 两边通过串口(KGDBoc)或网络口(KGDBoE)相连接,kgdb实现了远程调试的功能, 阅读详情

原理

原理结构图

这里写图片描述

原理过程

Kgdb是双机在线调试,一端是Host端(linux),运行GDB,另一端是Target端,运行带Kgdb的linux内核。
两边通过串口(KGDBoc)或网络口(KGDBoE)相连接,kgdb实现了远程调试的功能,主要部件有:

stub

stub可卸任是一个运行在target端的代理,它负责与远程的Host端进行沟通,接收Host端发来的指令。

应用场景

如上面原理图所示,常常用于嵌入式开发场景中,开发板作为target端,运行打开Kgdb的内核 ,PC机作为Host端,运行GDB,用来远程调试Target端的内核。

内核配置

在内核2.6.26版本之前,Kgdb是以Patch的方式提供,要使用它需要经过复杂的配置过程,并且容易出错,之后,就集成到了内核中,只需要打开相关配置项即可使用了。

这里,我们以内核 4.4.19为例,KGDB的配置如下:

  Kernel hacking  ---> 
         [*] KGDB: kernel debugger  ---> 
                  [ ]   KGDB: internal test suite                                                                                                     
                  [*]   KGDB: Allow debugging with traps in notifiers                                                                   
                  [*]   KGDB_KDB: include kdb frontend for kgdb 

DEBUG相关配置:

    Kernel hacking  --->
         Compile-time checks and compiler options  ---> 
                    [*] Compile the kernel with debug info

实例:利用virtualBox(ubuntu14.04) 使用Kgdb进行模拟双机调试

环境:

  • Host:deepin 15.2(64Bit)
  • Target:virtualbox(Ubuntu14.04_64bit)
  • 连接方式:虚拟串口

结构图

这里写图片描述

准备工作

  1. 设置虚拟串口

详细参考另一篇博文《Linux主机和VirtualBox之间实现串口通信》

  1. 在虚拟机中运行开启KGDB的内核
    这里,为了方便测试KGDB,直接使用源码中自带的arch/x86/configs/x86_64_defconf

执行 

make x86_64_defconf

然后再执行 :

make menuconfig

参考上面开启KGDB和DEBUG相关的内核配置项。

编译带有调试信息的内核

make-kpkg --initrd --revision 001.magc --append-to-version -20160901 kernel_debug kernel_image kernel_headers

注:这里kernel_debug和kernel_image要同时有,因为它们产生的deb有依赖关系。

编译成功后,会看到生成三个deb包,并使用dpkg 命令将它安装上去。

另外,还要将此源码和产物,放到HOST里面一份。

  1. 修改Guest OS的Grub启动参数

在Guset OS中修改/boot/grub/grub.cfg
找到当前系统使用的内核启动命令行,在后面添加:

kgdboc=ttyS0 115200 kgdbwait

注:
- kgdboc:是指KGDB over console 使用波特率为115200的ttyS0.
- kgdbwait:是让kernel一直等等待直到连上GDB为止。
- 添加此参数后,需要重启系统来激活这些参数。

  1. 在HOST中使用socat来连接虚拟串口的命名管道文件
# socat -d -d /home/magc/workspace/vmserial PTY

注:
- PTY:是一种pseudo-terminal
- /home/magc/workspace/vmserial:是虚拟串口在HOST上的命名管道文件
- 当运行此命令后,终端进入等待状态,如下图示:
这里写图片描述

如上所示,得到的pseudo-terminal的设备名是/dev/pts/0 ,这个进程需要在调试过程中一直进行,并且HOST上的GDB会使用这个这设备名

开始双机调试

通过上面几步准备工作,使HOST和虚拟机的虚拟串口连接起来,此时重新启动虚拟机。此时,虚拟机会卡住,等等连接HOST上的GDB.

1. 启动HOST上的GDB:

进入源码编译目录下(此源码目录是从Guest OS中复制过来的),执行下面命令,启动GDB:

# cd linux-4.4.19
# gdb ./vmlinux   
(gdb) target remote /dev/pts/0

此时虚拟机仍停止等待,当在GDB中输入下面指令:

continue

此时虚拟机就会继续启动进入系统了。
若想重新回到GDB控制,只需要在Guest OS中执行下面命令:

 echo g > /proc/sysrq-trigger

此时,Guest OS就会中止当前会话,回到HOST的GDB控制中。这样就可以增加断点以及调试了。

2. 调试内核模块:

若是调试内核的话,按上面操作方法即可满足需求,若是想调试某个单独的内核模块,那就在Guest OS中安装此模块,并拿到此模块的.text段地址(/sys/module//sections/.text) ,并在HOST的GDB中通过add-symbol-file 参数加载进来进行调试即可。

小结

通过VirtualBox使用KGDB进行双机调试的主要步骤:
1. 在HOST和Guest OS之间建立虚拟串口连接
2. 在Guest OS里编译安装带Debug的内核,并修改Grub启动参数
3. 在Host里启动GDB,并连接到虚拟串口上,开始双机调试

参考:http://opensourceforu.com/2011/03/kgdb-with-virtualbox-debug-live-kernel/

零基础学GPU KMD--4. 开发环境搭建指南(Linux 平台) 本文详细介绍了在Linux平台搭建GPU内核驱动开发环境的完整流程。主要内容包括:1)内核源码编译与配置,重点说明如何启用DRM框架和调试选项;2)DRM驱动开发环境搭建,涵盖libdrm库安装和测试工具使用;3)kgdb/kgdboc双机调试环境配置,分别说明目标机和主机的设置步骤。通过这三个核心环节的配合,开发者可获得完整的源码级调试能力,为GPU内核驱动开发提供完善的工具支持。 阅读详情

相关推荐

保姆级教程:用安卓手机+IP摄像头App,5分钟搭建一个免费的RTSP监控测试环境

本文提供了一份详细的保姆级教程,教你如何利用安卓手机和IP摄像头App在5分钟内搭建免费的RTSP监控测试环境。通过零成本方案,开发者可以快速获取实时视频流,适用于计算机视觉、物联网开发等多种场景。教程涵盖工具选型、配置详解、电脑端测试及OpenCV集成,助你高效完成开发测试。

weixin_27419879的博客 274

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

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

GQB的专栏 1万+

CDR学习笔记——02

这篇写一些高级CDR的架构原理。

... 1014

KGDB调试搭建使用心得

最近遇到一个棘手的问题,反复加入printk添加打印语句,重新编译内核或者模块太麻烦,想找个方法能一步步看下去,gdb是一个不错的选择,所以使用kgdb来调试开发板是个不错的选择。上面是个人使用kgdb时的一些心得,kgdb很方便,但有时候使用kgdb容易卡死,或者在一个函数需要很久才能返回,还是有一些缺陷。

changcheng00的博客 2909

【Unity】【模型】【AI建模】如何将AI生成的GLB格式3D模型文件导入Unity

本文介绍了一个将AI工具自动生成的GLB格式3D模型文件转换成fbx模型文件导入Unity的步骤。

O青草O的博客 Unity和游戏制作知识分享 1357

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1106

KGDB调试LINUX内核

摘要: 本文介绍了如何在DB12X板子上开启KGDB调试功能.如何运行AGENT-PROXY进行代理串口的访问.如何运行GDB单步跟踪. 1.环境 我的环境是: 一块DB12X ATHEROS AP 板子,MIPS架构,内核LINUX 2.6.31 一台UBUNTU 14.04电脑. 2.修改内核配置 进入SDK的LINUX内核目录 cd linux/kernels/mips-l

snowpiaop的专栏 1666

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 888

kgdb调试

echo g > /proc/sysrq-trigger" 这个指令是触发kgdb运行的,输入该指令后,内核就会停下,等待远端gdb连接。ttymxc0是所需使用的串口设备名,115200代表波特率,kgdbwait 是一个启动参数,也可以选择不添加该选项。所以需要给它传递一些参数。到这里已经可以调试内核和编入内核的驱动了,问题是我们更多的工作是调试动态加载的驱动,kgdb调试,在该方式下一共需要两台设备,其中一台为本地的被调试设备,gdb停下来了,剩下的工作就是一个普通的gdb了,你可以给内核下断点,

weixin_43300893的博客 707

Coze 打通飞书多维表格,实现数据增删改查操作实战详解

基于Coze 打通飞书多维表实现数据录入系统实战详解

congge 5779

多源异构数据融合(Kaggle+Google Trends联合分析)

本文详细介绍了如何利用Python实现多源异构数据融合,以Kaggle电商销售数据与Google Trends搜索指数为例,展示了数据清洗、预处理、时间对齐、数据合并、相关性分析、回归建模和可视化全过程。数据预处理与内存优化通过分块加载、数据类型转换和缺失值处理,有效降低了大规模数据在内存中的占用,并确保数据质量。时间对齐与数据融合策略采用重采样与内连接方法对齐不同数据源的时间维度,实现了高质量数据的融合,为后续联合分析奠定基础。模型构建与分析。

闲人编程的博客 1014

kgdb调试linux内核,Linux 内核调试6-使用KGDB双机调试

虽然使用UML或者Qemu可以调试Linux内核,但UML和Qemu毕竟是一个模拟,调试硬件驱动总是用虚拟硬件总不成事,而且Qemu据传闻 对于时钟和中断的处理也有问题,所以对于处理真实硬件的问题,最完美的调试方式就是双机调试,被调试内核在完全真实的环境中运行,排除虚拟机制的不稳定因素,而且使用内核自带的KGDB机制,更具有可靠性,类似Windows下的WinDbg调试方式。这里使用Virtual...

weixin_42512276的博客 484

4、海洋哺乳动物运动能量学:潜水与生存的奥秘

本文深入探讨了海洋哺乳动物在潜水与运动中的能量消耗机制,涵盖其生理反应、代谢成本、节能行为策略及测量方法。通过分析不同物种的能量利用特点,揭示了它们如何在极端水下环境中维持能量平衡,并讨论了该研究在保护生物学、生态系统动态和动物健康管理中的实际意义。文章还展望了未来多学科交叉、长期监测及应对环境变化的研究方向,为理解海洋哺乳动物的生存奥秘提供了系统性视角。

p5l2m9n4o6q的博客 116

kgdb调试linux内核,Linux内核开发双机调试(KGDB)

学习linux内核是很多程序员的梦想,内核错误往往会导致系统宕机,很难保留出错时的现场,对于开发linux内核和驱动调试,一般需要双机调试环境,KGDB是在内核2.6.26版本中正式支持的,可以方便调试内核和驱动。前期准备1.vmware虚拟机,安装centos6操作系统(内核版本2.6.32),对于学习低版本内核更合适2.安装开发工具链 sudo yum groupinstall "Develo...

weixin_39883433的博客 416

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Vmware+CentOS+KGDB内核双机调试

其中一台作为调试机,另一台则作为被调试机。如下图,CentOS7.9x64为被调试机,CentOS7.9x64-Debugger为调试机。

xiejianjun417的专栏 1229

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

u014426028的博客 936

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

利用虚拟机调试内核模块

利用虚拟机调试内核模块 本文描述了在虚拟机中,利用KGDB双机联调NBD驱动的准备过程以及使用频率较高的调试命令。以此为例,介绍调试Linux内核以及内核模块的一种较常用的方法。 在进行内核调试时,系统已经不会响应用户态程序,所以需要使用两台计算机利用串行端口或网络进行双机联调,本文介绍的是利用串行端口进行联调。 下面详细介绍调试的准备工作和调试过程: 1 准备工作 新建虚...

dongkui8623的博客 228

linux虚拟机内核模块,利用虚拟机调试内核模块

利用虚拟机调试内核模块本文描述了在虚拟机中,利用KGDB双机联调NBD驱动的准备过程以及使用频率较高的调试。以此为例,介绍调试Linux内核以及内核模块的一种较常用的方法。在进行内核调试时,系统已经不会响应用户态程序,所以需要使用两台计算机利用串行端口或网络进行双机联调,本文介绍的是利用串行端口进行联调。下面详细介绍调试的准备工作和调试过程:1 准备工作新建虚拟机,并安装linux系统。本使用的是...

weixin_29628479的博客 685

linux内核调试方法总结

前言 最近想复现一个关于linux kernel的漏洞,无奈之前没有接触过内核调试,搭建环境还是废了一些功夫的,这里把我自己一路躺过来的坑记录一下分享给大家,如有不正确的,还请大佬不吝赐教^ ^ 环境 qemu+gdb Ubuntu16.04 架构:x86_64 内核:linux5.11.1 qemu:2.5.0 gdb:10.2 busybox:1.33.1 双机调试 debugging:ubuntu18.04 (调试端) debuggee:ubuntu18.04 (被调试端) 架构:x86_64 内核

qq_39153421的博客 2443

linux 内核驱动单步,利用 GDB、KGDB 调试 Linux 内核 驱动模块及应用程序.PDF

利用 GDB、KGDB 调试 Linux 内核 驱动模块及应用程序.PDF利用 GDB、KGDB 调试 Linux 内核驱动模块及应用程序目录目标21 基础环境搭建31.1 资源环境 41.2 安装 vmware 虚拟机及 ubuntu 操作系统 42 编译内核52.1 配置内核参数52.2 编译内核73 配置双机通信 83.1 双机串口通信83.2 验证串口通信配置 104 配置串口调试 11...

weixin_30825953的博客 443

Linux驱动开发杂记(0x0F) - Cannot access memory at address

按照教程Linux内核调试环境搭建(基于ubuntu12.04) 配置kgdb双机调试时,出现一下错误: (gdb) set serial baud 115200 (gdb) target remote /dev/ttyS0 Remote debugging using /dev/ttyS0 0xffffffffb753b940 in ?? () (gdb) b start_kernel Brea...

Vinx Blog 4063
上一篇: 通过KGDB进行双机Linux内核调试
下一篇: AWK使用小结
Linux先生
博客等级 码龄20年 97粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值