目录

linux-STM32F开发㈢-在线调试工具CGDB

一、前言

GDB(GNU symbolic debugger)是 Linux 平台下使用最多的一款调试器,常用命令虽不多,但操作起来真心不方便。操作不方便、代码不能高亮、不能边看代码边调试,这几点应该是造成很多人不愿意长期使用的原因(后来集成 TUI 模式有所改善,在调试窗口按Ctrl+X+A进入/退出 TUI 模式)。CGDB 可以看作 GDB 的界面增强版,用来替代 GDB 的 gdb-tui。CGDB 主要功能是在调试时进行代码的同步显示,这无疑增加了调试的方便性,提高了调试效率。由于界面类似 vi,符合 unix/linux 下开发人员习惯,所以如果熟悉 gdb 和 vi,几乎可以立即使用 CGDB。

二、安装

1、arm-none-eabi-gdb 的安装

arm-none-eabi-gcc(包含 arm-none-eabi-gdb)为 ARM 框架、无供应商、无系统、嵌入式二进制接口的交叉编译器,一般适合 ARM7、Cortex-M、Cortex-R 内核的芯片使用,它使用的是 newlib 这个专用于嵌入式系统的 C 库,用于编译裸机程序(u-boot、kernel、单片机程序),但是不能编译 Linux 应用程序。注意:交叉编译器目前都是 32 位执行程序,依赖 32 位库,事前需要安装 ia32-libs(网文)或 lsb-core。进入网页选择你需要的版本下载:官网最新版官网 2021 版Ubuntu-launchpad 软件开发者平台 及依赖 lsb-core。补充:关于 Windows 版本,为直接安装文件,双击安装即可,还有安装后需要手工加入环境变量【如图】。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
######################################
# 一、安装较新版本的 arm-none-eabi-gcc
######################################
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2  # 下载交叉编译器压缩包
sudo tar -xjvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /usr/lib/gcc  # 将交叉编译器压缩包解压到:/usr/lib/gcc
sudo gedit /etc/profile              # 打开环境变量,在文件最后添加内容:export PATH=$PATH:/usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin
source /etc/profile                  # 使能环境变量。
sudo apt-get install lsb-core        # 64位操作系统需要安装32位依赖库:lsb-core     (arm-none-eabi-gcc 用到)
sudo apt-get install lib32ncurses5   # 64位操作系统需要安装32位依赖库:lib32ncurses5(arm-none-eabi-gdb 用到)
arm-none-eabi-gcc -v                 # 查看版本(验证是否安装成功)
arm-none-eabi-gdb --version          # 查看版本(验证是否安装成功)

