一、前言
GDB(GNU symbolic debugger)是 Linux 平台下使用最多的一款调试器,常用命令虽不多,但操作起来真心不方便。操作不方便、代码不能高亮、不能边看代码边调试,这几点应该是造成很多人不愿意长期使用的原因(后来集成 TUI 模式有所改善,在调试窗口按Ctrl+X+A
进入/退出 TUI 模式)。CGDB 可以看作 GDB 的界面增强版,用来替代 GDB 的 gdb-tui。CGDB 主要功能是在调试时进行代码的同步显示,这无疑增加了调试的方便性,提高了调试效率。由于界面类似 vi,符合 unix/linux 下开发人员习惯,所以如果熟悉 gdb 和 vi,几乎可以立即使用 CGDB。除此之外,还有更强更好用的 GDB 前端软件(如:Emacs GDB),具体请参考网文:《Linux 终端调试大全》,其转自 《终端调试哪家强》。
二、安装
1、GDB 的安装
GDB(GNU symbolic debugger)是 Linux 平台下使用最多的一款调试器,是 GNU 开源组织发布的一个强大的 Linux 下的程序调试工具,除支持 c/c++ 语言外还支持 go、D、object-c、fortran 等语言调试。资料:GNU 官网、GDB 主页、GDB 官网下载。
1.1、linux 系统下安装:
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
32
|
##########################################
# 安装:直接下载最新版安装
##########################################
wget http://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.gz # 下载gdb软件
tar -xzvf gdb-12.1.tar.gz # 解压文件
cd gdb-12.1 # 进入文件夹
./configure --prefix=/usr/local/gdb-12.1 # 手工修改配置,并设置安装目录
sudo gedit /etc/profile # 打开环境变量,在文件最后添加内容:export PATH=$PATH:/usr/local/gdb-12.1/bin
source /etc/profile # 使能环境变量。
sudo apt-get install texinfo # 安装依赖工具。(有些网文提到还要安装另一依赖:https://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz)
sudo apt-get install libgmp-dev # 安装依赖工具。(官网:https://gmplib.org/)
make # 编译GDB软件,
sudo make install # 安装GDB软件。
gdb --version # 查看GDB版本。(验证是否安装成功)
##########################################
# 处理:多版本共存处理方法
##########################################
#####首先修改软件名称#####
sudo mv /usr/bin/gdb /usr/bin/gdb-old # 旧版gdb改名 (因将要创建gdb 的快捷方式处于同名同路径下,所以旧版本必须要改名)
sudo mv /usr/bin/gdbserver /usr/bin/gdbserver-old # 旧版gdbserver改名(因将要创建gdbserver的快捷方式处于同名同路径下,所以旧版本必须要改名)
#####加版本优先级方法##### # 注意要把之前在环境变量加入的软件执行文件路径移除,否则可能会冲突!
sudo update-alternatives --install /usr/bin/gdb gdb /usr/bin/gdb-old 999 --slave /usr/bin/gdbserver gdbserver /usr/bin/gdbserver-old
sudo update-alternatives --install /usr/bin/gdb gdb /usr/local/gdb-12.1/bin/gdb 121 --slave /usr/bin/gdbserver gdbserver /usr/local/gdb-12.1/bin/gdbserver
#####选择工作版本方法#####
sudo update-alternatives --config gdb # 选择gdb工作版本,根据界面提示输入对应数字+回车选择
# ● 原理只是快捷方式链接不同对象 ●
#####移除某优先级方法#####
sudo update-alternatives --remove gdb /usr/local/gdb-12.1/bin/gdb
# 移除gdb-12.1版的优先级(将从优先级列表中移除)
|
1.2、安装出错问题记录:
1.2.1、编译 gdb-12.1 提示的错误
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_large】工程来演示,同时已将 CGDB/GDB 调试启动命令加到工程 Makefile 里,事前先配置父 Makefile 中的DEBUG = 1
,再编译生成执行文件后,最后直接运行make debug
即可启动 CGDB/GDB 调试。特别说明:一、使用 CGDB/GDB 调试程序,在编译时必须增加-g
选项参数,否则只能汇编调试而无法源码调试!二、CGDB(v0.8.0)要求 GDB 版本≥7.12(如果 GDB 过低,CGDB 调用 GDB 时会抛出错误)!
1、CGDB/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
32
33
34
35
36
37
38
39
40
41
|
#########【方式一】#########
cgdb -d gdb ./build/objs/app.exe # 启动cgdb+gdb,并装载调试文件(嵌入式调试文件为 xxx.elf)
tb main # 在gdb里:在main函数设置临时断点
r # 在gdb里:运行程序(如果程序有入口参数,写法如:r ./build/objs/app.exe argv1 argv2)
#【备注】嵌入式 arm-none-eabi-gdb 不能使用 run 指令来运行程序!改用 c 直接运行程序即可!
#########【方式二】#########
cgdb -d gdb # 启动cgdb+gdb
file ./build/objs/app.exe # 在gdb里:装载调试文件(嵌入式调试文件为 xxx.elf)
tb main # 在gdb里:在main函数设置临时断点
r # 在gdb里:运行程序(如果程序有入口参数,写法如:r ./build/objs/app.exe argv1 argv2)
#【备注】嵌入式 arm-none-eabi-gdb 不能使用 run 指令来运行程序!改用 c 直接运行程序即可!
#########【方式三】#########
cgdb -d gdb -x gdb.script # 启动cgdb+gdb,并装载GDB命令脚本文件
# gdb.script 命令脚本文件内容为:
# file ./build/objs/app.exe
# tb main
# r
#########【方式四】#########
cgdb -d gdb -ex 'file ./build/objs/app.exe' -ex 'tb main' -ex 'r'
# 启动cgdb+gdb,并自动在GDB里运行多条命令(适合 makefile 里直接调用命令运行调试)
#【知识扩展】
# -iex 在GDB本体外执行一条命令(如:GDB调试程序前先执行启动openocd服务)
# -ex 在GDB本体内执行一条命令(如:执行一条GDB的r命令)
# -x 从文件获取并运行多条GDB命令
#【嵌入式 arm-none-eabi-gdb 案例】
# 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'
###########################
#【其它应用知识】
###########################
gdb out/app.exe 1234 # 调试已经运行的程序(1234 为 ps aux 命令查看 out/app.exe 程序对应的 PID 数值)
gdb -p 1234 # 同上,忽略执行程序名称
gdb out/app.exe core.9579 # core.9579 为程序异常挂掉时候生成的core文件,我们可以直接对这个core文件进行分析
|
运行结果:
补充:由于 CGDB 启动时调用 GDB 运行,所以 CGDB 与 GDB 启动是一致的。如果想直接运行 GDB,开头命令去除cgdb -d
语句即可,其它命令完全一样(其实都是 GDB 内部命令)!上面介绍几种启动方式,前两种是分多条分多次命令输入执行,如果每次都这样操作,效率会很低,时间久了一些命令可能会忘记了!所以在实际开发中,使用类似“一键”启动方式(方式四),里面的几条命令由脚本调用执行。
2、CGDB/GDB 的退出方法
1
2
3
4
5
6
|
# 1、如果程序正在运行
Ctrl+c键 # 按ctrl+c组合键强制暂停程序
# 2、当程序已暂停运行
Ctrl+d键 # 按ctrl+d组合键退出GDB,
q # 或输入quit命令退出GDB。
# 备注:在CGDB代码窗口输入【:q】也可直接并强制退出!
|
运行结果:
3、CGDB/GDB 的视窗切换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
###########################
# CGDB 视窗切换
###########################
o键 # 打开CGDB文件列表窗口(可查找及打开对应源文件)
q键 # 退出CGDB文件列表窗口
i键 # 切换进入GDB命令视窗
Esc键 # 切换回CGDB代码视窗
Ctrl+[键 # 切换回CGDB代码视窗
-键 # 减小CGDB代码视窗大小(也可使用 _键 快速减小)
=键 # 增大CGDB代码视窗大小(也可使用 +键 快速增大)
###########################
# GDB 视窗切换
###########################(特别说明:在CGDB里不要执行下面命令,有冲突会花屏,且不能关闭)
layout src # 显示源代码窗口 (关闭/重开:ctrl+x+a)
layout asm # 显示汇编代码窗口 (关闭/重开:ctrl+x+a)
layout regs # 显示寄存器窗口 (关闭/重开:ctrl+x+a)
focus src # 将焦点移到源代码窗口 (上下方向键和PageUp/PageDown键浏览内容) (focus /ˈfəʊkəs/)
focus asm # 将焦点移到汇编代码窗口 (上下方向键和PageUp/PageDown键浏览内容)
focus regs # 将焦点移到寄存器窗口 (上下方向键和PageUp/PageDown键浏览内容)
winheight src -5 # 代码窗口減少5行
|
各类窗口:
特别说明:在 CGDB 里不要执行 GDB 视窗切换命令layout
,有冲突会花屏,且不能关闭!
4、CGDB/GDB 的调试操作
4.01、CGDB 类 vi 操作
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
32
|
###########################
# 1、光标操作
###########################
k键 # 向上移动一行
j键 # 向下移动一行
h键 # 向左移动一列
l键 # 向右移动一列
gg键 # 移动到文件顶部
G键 # 移动到文件底部
Ctrl+b键 或 Page Up键 # 向上翻一页
Ctrl+f键 或 Page Down键 # 向下翻一页
Ctrl+u键 # 向上翻半页
Ctrl+d键 # 向下翻半页
###########################
# 2、搜索操作
###########################
/键 # 启动从当前光标处向下搜索(之后输入搜索字符串后按回车,支持正则表达式)
?键 # 启动从当前光标处向上搜索(之后输入搜索字符串后按回车,支持正则表达式)
n键 # 向下继续搜索
N键 # 向上继续搜索
###########################
# 3、调试操作
###########################
F5键 # 运行程序(重新运行程序),即向GDB发送一个run命令
F6键 # 恢复运行(直至遇到断点),即向GDB发送一个continue命令
F7键 # 完成运行并跳出当前函数,即向GDB发送一个finish命令
F8键 # 单步运行(不进入子函数),即向GDB发送一个next命令
F10键 # 单步运行(会进入子函数),即向GDB发送一个step命令
空格键 # 当前行设置(或取消)断点
t键 # 当前行设置(或取消)临时断点
|
4.02、GDB 命令r -------- run
1
2
3
4
5
6
7
8
9
|
####################################
# 命令作用: 运行程序
# 命令简写: r
# 命令全写: run
# 单 词: run
####################################
r #【运行程序】运行程序(以默认/上次方式运行)
run app.exe argv1 argv2 #【运行程序】指定执行文件及参数运行程序
# 特别说明:对于嵌入式 arm-none-eabi-gdb 不能使用 run 指令来运行代码!直接使用 c 运行程序即可。
|
4.03、GDB 命令c -------- continue
1
2
3
4
5
6
7
8
|
####################################
# 命令作用: 继续运行程序
# 命令简写: c
# 命令全写: continue
# 单 词: continue
####################################
c #【运行程序】继续运行程序
# 特别说明:对于嵌入式 arm-none-eabi-gdb 不能使用 run 指令来运行代码!直接使用 c 运行程序即可。
|
4.04、GDB 命令n -------- next
1
2
3
4
5
6
7
|
####################################
# 命令作用: 单步运行【平行运行】
# 命令简写: n
# 命令全写: next
# 单 词: next
####################################
n #【运行程序】单步运行(不进入子函数)
|
4.05、GDB 命令s -------- step
1
2
3
4
5
6
7
|
####################################
# 命令作用: 单步运行【往里运行】
# 命令简写: s
# 命令全写: step
# 单 词: step
####################################
s #【运行程序】单步运行(会进入子函数)
|
4.06、GDB 命令fin ------ finish
1
2
3
4
5
6
7
|
####################################
# 命令作用: 完成函数【往外运行】
# 命令简写: fin
# 命令全写: finish
# 单 词: finish
####################################
fin #【运行函数】完成运行并跳出当前函数
|
4.07、GDB 命令l -------- list
1
2
3
4
5
6
7
8
9
|
####################################
# 命令作用: 查看文件(CGDB 里不要用)
# 命令简写: l
# 命令全写: list
# 单 词: list
####################################
l 100 #【查看文件】指定当前运行文件行号查看
l max.c:5 #【查看文件】指定文件行号查看
l #【查看文件】继续向下查看文件
|
4.08、GDB 命令b -------- break
1
2
3
4
5
6
7
8
9
10
11
|
####################################
# 命令作用: 设置断点【长期断点】
# 命令简写: b
# 命令全写: break
# 单 词: breakpoint
####################################
b 100 #【设置断点】指定当前运行文件行号断点(注意:当前文件是指程序暂停运行所在的文件!)
b max.c:5 #【设置断点】指定文件行号断点
b max.c:maxf #【设置断点】指定文件函数断点
b main #【设置断点】指定函数断点
b 46 if i==10 #【设置断点】指定变量条件断点(只能设置全局变量)(46为断点编号,非行号)
|
4.09、GDB 命令tb-------- tbreak
1
2
3
4
5
6
7
8
9
10
11
|
####################################
# 命令作用: 设置断点【临时断点】
# 命令简写: tb
# 命令全写: tbreak
# 单 词: temporary breakpoint /ˈtemprəri/
####################################
tb 100 #【临时断点】指定当前运行文件行号断点(注意:当前文件是指程序暂停运行所在的文件!)
tb max.c:5 #【临时断点】指定文件行号断点
tb max.c:maxf #【临时断点】指定文件函数断点
tb main #【临时断点】指定函数断点
tb 46 if i==10 #【临时断点】指定变量条件断点(只能设置全局变量)(46为断点编号,非行号)
|
4.10、GDB 命令u -------- until
1
2
3
4
5
6
7
|
####################################
# 命令作用: 运行到当前文件指定行断点
# 命令简写: u
# 命令全写: until
# 单 词: until /ənˈtɪl/
####################################
u 100 #【运行到行】运行到当前文件指定行断点(注意:当前文件是指程序暂停运行所在的文件!)
|
4.11、GDB 命令j -------- jump
1
2
3
4
5
6
7
8
|
####################################
# 命令作用: 跳转执行
# 命令简写: j
# 命令全写: jump
# 单 词: jump
####################################
j 100 #【跳转执行】跳转到当前文件指定行号执行(注意:当前文件是指程序暂停运行所在的文件!)
# 特别说明:建议在同一个函数中进行跳转,否则函数运行完返回时可能会出错。
|
4.12、GDB 命令cond ----- condition
1
2
3
4
5
6
7
8
|
####################################
# 命令作用: 指定编号断点增加条件【修改】
# 命令简写: cond
# 命令全写: condition
# 单 词: condition /kənˈdɪʃn/
####################################
cond 3 i==3 #【条件断点】指定编号断点增加停止条件(只能设置全局变量)(断点编号使用 i b 查看)
# 其实就是【修改】某个断点的条件,而 b 46 if i==10 这个命令则为【新建】一个条件断点
|
4.13、GDB 命令watch ---- watch
1
2
3
4
5
6
7
8
9
10
|
####################################
# 命令作用: 不固定位置的条件断点【新建】
# 命令简写: watch
# 命令全写: watch
# 单 词: watchpoint
####################################
watch i>9 #【条件断点】不固定位置的变量条件断点 (只能设置全局变量)
rwatch i #【条件断点】不固定位置的读变量条件断点 (只能设置全局变量)
awatch i #【条件断点】不固定位置的读写变量条件断点(只能设置全局变量)
# 意思是说只要程序修改全局变量数值并符合对应条件就会停下来(好像是软件实现,嵌入式使用仿真器调试时会严重影响实际运行速度!)
|
4.14、GDB 命令clear ---- clear
1
2
3
4
5
6
7
8
9
|
####################################
# 命令作用: 清除断点【单种类别】
# 命令简写: clear
# 命令全写: clear
# 单 词: clear
####################################
clear #【清除断点】清除当前程序所在的断点
clear max.c:5 #【清除断点】清除某个指定文件行号断点
clear main #【清除断点】清除某个指定函数断点
|
4.15、GDB 命令d -------- delete
1
2
3
4
5
6
7
8
9
10
|
####################################
# 命令作用: 删除对象【多种类别】
# 命令简写: d
# 命令全写: delete
# 单 词: delete breakpoints
####################################
d #【删除断点】所有断点
d 2 #【删除断点】删除某个指定编号的断点 (备注:需要 i b 查看断点编号来配合使用!)
d break 2 #【删除断点】同上
d display 2 #【删除显示】删除某个指定编号的变量显示(备注:需要 i display 查看变量编号来配合使用!)
|
4.16、GDB 命令dis ------ disable
1
2
3
4
5
6
7
|
####################################
# 命令作用: 禁用断点
# 命令简写: dis
# 命令全写: disable
# 单 词: disable
####################################
dis 2 #【禁用断点】禁用某个指定编号的断点(备注:需要 i b 查看断点编号来配合使用!)
|
4.17、GDB 命令en ------- enable
1
2
3
4
5
6
7
|
####################################
# 命令作用: 启用断点
# 命令简写: en
# 命令全写: enable
# 单 词: enable
####################################
en 2 #【启用断点】启用某个指定编号的断点(备注:需要 i b 查看断点编号来配合使用!)
|
4.18、GDB 命令i -------- info
1
2
3
4
5
6
7
8
9
10
11
12
|
####################################
# 命令作用: 查看信息【多种类别】
# 命令简写: i
# 命令全写: info
# 单 词: information
####################################
i r #【查看信息】查看处理器寄存器信息(查看 registers 信息)
i s #【查看调用】查看函数调用栈信息 (查看 stack 信息)
i b #【查看断点】查看断点信息(查看使用 break 设置的断点)
i display #【查看信息】查看变量信息(查看使用 display 显示的变量)
i locals #【查看信息】查看当前函数所有局部变量值(注意:当前函数是指程序暂停运行所在的函数!)
……
|
4.19、GDB 命令display -- display
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
####################################
# 命令作用: 查看变量【长期查看】
# 命令简写: display
# 命令全写: display
# 单 词: display
####################################
display cnt #【查看变量】查看变量信息(默认显示格式显示)【程序运行到暂停后会自动显示】
display cfg.ip #【查看变量】查看结构体成员信息(备注:结构体成员书写格式与C语言一样)
display /x cnt #【查看变量】以十六进制显示格式查看变量信息 【程序运行到暂停后会自动显示】
# /x 十六进制 (hex)
# /d 有符号十进制 (decimal)
# /u 无符号十进制 (unsigned decimal)
# /c 字符 (char)
# /t 二进制 (binary)
# /f 浮点数 (float)
# /o 八进制 (octal)
# /a 十六进制 (address)(地址格式)
|
4.20、GDB 命令p -------- print
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
####################################
# 命令作用: 查看变量【临时查看】
# 命令简写: p
# 命令全写: print
# 单 词: print
####################################
p i=1 #【变量赋值】给变量赋值(支持局部变量操作)
p cnt #【查看变量】查看变量信息(默认显示格式显示)(支持局部变量操作)
p cfg.ip #【查看变量】查看结构体成员信息(备注:结构体成员书写格式与C语言一样)
p /x cnt #【查看变量】以十六进制显示格式查看变量信息
p /x cnt@10 #【查看变量】以十六进制显示格式查看变量信息,将变量类型强制为数组元素并且显示多个(10个)
# /x 十六进制 (hex)
# /d 有符号十进制 (decimal)
# /u 无符号十进制 (unsigned decimal)
# /c 字符 (char)
# /t 二进制 (binary)
# /f 浮点数 (float)
# /o 八进制 (octal)
# /a 十六进制 (address)(地址格式)
|
4.21、GDB 命令ptype ---- ptype
1
2
3
4
5
6
7
8
9
|
####################################
# 命令作用: 查看对象类型【查看类型】
# 命令简写: ptype
# 命令全写: ptype
# 单 词: print type
####################################
ptype i #【查看变量】查看变量类型(普通变量)(可查看程序暂停运行所在函数的局部变量)
ptype net_obj #【查看变量】查看变量类型(结构体)
ptype main #【查看函数】查看函数类型
|
4.22、GDB 命令x/ ------- x/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
####################################
# 命令作用: 查看内存数据【查看内存】
# 命令简写: x/
# 命令全写: x/
# 单 词:
####################################
x/3xb 0x8003000 #【查看数据】查看[0x8003000]起始地址的数据(数量:3个单元,格式:十六进制,单元大小:1字节)
x/3uh buf #【查看数据】查看[buf]变量内存数据 (数量:3个单元,格式:无符号十进制,单元大小:2字节)
#【书写格式:x/+个数+格式+字长+对象(地址)】
# ● 显示格式--------
# x 十六进制
# d 有符号十进制
# u 无符号十进制
# c 字符
# t 二进制
# f 浮点数
# o 八进制
# a 十六进制(地址格式)
# ● 单元大小--------
# b 1字节
# h 2字节
# w 4字节
# g 8字节
|
4.23、GDB 命令bt ------- backtrace
1
2
3
4
5
6
7
|
####################################
# 命令作用: 查看函数调用栈信息
# 命令简写: bt
# 命令全写: backtrace
# 单 词: backtrace /bæktreɪs/
####################################
bt #【查看调用】查看函数调用栈信息
|
4.24、GDB 命令help ----- help
1
2
3
4
5
6
7
8
9
10
11
|
####################################
# 命令作用: 帮助
# 命令简写: help
# 命令全写: help
# 单 词: help
####################################
help layout #【查看帮助】查看layout命令帮助
help finish #【查看帮助】查看finish命令帮助
help info #【查看帮助】查看info 命令帮助
help set #【查看帮助】查看set 命令帮助
……
|
三、扩展
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 在 STM32F 上的应用
《linux-STM32F开发㈠-makefile 构建与使用》
《linux-STM32F开发㈡-调试器的安装与使用》
《linux-STM32F开发㈢-在线调试工具CGDB》