首先我们要确保已经安装gdb,可以通过 gdb -version
来进行间接查看。
未安装使用sudo yum -y install gdb
下载安装即可。
首先进入gdb直接使用:gdb 文件名
接下来我直接给出 gdb 的 所有功能命令(注意简写形式,会经常使用):
断点相关操作:
监视相关操作:
display 变量名:跟踪指定变量的值,并在每次程序暂停时显示它。
undisplay:取消对先前设置的变量的跟踪。
until X行号:继续执行程序,直到达到指定的行号。
breaktrace(或bt):显示程序的调用栈,包括所有函数的调用和参数。
info(i) locals:显示当前函数栈帧中局部变量的值。
quit:退出GDB。
接下来我们在实践中加深对gdb的熟悉:
首先我们编写一段简单程序:
1 #include<iostream>
2 using namespace std;
3
4 int main(){
5 int i = 0;
6 int j = 100;
7
8 while(i < 100){
9 int sum = i + j;
10 i++;
11 j -= 2;
12 }
13
14 for(int k = 0;k<10;k++){
15 cout<<"hello bit"<<endl;
16 }
17
18
19 return 0;
20 }
然后我们直接进入gdb
出乎意料的是 再使用list出现了报错(No symbol table is loaded. Use the “file” command.)!!!
这是因为 gdb操作的应该是编译后的文件
当编译时,未加 - g 选项,则进入gdb环境中执行命令会出现No symbol table is loaded. Use the “file” command.提示;
一定要进行gcc/g++ -g test.c -o test
操作哦。
这样就好了:成功显示出我们代码
接下来我们打开监视,来看看每个变量的变化。我们先打上断点来进入主函数:
然后逐个 display 展示即可:
然后调试(continue、step、next)就好,可以清楚看到每个变量的值
我们来试试断点的快速移动:
我们直接就跳出了正在进行的while循环,来到14行了。
其他指令就不进行探索了,熟悉使用就可以了。
堆栈: