GDB概述
linux下的GDB是一个用来调试C和C++程序的强大的调试器,他能在程序运行过程中观察程序的内部结构和内存的使用情况
GDB的使用
gdb是一个命令行方式的调试工具,在Linux的命令提示如下输入gdb,系统便会启动gdb,也可以在gdb后面给出为文件名,直接指定想要调试的程序,例如:gdb main.c就是开始调试main.c程序。在调试之前,我们需要把可调试的信息装载到可执行程序中去,所以在用gcc编译的时候,加上-g或者-gdb选项,命令:gcc -g main.c -o main
常用的调试命令
run 执行当前被调试的程序
quit 退出当前的gdb调试
step 执行一行代码而且进入函数内部
next 执行一行源代码不进入函数内部
break 后可以跟行号或者函数名,加断点在该行或者该函数的入口出
print 打印变量或者表达式的值,还可以对变量进行赋值
print 数组名 打印数组所有元素的值
print &val 打印变量的地址
display 设置自动显示的表达式或者变量,display作用域只在设置的那个函数内部,出了设置的函数内部就不会在打印变量值,但是下一次进来这个函数display会继续显示变量的值
undisplay
list 列出执行文件的源代码
watch 监视一个变量的值而不管他何时改变
barktrace 查看函数调用信息(栈帧)
frame n 定位到发生段错误的代码段,n为backtrace命令的输出结果中的行号
continue继续执行,直到遇到下一个断点
kill 终止正在调试的程序
下面我们先看下面一个代码,代码在scanf这个行有问题,那么我们接下来就用gdb查找一下
1 #include<stdio.h>
2
3 int main()
4 {
5 int num = 0;
6 printf("please input number:");
7 scanf("%d",num);
8 printf("the number = %d\n",num);
9
10 return 0;
11 }
第一步我们需要先把调试信息加入到可执行程序中去,执行命令 gcc -g main.c -o main
错误我们就启动gdb调试代码,让代码跑起来
接下来我们就会看到错误
找到错误,是main函数的第七行sacnf的num那里没有取地址而错误,退出程序
这个例子比较简单,下面我们看一个难一点的例子
1 #include<iostream>
2 using namespace std;
3
4
5 void add(int a,int b)
6 {
7 int c = a + b;
8 cout<<"a + b = "<< c <<endl;;
9 }
10 void down(int a,int b)
11 {
12 int c = a -b;
13 cout<<"a - b = "<< c <<endl;
14 }
15 int main()
16 {
17 int arr[] = {1,5,2,4,3};
18
19
20 int a,b;
21 cout<<"please input two numbers:";
22 cin>>a>>b;
23 if(a == 0 && b == 0)
24 {
25 return 0;
26 }
27 add(a,b);
28 down(a,b);
29
30 for(int i = 0;i < sizeof(arr)/sizeof(int);i++)
31 {
32 cout<<arr[i]<<" ";
33 }
34 cout<<endl;
35 return 0;
36 }
我们先启动gdb调试,然后执行我们常见的命令
我们把断点加在main函数处开始执行
好了,就这些吧!