######################################
# 二、arm-none-eabi-gcc 多版本处理方法
######################################
#####加gcc版本优先级方法#####           # 注意要把之前在环境变量加入的软件执行文件路径移除,否则可能会冲突!
sudo update-alternatives --install /usr/bin/arm-none-eabi-gcc arm-none-eabi-gcc /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc   999  --slave /usr/bin/arm-none-eabi-addr2line arm-none-eabi-addr2line /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-addr2line    --slave /usr/bin/arm-none-eabi-ar arm-none-eabi-ar /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-ar    --slave /usr/bin/arm-none-eabi-as arm-none-eabi-as /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-as    --slave /usr/bin/arm-none-eabi-c++ arm-none-eabi-c++ /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-c++    --slave /usr/bin/arm-none-eabi-c++filt arm-none-eabi-c++filt /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-c++filt    --slave /usr/bin/arm-none-eabi-cpp arm-none-eabi-cpp /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-cpp    --slave /usr/bin/arm-none-eabi-elfedit arm-none-eabi-elfedit /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-elfedit    --slave /usr/bin/arm-none-eabi-g++ arm-none-eabi-g++ /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-g++    --slave /usr/bin/arm-none-eabi-gcc-ar arm-none-eabi-gcc-ar /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc-ar    --slave /usr/bin/arm-none-eabi-gcc-nm arm-none-eabi-gcc-nm /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc-nm    --slave /usr/bin/arm-none-eabi-gcc-ranlib arm-none-eabi-gcc-ranlib /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc-ranlib    --slave /usr/bin/arm-none-eabi-gcov arm-none-eabi-gcov /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcov    --slave /usr/bin/arm-none-eabi-gcov-tool arm-none-eabi-gcov-tool /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcov-tool    --slave /usr/bin/arm-none-eabi-gdb arm-none-eabi-gdb /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb    --slave /usr/bin/arm-none-eabi-gdb-py arm-none-eabi-gdb-py /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb-py    --slave /usr/bin/arm-none-eabi-gprof arm-none-eabi-gprof /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gprof    --slave /usr/bin/arm-none-eabi-ld arm-none-eabi-ld /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-ld    --slave /usr/bin/arm-none-eabi-ld.bfd arm-none-eabi-ld.bfd /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-ld.bfd    --slave /usr/bin/arm-none-eabi-nm arm-none-eabi-nm /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-nm    --slave /usr/bin/arm-none-eabi-objcopy arm-none-eabi-objcopy /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-objcopy    --slave /usr/bin/arm-none-eabi-objdump arm-none-eabi-objdump /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-objdump    --slave /usr/bin/arm-none-eabi-ranlib arm-none-eabi-ranlib /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-ranlib    --slave /usr/bin/arm-none-eabi-readelf arm-none-eabi-readelf /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-readelf    --slave /usr/bin/arm-none-eabi-size arm-none-eabi-size /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-size    --slave /usr/bin/arm-none-eabi-strings arm-none-eabi-strings /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-strings    --slave /usr/bin/arm-none-eabi-strip arm-none-eabi-strip /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-strip
                                     # 配置arm-none-eabi-gcc 05.4版的优先级(目前处理了27个软件:arm-none-eabi-gcc、arm-none-eabi-ar、arm-none-eabi-ld、arm-none-eabi-size、arm-none-eabi-objcopy、……)
sudo update-alternatives --install /usr/bin/arm-none-eabi-gcc arm-none-eabi-gcc /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc 103  --slave /usr/bin/arm-none-eabi-addr2line arm-none-eabi-addr2line /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-addr2line  --slave /usr/bin/arm-none-eabi-ar arm-none-eabi-ar /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-ar  --slave /usr/bin/arm-none-eabi-as arm-none-eabi-as /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-as  --slave /usr/bin/arm-none-eabi-c++ arm-none-eabi-c++ /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-c++  --slave /usr/bin/arm-none-eabi-c++filt arm-none-eabi-c++filt /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-c++filt  --slave /usr/bin/arm-none-eabi-cpp arm-none-eabi-cpp /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-cpp  --slave /usr/bin/arm-none-eabi-elfedit arm-none-eabi-elfedit /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-elfedit  --slave /usr/bin/arm-none-eabi-g++ arm-none-eabi-g++ /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-g++  --slave /usr/bin/arm-none-eabi-gcc-ar arm-none-eabi-gcc-ar /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc-ar  --slave /usr/bin/arm-none-eabi-gcc-nm arm-none-eabi-gcc-nm /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc-nm  --slave /usr/bin/arm-none-eabi-gcc-ranlib arm-none-eabi-gcc-ranlib /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc-ranlib  --slave /usr/bin/arm-none-eabi-gcov arm-none-eabi-gcov /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcov  --slave /usr/bin/arm-none-eabi-gcov-tool arm-none-eabi-gcov-tool /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcov-tool  --slave /usr/bin/arm-none-eabi-gdb arm-none-eabi-gdb /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb  --slave /usr/bin/arm-none-eabi-gdb-py arm-none-eabi-gdb-py /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb-py  --slave /usr/bin/arm-none-eabi-gprof arm-none-eabi-gprof /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gprof  --slave /usr/bin/arm-none-eabi-ld arm-none-eabi-ld /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-ld  --slave /usr/bin/arm-none-eabi-ld.bfd arm-none-eabi-ld.bfd /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-ld.bfd  --slave /usr/bin/arm-none-eabi-nm arm-none-eabi-nm /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-nm  --slave /usr/bin/arm-none-eabi-objcopy arm-none-eabi-objcopy /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-objcopy  --slave /usr/bin/arm-none-eabi-objdump arm-none-eabi-objdump /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-objdump  --slave /usr/bin/arm-none-eabi-ranlib arm-none-eabi-ranlib /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-ranlib  --slave /usr/bin/arm-none-eabi-readelf arm-none-eabi-readelf /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-readelf  --slave /usr/bin/arm-none-eabi-size arm-none-eabi-size /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-size  --slave /usr/bin/arm-none-eabi-strings arm-none-eabi-strings /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-strings  --slave /usr/bin/arm-none-eabi-strip arm-none-eabi-strip /usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-strip
                                     # 配置arm-none-eabi-gcc 10.3版的优先级(目前处理了27个软件:arm-none-eabi-gcc、arm-none-eabi-ar、arm-none-eabi-ld、arm-none-eabi-size、arm-none-eabi-objcopy、……)
