一、前言
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 服务
前提条件:
输入命令:
1
|
sudo openocd -f interface/jlink_swd.cfg -f target/stm32f1x.cfg # 配置文件完整路径:/usr/local/share/openocd/scripts/ 下的 interface/stlink-v2.cfg 和 target/stm32f1x.cfg
|
结果如下:
备注-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
|
运行结果:
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 服务
前提条件:
输入命令:
1
|
sudo openocd -f interface/jlink_swd.cfg -f target/stm32f1x.cfg # 配置文件完整路径:/usr/local/share/openocd/scripts/ 下的 interface/jlink_swd.cfg 和 target/stm32f1x.cfg
|
结果如下:
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
|
运行结果:
备注-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 调试仿真工具》