Linux中的GDB调试

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函数处开始执行

好了,就这些吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值