学习GDB调试的简单操作
资源全部来自实验楼
可自行去实验楼学习相关课程
安装GDB
# # 使用以下命令安装GDB
sudo apt-get install gdb # # ubuntu
GDB的进入和退出
# # 编译并生成可执行文件
gcc source.c -o bugging -g
# # 进入调试界面
gdb bugging
(gdb)run # # 运行代调试程序
(gdb)quit # # 退出
GDB常用命令
cmd | abbr | addi |
---|---|---|
list | l | print code |
backtrace | bt or where | print stack |
next | n | execute next line |
step | s | execute one line once |
finish | - | execute until finished |
continue | c | continue to execute |
break | b | set bps |
info breakpoints | show the info of bps | |
delete | d | delete bps |
p | print the value of exp | |
run | r | start the program |
until | u | execute until some line |
info | i | print info |
help | h | print help |
bps .abbr breakpoints
exp .abbr expression
在GDB命令行界面可以执行外部的Shell命令
# (gdb)!cmd
(gdb)!ls
从应用层面学习GDB的命令
-
查看源文件
-
list 行号
显示某一行附近的代码(gdb)list 2 # # 查看第二行附近的代码
- 输入后持续输入
\n
可遍历代码 - 每次10行
- 输入后持续输入
-
list 函数名
显示某个函数附近的代码(gdb)list main
-
涉及多个源文件时
(gdb)list filename:line (gdb)list filename:function
-
-
设置断点
-
break
用来设置断点-
break 行号
设置在行开始处break filename:line
-
break 函数名
设置在函数开始处break filename:function
-
-
info breakpoints
命令用于显示当前断点信息 信息如下Num Type Disp Enb Address What 断点号 欢迎
hit
后动作是否启用 存储中的位置 源码中的位置 -
disable bp_num
关闭指定断点disable 不指定参数 --> 关闭所有断点
-
enable bp_num
启用指定断点enable 不指定参数 --> 启用所有断点
-
断点启用的更多方式
(gdb)enable once bp_num # # 断点hit一次之后关闭该断点 (gdb)enable delete bp_num # # 断点hit一次之后删除该断点
影响info breakpoints的
Disp
列
-
-
断点调试的一些命令
-
打印变量
(gdb)info locals # # 打印当前函数的全部局部变量信息 (gdb)print value # # 打印某变量的值 (gdb)print exp # # 打印表达式的值
-
启动程序
(gdb)run # # 启动程序 (gdb)run args # # 带主函数参数的启动程序
-
单步命令
(gdb)next # # 单步执行 函数调用当成一步 (gdb)next N # # 单步执行N次 (gdb)step # # 单步执行 函数调用会进入函数 (gdb)step N # # (gdb)continue # # 执行到下一个断点 (gdb)until N # # 执行到第N行
容易看出
list
break
step
next
info
等指令高频
-
GDB函数栈
进程在内存空间会拥有一块叫做 stack 的区域,函数内部的局部变量、函数之间调用时参数的传递和返回值等等都会用到栈这种数据结构
-
查看代调试程序的内存分布情况
(gdb)info proc mappings
-
查看函数调用栈的情况
(gdb)backtrace (gdb)bt (gdb)where (gdb)info stack # # 以上命令有着相同输出 (gdb)backtrace full (gdb)bt full (gdb)where full (gdb)info stack full # # 查看函数调用栈情况 同时打印局部变量的值
总结
GDB
的操作看起来不是很难 但是离开VS
、CLION
等IDE
的可视化界面的帮助,用GDB
在命令行调试在现在看起来是一件很困难的事情- 要常加练习 这样有助于对程序设计的进一步精进