#####选择gcc工作版本方法#####
sudo update-alternatives --config arm-none-eabi-gcc
                                     # 选择arm-none-eabi-gcc工作版本,根据界面提示输入对应数字+回车选择
#####移除gcc某优先级方法#####
sudo update-alternatives --remove arm-none-eabi-gcc /usr/lib/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc
                                     # 移除arm-none-eabi-gcc 05.4版的优先级(将从优先级列表中移除)

2、CGDB 的安装

CGDB 可以看作 GDB 的界面增强版(其参考了 GDB TUI 设计和实现),分上下两屏,【上屏】代码区的界面模仿了 Unix 经典的文本编辑器界面:vi,【下屏】还是 GDB 的命令窗口,所以如果熟悉 vi 和 gdb,几乎可以立即使用 CGDB。官方提供源码编译安装方式,用户到 官网github 下载源码,然后自己编译并安装程序。资料:CGDB 中文手册

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
######################################
# 一、安装相关依赖软件
######################################
sudo apt install autoconf            # 安装 autotools 系列工具,包括:autoconf,automake,aclocal,autoheader,autoscan
sudo apt install libtool-bin         # 安装 libtool 工具
sudo apt install bison               # 安装 bison 工具
sudo apt install flex                # 安装 flex 工具
sudo apt install texinfo             # 安装依赖
sudo apt install libreadline6        # 安装依赖
sudo apt install libreadline6-dev    # 安装依赖
sudo apt install libreadline-dev     # 安装依赖
sudo apt install libncurses5-dev     # 安装依赖
sudo apt install libncursesw5-dev    # 安装依赖

######################################
# 二、下载、编译、安装
######################################
git clone https://github.com/cgdb/cgdb.git  # 下载(使用git工具克隆仓库)
cd cgdb                              # 进入文件夹
./autogen.sh                         # 自动生成配置(文件)(前提需要安装依赖:sudo apt-get install autoconf automake libtool-bin)
./configure --prefix=/usr/local/cgdb # 手工修改配置,并设置安装目录
sudo gedit /etc/profile              # 打开环境变量,在文件最后添加内容:export PATH=$PATH:/usr/local/cgdb/bin
source /etc/profile                  # 使能环境变量。
make                                 # 编译CGDB软件
sudo make install                    # 安装CGDB软件
cgdb --version                       # 查看CGDB版本(验证是否安装成功)

3、AutoTools 的介绍

