Tronlong创龙 发表于 2023-6-12 16:43

嵌入式知识分享——GDB程序调试方法说明

前言本案例开发环境:Windows开发环境:Windows 7 64bit、Windows 10 64bitLinux开发环境:Ubuntu 18.04.4 64bit虚拟机:VMware15.1.0U-Boot:U-Boot-2020.04Kernel:Linux-5.4.70Linux SDK:5.4.70_2.3.0GDB工具是GNU项目调试器,基于命令行使用。和其他的调试器一样,可使用GDB工具单步运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是UNIX/LINUX操作系统下强大的程序调试工具。GDB支持多种语言,包括Ada、汇编、C/C++、D、Fortran、GO、Objective-C、OpenCL、Modula-2、Pascal和Rust。GDB具有一种“远程”模式,此种模式多半是在为嵌入式系统进行调试时使用,远程操作指的是:GDB在一部机器内运行,而要进行调试的程序是在另一部机器上运行,支持TCP/IP协议传输的各种网络,在TCP/IP网络及协议上再加搭传输GDB专有的调试操作通信协议,如此便能进行远程调试。本案例采用的评估版为创龙科技TLIMX6U-EVM,它是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。评估板接口资源丰富,引出双路网口、双路RS485、双路CAN、三路USB、多路DI/DO、LCD等接口,板载WIFI、Bluetooth模块,支持LoRa、NB-IoT、Zigbee、4G模块,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。正面外观: 1 演示程序创建与编译在Ubuntu工作目录下执行如下命令,新建一个GDB调试演示程序。Host#    mkdir testHost#    cd test/Host#    vi test.c 图 1
#include <stdio.h>void show() {    printf("show\n");}int main(int argc, char *argv[]){    int arr = {1, 2, 3, 4};    int i = 0;    for (i = 0; i < 4; i++) {      printf("arr[%d]: %d\n", i, arr);    }    show();    return 0;} 执行如下命令,使能Linux SDK环境变量,进行程序编译,编译完成将会生成test可执行程序。备注:编译时需添加-g参数,生成的可执行文件才带有调试信息。Host#    source /home/tronlong/SDK/environment-setup-cortexa7t2hf-neon-poky-linux-gnueabiHost#    $CC -O0 -g test.c -o test
https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937268-1901890674.png 图 2
评估板与PC机连接至同一个路由器后进行上电,将编译后的可执行文件test拷贝至评估板文件系统任意目录下。Target#      ls https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937117-789699140.png图 3
2 调试程序运行执行如下命令,查看虚拟机的IP地址。Host#    ifconfighttps://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937292-955965239.png 图 4

在评估板文件系统test文件所在路径下,执行如下命令运行gdbserver程序,开启监听。备注:192.168.0.143为虚拟机的IP地址;1234为连接的端口号(自行设置);test为将要进行调试的程序。Target#      gdbserver 192.168.0.143:1234 testhttps://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937142-265195561.png 图 5
在虚拟机test文件所在路径下,执行如下命令使能Linux SDK环境变量并运行GDB调试程序。Host#    source /home/tronlong/SDK/environment-setup-cortexa7t2hf-neon-poky-linux-gnueabiHost#    arm-poky-linux-gnueabi-gdbtesthttps://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937283-1421885781.png 图 6
执行如下命令,连接评估板。192.168.1.251为评估板的IP地址,请以实际情况为准。(gdb)   target remote 192.168.1.251:1234 https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937316-1177782360.png图 7
同时,串口调试终端显示连接成功的相关信息。https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937150-963129696.png 图 8
3 程序调试本章节主要演示GDB调试的几个常用命令的使用方法。3.1    list命令用于列出源码,简写:l。 图 9
3.2    break命令用于设置断点,简写:b。分别在main函数和第10行设置断点。https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937226-856515047.png 图 10
3.3    info breakpoints命令用于显示断点的状态,简写:info b。https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937240-293743575.png 图 11
3.4    continue命令用于恢复程序执行,简写:c。此命令使GDB恢复程序的执行,直至断点触发或程序结束。https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937283-1424836776.png 图 12
以上调试过程在第二个断点中,每输入一次c命令,将会依次打印arr[]数组的元素值,然后程序执行结束。同时,串口调试终端打印相关信息。 https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937233-243867347.png图 13
3.5    print命令用于打印变量或者变量地址,简写:p。设置断点后,可依次打印当前变量i的值。https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937381-759572182.png 图 14

https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937240-746614298.png图 15
以上调试过程在每处断点中,使用print命令打印变量i的值。同时,串口调试终端打印相关信息。 https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937245-1078541717.png图 16
3.6    quit命令退出GDB模式,简写:q。当程序调试完成后,使用quit命令退出GDB调试。https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937167-1268391313.png 图 17

同时,串口调试终端打印相关信息。 https://img2023.cnblogs.com/blog/2812951/202306/2812951-20230606161937252-1061173023.png图 18


更多嵌入式应用的相关知识,欢迎关注Tronlong创龙科技~

页: [1]
查看完整版本: 嵌入式知识分享——GDB程序调试方法说明