【转】在单板上通过串口调试内核

2024-01-15 19:38
文章标签 调试 串口 内核 单板

本文主要是介绍【转】在单板上通过串口调试内核,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    如何单步源码级调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大、逻辑复杂、与硬件交互的特性。因此,有着不同于应用程序的调试方法,据统计Linux内核开发者使用最普遍的调试方法是printk方法,而其他的方法大多是在特殊情况下才会使用。本文介绍的Kgdb调试方法是一种源码级的Linux内核调试器。使用Kgdb调试内核时,需要结合gdb一起使用,使用他们可以对内核进行单步调试,设置断点,观察变量、寄存器的值等。然而也有其限制条件,本文仅简单介绍使用串口的Kgbd的流程(kgdboc方式),除此之外还网卡方式即kdgboe方式,Kgdb调试原理及kgdboe方式配置请参阅博文《Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置》。

/**********************************************************************************************************************************/

原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/9117597,作者:gqb666  
/**********************************************************************************************************************************/

     关键步骤:

一、配置Linux内核,使其支持KGDB。

    依次进行如下配置:

    $make menuconfig(下面配置为必须进行的           

[plain]  view plain copy
  1. Kernel hacking--->  
  2.        -*- Magic SysRq key  
  3.        [*] Kernel debugging  
  4.        [*] Compile the kernel with debug info  
  5.        [*] KGDB: kernel debugging with remote gdb --->  
  6.               <*> KGDB: use kgdb over the serial console  

         配置成功后进行Linux内核的编译。make uImage并生成uImage拷贝到nfs/tftp服务器,等待u-boot下载内核或者直接烧到flash从flash启动。

二、修改u-boot的启动参数bootargs以支持kgdb调试

          setenv bootargs 'console=ttyS0,115200n8 kgdboc=ttyS0,115200 kgdbwait …… nfsroot=……'

         主要增加以上红色字体部分,指定kgdb使用开发板上的哪个串口,注意这里是串口名而不是设备文件/dev/ttyS0。

三、配置虚拟机与PC机的串口映射。如博主的Vmware虚拟机使用usb转串口到linux下串口设备名为/dev/ttyS1(将在第五步使用)。可以通过mincom进行实际测试。

四、在虚拟机linux系统下使用minicom启动开发板的内核方法如下

                     tftp进行下载内核                  

[plain]  view plain copy
  1. OMAP3_EVM # tftp  
  2. smc911x: detected LAN9220 controller  
  3. smc911x: phy initialized  #by guoqingbo  
  4. smc911x: MAC 02:01:05:96:02:01  
  5. Using smsc911x-0 device  
  6. TFTP from server 192.168.1.93; our IP address is 192.168.1.94  
  7. Filename 'uImage'.  
  8. Load address: 0x82000000  
  9. Loading: #################################################################   
  10.          #################################################################  
  11.          #################################################################  
  12.          #################################################################  
  13.          #################################################################  
  14.          #################################################################  
  15.          #################################################################  
  16.          ##########################  
  17. done  
  18. Bytes transferred = 2459200 (258640 hex)  

 使用bootm启动linux后会在下面输出信息处停下(要注意的是完成此步骤后务必要手工关闭该minicom会话,因为gdb远程连接时也需要此串口)等待gdb的连接:        

[plain]  view plain copy
  1. Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled  
  2. serial8250.0: ttyS0 at MMIO 0x4806a000 (irq = 72) is a ST16654  
  3. console [ttyS0] enabled  #by guoingbo  
  4. serial8250.1: ttyS1 at MMIO 0x4806c000 (irq = 73) is a ST16654  
  5. serial8250.2: ttyS2 at MMIO 0x49020000 (irq = 74) is a ST16654  
  6. kgdb: Registered I/O driver kgdboc.  
  7. kgdb: Waiting for connection from remote gdb...  

截图来说明一下:


五、使用gdb调试vmlinux文件。使用前述博文在ubuntu10.04成功移植gdbserver及gdbserver使用介绍(用于CCSV5.2远程调试ARM CORTEX-A8程序)移植的 arm-none-linux-gnueabi-gdb进行调试内核文件vmlinux。方法如下

             在linux内核源码根目录下创建一个.gdbinit文件其内容为            

[plain]  view plain copy
  1. set remotebaud 115200  
  2. target remote /dev/ttyS1  

           然后同样在Linux内核源码目录下运行如下命令

             arm-none-linux-gnueabi-gdb ./vmlinux

           不出意外的会有如下信息输出则说明已经连接成功,可以像gdb调试应用程序一样调试linux内核了      

[plain]  view plain copy
  1. Reading symbols from /home/ss/develop_environment/v2/sys/dvsdk/ti-dvsdk_dm3730-evm_4_02_00_06/psp/linux-2.6.32-psp03.00.01.06.sdk/vmlinux...done.  
  2. During symbol reading, DW_AT_name missing from DW_TAG_base_type.  
  3. During symbol reading, unsupported tag: 'DW_TAG_const_type'.  
  4. During symbol reading, Child DIE 0x408b33 and its abstract origin 0x4085ee have different parents.  
  5. During symbol reading, DW_AT_type missing from DW_TAG_subrange_type.  
  6. kgdb_breakpoint () at kernel/kgdb.c:1744  
  7. 1744            arch_kgdb_breakpoint();  
  8. (gdb)   

截图:


六、若用DDD图形界面调试四个步骤相同,只需第五步中的命令换成

   ddd --debugger arm-none-linux-gnueabi-gdb ./vmlinux  命令即可


                                                           DDD调试内核的界面

这篇关于【转】在单板上通过串口调试内核的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609988

相关文章

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe

IDEA配置Tomcat远程调试

因为不想把本地的Tomcat配置改乱或者多人开发项目想测试,本文主要是记录一下,IDEA使用Tomcat远程调试的配置过程,免得一段时间不去配置到时候忘记(毕竟这次是因为忘了,所以才打算记录的…) 首先在catalina.sh添加以下内容 JAVA_OPTS="-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W+,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人  Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全:1000个热

407串口01发送

实验一: 工程。 链接:https://pan.baidu.com/s/1g8DV4yZWOix0BbcZ08LYDQ?pwd=2176 提取码:2176 串口1的使用。发送功能。 单片机发送信息到电脑。 通过串口进行通信。 首先单片机这边。 单片机这边,需要对单片机的串口模块进行使能初始化,设置串口的格式。 单片机和电脑的串口收发格式要配置一致。不然A和B肯定通信不成功,鸡和鸭讲,

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter 今年5月份GreenPlum官方将GitHub仓库代码全部删除,各个分支的issues和bugs讨论等信息全部清除,仅将master分支代码进行归档。对于国内应用GPDB的用户来说,这是一个挑战性事件,对与后期维护、升级等都变得非常困难。有幸HashData开源了基于GP衍生版本CloudberryDB版本,

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

xilinx FPGA 串口设计笔记

xilinx FPGA  串口设计笔记 在设计中,需要用 FPGA 读取 GPS 内部的信息,GPS 的通信方式为串口,所以在 FPGA 中移植了串口程序。 本次移植的程序源代码是特权的串口程序,本以为移植应该很快就能完成, 但其中还是 出了一写小问题,耽误了不少的时间,下面将问题进行一个总结! 以下是串口的时序: 在设计中,耽误时间最长的问题就是数据老是出错,为了找出问题

Chromium 调试指南2024 - 远程开发(下)

1. 引言 在《Chromium 调试指南2024 - 远程开发(上)》中,我们探讨了远程开发的基本概念、优势以及如何选择合适的远程开发模式。掌握了这些基础知识后,接下来我们将深入了解如何在远程环境中高效地进行Chromium项目的调试工作。 调试是开发过程中至关重要的一环,特别是对于像Chromium这样复杂的大型项目。远程调试不仅可以充分利用远程服务器的强大计算资源,还能确保开发环境的一致

使用 devtool 本地调试 nodejs

安装 # 全局安装$ npm install devtool -g# 或临时安装$ npx devtool [file] [opts] 用法 Usage:devtool [入口文件] [opts]Options:--watch, -w enable file watching (for development) # 动态检测文件变更,不用每次手动重启--qui