当你有下载过流行的软件项目的源代码,安装方法几乎都是仪式般的【./configure; make && make install】命令序列来构建和安装它!如果是这样,你已经使用过 GNU Autotools 工具了。很多 GNU Linux 的软件都是用它生成 Makefile 的,包括我们非常熟悉的 Linux 内核源代码。编写 Makefile 确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。AutoTools 系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成 Makefile 了。有网文这样形容:“GNU Autotools 的设置要比你想象的要简单得多,GNU Autotools 本身可以为你生成这些上千行的配置文件。是的,你可以编写 20 或 30 行安装代码,并免费获得其他 4,000 行。”

三、使用

■【使用的演示工程说明】■

本案例为基于【5_rt-thread】演示工程(工程路径:5_rt-thread/bsp/stm32/stm32f103-atk-warshipv3),烧录/调试前要对工程进行编译(编译记得加-g选项 ),最终生成固件及调试文件!【特别说明】:因 CGDB(v0.8.0)要求 GDB(arm-none-eabi-gdb) 版本≥7.12,但使用 arm-none-eabi-gcc 10.3 编译时出现编译器与 rt-thread V4.0.3 操作系统有几个宏名称相同的错误!目前处理方法:编译使用 arm-none-eabi-gcc 5.4 旧版来编译,调试使用 arm-none-eabi-gcc 10.3 新版来调试!备注:选择 arm-none-eabi-gcc 工作版本请看上面章节!


1、arm-none-eabi-gdb 的基本使用
1.1、第一步:在命令窗口启动 OpenOCD 服务

前提条件:

../img/20220808_3_131.jpg

输入命令:

1
sudo openocd -f interface/jlink_swd.cfg -f target/stm32f1x.cfg  # 配置文件完整路径:/usr/local/share/openocd/scripts/ 下的 interface/stlink-v2.cfg 和 target/stm32f1x.cfg

结果如下:

../img/20220808_3_22.jpg

备注-1:启动 gdb 对 C/C++ 程序的调试,必须要在编译前就加上 -g 选项!
备注-2:在 Windows 系统下,j-link 的原厂应用驱动软件,也提供 GDB 对接服务,直接打开【J-Link GDB Server】可视界面操作即可!

1.2、第二步:在另一命令窗口运行 GDB 调试
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
##############################################
# ①、在 shell 命令窗口运行
##############################################
# 1.1、运行 gdb
arm-none-eabi-gdb ./build/gcc/rt-thread.elf

##############################################
# ②、在 gdb 命令窗口运行(输入命令后回车)
##############################################
# 2.0、修改 gdb 本次连接超时时间(防止openocd与仿真器速度低造成超时)
set remotetimeout 60             #修改超时时间
#show remotetimeout              #查看超时时间

# 2.1、连接 openocd
target remote localhost:3333

# 2.2、复位并暂停处理器(monitor表示向外部服务传送命令)
monitor reset halt

# 2.3、下载固件(实测无需复位暂停处理器直接load也可以)
load

# 2.4、设置临时断点(main函数)
tb main

# 2.5、运行程序
c

运行结果:

../img/20220916_3_121.jpg
../img/20220916_3_122.jpg


2、CGDB 的基本使用
2.1、第一步:查看 arm-none-eabi-gdb 版本
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 查看版本,用于验证其是否可正常工作
arm-none-eabi-gdb --version  # CGDB(v0.8.0)要求 gdb 版本≥7.12

##############################################
# 出现问题:提示信息显示找不到 libncurses.so.5
##############################################
arm-none-eabi-gdb: error while loading shared 
libraries: libncurses.so.5: cannot open shared 
object file: No such file or directory

##############################################
# 解决方法:安装所需32位依赖库 lib32ncurses5 !
##############################################
sudo apt-get install lib32ncurses5

备注-1:启动 gdb 对 C/C++ 程序的调试,必须要在编译前就加上 -g 选项!
备注-2:CGDB(v0.8.0)要调用 arm-none-eabi-gdb,要求 gdb 的版本必须大于等于 7.12

