Linux系统编程-2-快速入门gdb
前言
在VS系列的IDE中,我们习惯于图形化窗口的调试;而在linux的命令行下,我们则借助gdb这个工具来完成程序的调试
阅读完本文,你将了解:
- 显示代码
- 打断点、跳转到断点
- 逐过程执行
- 逐语句执行
- 长显示变量信息
- 跳转到指定行
- 禁用断点
- 调试时更改变量
如何将源码编译成可调试的二进制文件
我们以前在编译一个C语言源文件mytest.c时,通常使用这条指令:
1 | gcc mytest.c -o mytest |
顺利生成了可执行文件mytest
如果我们直接使用gdb调试这个可执行文件,会发现没有调试信息:
这是为什么呢?
Linux中程序默认编译的时候
- 默认生成的可执行程序是release版本的,不可调式
所以
- 需要调试,gcc编译时需要加
-g
参数,以debug方式发布程序,使得可执行文件带有调试信息–>才可以被gdb追踪,调试,即:1
gcc mytest.c -o mytest_debug -g
我们还可以发现的是,debug版本的可执行文件比release版本的大一些,这就是因为添加了调试信息
开始调试
首先给一下源文件:
1 |
|
我们先编译生成带调试信息的可执行文件
1 | gcc mytest.c -o mytest_debug -g |
然后gdb调试:
1 | gdb mytest_debug |
命令 | 作用 |
---|---|
list/l | 显示源代码(一次10行) |
run/r | 运行程序 |
next/n | 逐过程执行 |
step/s | 逐语句执行,可进入函数内 |
break/b 行号 | 在某一行设置断点 |
info break | 查看断点信息 |
finish | 执行到当前函数返回 |
print/p | 打印表达式的值 |
set var | 修改变量的值 |
continue | 跳到下一个断点 |
delete breakpoints | 删除所有断点 |
delete breakpoints n | 删除序号为n的断点 |
disable breakpoints n | 取消对序号为n的断点的追踪 |
enable breakpoints n | 恢复对序号为n的断点的追踪 |
info breakpoints | 打印设置的断点 |
display 变量名 | 长显示某变量 |
undisplay变量名 | 取消对某变量的长显示 |
until 行号 | 跳至某行 |
quit/q | 退出gdb |
下面演示常用命令
显示代码 l
1 | list/l 行号 |
显示源代码,一次显示10行,再按回车会接着往下显示
运行程序 r
我们开始调试,也就是要运行程序:
1 | run/r |
我们发现,r之后,代码直接执行到了第14行的输入语句,并且输入之后程序直接结束,根本没有进行调试。原因是因为我们没有设置断点,如果设置了断点,r将会执行到第一个断点处停止,这样我们就能进行单步调试。
设置、查看断点
1 | b 行号 //设置断点 |
我们在14、15、19行设置了断点
next单步逐过程调试
我们继续r执行程序,再n单步执行
1 | n |
发现n没有让我们进入函数体内,这说明了n是逐过程调试
step逐语句调试
我们用s进入函数体内
finish执行到当前函数返回停下
finish
c跳到下一个断点
c
dispaly 长显示变量
1 | display 变量名 |
注意undisolay的是变量前面的序号
打印表达式的值 p
p
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 danteking!