目录
前言:
Debug 模式和 Release 模式
怎么安装 gdb?(CentOS7)
怎么使用 gdb?
进入 gdb 模式:
查看代码:
执行代码:
断点:
打断点:
查看断点:
删除断点:
使能断点:
逐过程与逐语句调试:
查看变量:
一次性显示:
常显示:
范围调试:
多分枝测试:
退出 gdb :
编辑
前言:
前面我们学习了怎么在Linux下编写代码和运行代码,下面将学习怎么调试代码。
Debug 模式和 Release 模式
可执行程序有两个模式,一个是 Debug 模式,一个是 Release 模式:
1、Debug 模式下的可执行程序添加了调试信息,可以被调试,且体积较大;
2、Release 模式下的可执行程序去掉了调试信息,不可以被调试,且体积较小。
gcc/g++编译后的可执行程序默认为 Release 模式,若需要生成的可执行程序为 Debug 模式,需要在编译时,加上 -g :
怎么安装 gdb?(CentOS7)
在 root 用户下,输入命令 yum install -y gdb ;
或者在普通用户下,输入 sudo yum install -y gdb 。
怎么使用 gdb?
我们现在写了一段代码,文件名为 test.c ,下面将演示如何调试这段代码:
进入 gdb 模式:
先把代码编译后,得到可执行程序 test,gdb 可执行程序(Debug) 就可以开始调试代码,千万记住是Debug模式,Release模式不能调试代码:
必须是可执行程序才可以调试,否则会报错,提示该文件不是可执行程序!
查看代码:
l 命令可以查看代码,一次可以查看 10 行:
我们也可以指定行数查看代码, l 行数 即可:
l 1 表示从头开始查看代码,回车可以向后查看代码:
如果行数不是 1 ,而是其他数字,则会显示 行数 的上下 10 行代码!
也可以指定想查看的代码的开始行和结尾行,l 数字,数字:
执行代码:
gdb 模式下可以运行代码,查看运行结果,输入命令 r :
断点:
打断点:
命令 b 行数 可以给指定的代码打断点:
命令 b 函数 可以给指定的函数打断点:
命令 b 文件名:行数 可以给指定文件的某一行代码打断点,指定的文件是可执行程序的依赖文件:
查看断点:
命令 info b 可以查看断点信息:
删除断点:
命令 d 断点编号 可以删除断点,注意是断点编号,而不是断点所在的行数:
使能断点:
如果我们不想让这个断点生效,又不想删除断点,我们可以禁用断点,disable 断点编号 可以禁用断点,当我们查看断点信息时,Enb 列可以查看断点是否被禁用了,y 表示启用断点,n 表示禁用断点:
enable 断点编号 可以重新打开断点:
逐过程与逐语句调试:
1、逐过程表示调试时,若遇到函数,会执行完整个函数,不会进入函数内部调试,把函数当作一条语句;
2、逐语句表示代码一条一条的调试,若遇到函数,会进入函数内部一句一句调试代码。
在进行逐过程和逐语句调试时,要先把代码跑起来,代码遇到断点会停下来,在代码停下来的地方,我们可以选择逐过程还是逐语句调试代码,下面是具体演示:
假设我们在代码的第16行打上了断点,
命令 n 表示逐过程:
命令 s 表示逐语句:
如果我们在调试时想跳出 for 循环,可以用命令 until 行数,跳转到指定的代码,当然 until 不止可以跳出 for 循环,想跳转的情况都可以使用。
查看变量:
当我们逐过程或者逐语句调试时,想查看某个变量的值或者变量的地址,gdb 中可以选择一次性查看或者常显示 。
一次性显示:
命令 p 变量名 可以查看当前执行下变量的值,不过只显示一次,继续调试时不再显示:
常显示:
display 变量名 可以在执行代码时常显示变量的值:
我们常显示变量的值时,每个变量前面都有编号,如果我们不想常显示某个变量,undisplay 变量对应的编号 就可以取消常显示:
范围调试:
除了前面 until 可以跳转到指定的代码外,还有以下两个常见的命令可以进行范围调试:
命令 c 可以从当前断点运行到下一个断点:
命令 finish 可以执行完当前的函数。
如下所示,命令 bt 可以查看调用堆栈,当前执行的函数为Sum,命令 finish 就可以执行完 Sum 函数,回到调用该函数的那一行代码:
多分支测试:
在进入 if 判断时,命令 set var 变量名=值 可以在不修改代码的情况下,修改变量的值, 实现其他分支的测试:
要注意修改变量的值的时机,在进入 if 判断之前修改变量的值的话,没办法如预期设想的走向另一个分支:
退出 gdb :
输入命令 quit 就可以退出:
本文内容结束,欢迎各位大佬的批评指正!