2.2、第二步:在命令窗口启动 OpenOCD 服务

前提条件:

../img/20220808_3_131.jpg

输入命令:

1
sudo openocd -f interface/jlink_swd.cfg -f target/stm32f1x.cfg  # 配置文件完整路径:/usr/local/share/openocd/scripts/ 下的 interface/jlink_swd.cfg 和 target/stm32f1x.cfg

结果如下:

../img/20220808_3_22.jpg

2.3、第三步:在另一命令窗口运行 CGDB 调试
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
##############################################
# ①、在 shell 命令窗口运行
##############################################
# 1.1、运行 cgdb
cgdb -d arm-none-eabi-gdb ./build/gcc/rt-thread.elf

##############################################
# ②、在 cgdb 命令窗口运行(输入命令后回车)
##############################################
# 2.0、修改 gdb 本次连接超时时间(防止openocd与仿真器速度低造成超时)
set remotetimeout 60             #修改超时时间
#show remotetimeout              #查看超时时间

# 2.1、连接 openocd
target remote localhost:3333

# 2.2、复位并暂停处理器(monitor表示向外部服务传送命令)
monitor reset halt

# 2.3、下载固件(实测无需复位暂停处理器直接load也可以)
load

# 2.4、设置临时断点(main函数)
tb main

# 2.5、运行程序
c

运行结果:

../img/20220916_3_231.jpg
../img/20220916_3_232.jpg

备注-1:启动 gdb 对 C/C++ 程序的调试,必须要在编译前就加上 -g 选项!
备注-2:CGDB(v0.8.0)要调用 arm-none-eabi-gdb,要求 gdb 的版本必须大于等于 7.12


3、CGDB/OpenOCD 使用总结
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
########连接USB ########
虚拟机/可移动设备/SEGGER J-Link/连接

########下载固件########
sudo openocd -f interface/jlink_swd.cfg -f target/stm32f1x.cfg -c init -c "reset halt; wait_halt; flash write_image erase out/project.hex" -c reset -c shutdown
                                                   # 备注:/usr/local/share/openocd/scripts/ 下的 interface/jlink_swd.cfg 和 target/stm32f1x.cfg
