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

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

相关文章

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Python MCPInspector调试思路详解

《PythonMCPInspector调试思路详解》:本文主要介绍PythonMCPInspector调试思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录python-MCPInspector调试1-核心知识点2-思路整理1-核心思路2-核心代码3-参考网址

Linux系统调试之ltrace工具使用与调试过程

《Linux系统调试之ltrace工具使用与调试过程》:本文主要介绍Linux系统调试之ltrace工具使用与调试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、ltrace 定义与作用二、ltrace 工作原理1. 劫持进程的 PLT/GOT 表2. 重定

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.