目录

linux 调试仿真工具

一、前言

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 提示的错误

../img/20200916_2_121.jpg


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文件进行分析

运行结果:

../img/20200916_3_101.jpg
../img/20200916_3_102.jpg

补充:由于 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】也可直接并强制退出!

运行结果:

../img/20200916_3_201.jpg


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行

各类窗口:

../img/20200916_3_301.jpg
../img/20200916_3_302.jpg
../img/20200916_3_303.jpg
../img/20200916_3_304.jpg

特别说明:在 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