#(1)####调试程序########      #【在一个命令窗口启动openocd服务】    # 备注:编译要加[-g]选项!
sudo openocd -f interface/jlink_swd.cfg -f target/stm32f1x.cfg
#(2)                      #【在另一命令窗口启动cgdb+gdb服务】
cgdb -d arm-none-eabi-gdb ./build/gcc/rt-thread.elf   #(也可先运行命令 cgdb -d arm-none-eabi-gdb 进入gdb后再运行命令 file ./build/gcc/rt-thread.elf 装载调试文件)
set remotetimeout 60         # 在cgdb里:修改gdb本次连接超时时间(防止openocd与仿真器速度低造成超时)
target remote localhost:3333 # 在cgdb里:连接openocd服务(但会提示:首选GDB命令为 target extended-remote localhost:3333 而不是 target remote localhost:3333)
monitor reset halt           # 在cgdb里:复位并暂停处理器(monitor表示向外部服务传送命令)
load                         # 在cgdb里:装载调试固件(实测无需复位暂停处理器直接load也可以)
tb main                      # 在cgdb里:在main函数设置临时断点
c                            # 在cgdb里:运行程序(可用 ctrl+c 强制退出运行,暂停运行时可 monitor reset halt 复位程序,再 c 运行程序)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
########一键调试########      #【适合Makefile里执行“一键调试”】    # 注意:要事先处理libusb的操作权限!具体请查看上一篇《linux-STM32F开发㈡-调试器的安装与使用》
cgdb -d arm-none-eabi-gdb \
-ex  'set remotetimeout 60' \
-iex 'target extended-remote | openocd -c "gdb_port pipe" -f "interface/jlink_swd.cfg" -f "target/stm32f1x.cfg"' \
-ex  'monitor sleep 1000' \
-ex  'monitor reset halt' \
-ex  'monitor sleep 1000' \
-ex  'file ../build/gcc/rt-thread.elf' \
-ex  'load' \
-ex  'tb main' \
-ex  'c'
3.1、GDB 常用命令
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
c                #【运行程序】继续运行程序
s                #【运行程序】单步运行(会进入子函数)
n                #【运行程序】单步运行(不进入子函数)
finish           #【运行函数】完成运行并跳出当前函数
l 100            #【查看文件】指定当前运行文件行号查看
l max.c:5        #【查看文件】指定文件行号查看
l                #【查看文件】继续向下查看文件
b  100           #【设置断点】指定当前运行文件行号断点(注意:当前文件是指程序暂停运行所在的文件!)
b  main          #【设置断点】指定函数断点
tb 100           #【临时断点】指定当前运行文件行号断点(注意:当前文件是指程序暂停运行所在的文件!)
tb main          #【临时断点】指定函数断点
u  100           #【运行到行】运行到当前文件指定行断点(注意:当前文件是指程序暂停运行所在的文件!)
watch i>9        #【条件断点】不固定位置的变量条件断点  (只能设置全局变量)
rwatch i         #【条件断点】不固定位置的读变量条件断点 (只能设置全局变量)
awatch i         #【条件断点】不固定位置的读写变量条件断点(只能设置全局变量)
clear            #【清除断点】清除当前程序所在的断点
clear main       #【清除断点】清除某个指定函数断点
d                #【删除断点】所有断点
d 2              #【删除断点】删除某个指定编号的断点  (备注:需要 i b 查看断点编号来配合使用!)
d display 2      #【删除显示】删除某个指定编号的变量显示(备注:需要 i display 查看变量编号来配合使用!)
i b              #【查看断点】查看断点信息(查看使用 break   设置的断点)
i display        #【查看信息】查看变量信息(查看使用 display 显示的变量)
i locals         #【查看信息】查看当前函数所有局部变量值(注意:当前函数是指程序暂停运行所在的函数!)
display cnt      #【查看变量】查看变量信息(默认显示格式显示)【程序运行到暂停后会自动显示】
p i=1            #【变量赋值】给变量赋值 (支持局部变量操作)
p cnt            #【查看变量】查看变量信息(默认显示格式显示)(支持局部变量操作)
ptype i          #【查看变量】查看变量类型(普通变量)(可查看程序暂停运行所在函数的局部变量)
x/3xb 0x8003000  #【查看数据】查看[0x8003000]起始地址的数据(数量:3个单元,格式:十六进制,单元大小:1字节)
x/3uh buf        #【查看数据】查看[buf]变量内存数据  (数量:3个单元,格式:无符号十进制,单元大小:2字节)
bt               #【查看调用】查看函数调用栈信息
help info        #【查看帮助】查看info命令帮助

更多命令请查看《linux-调试-linux 调试仿真工具》的【使用】章节!


三、扩展

1、IDE 集成开发环境的组成
组件
说明
代码编辑工具 IDE 直接使用 QScitinal 这类的编辑器库
代码智能提示 IDE 后台调用 clang 工具
语法错误检测 IDE 后台调用 gcc 或者 clang 对代码语法错误动态检测
工程文件组织 IDE 使用的是 makefile,后台调用 make 工具
编译 IDE 后台调用 gcc 或者 clang 编译器编译
调试器 IDE 后台调用 OpenOCD 连接调试器和板子
下载 IDE 后台调用 OpenOCD 命令下载固件
调试 IDE 后台调用 gdb,给 gdb 发命令,gdb 再给 OpenOCD 发命令,OpenOCD 再指挥调试器控制板子。实现单步执行,查看变量值,寄存器等

2、CGDB/GDB 应用及命令知识

linux-调试-linux 调试仿真工具