Linux调式器-gdb的使用

前言

GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。

gdb使用指令

下面笔者以c程序为例,讲解各个重要指令的用法

以在此c代码为例:

#include <stdio.h>
  2 
  3 int TopAdd(int rum)
  4 {                                                                                                                       
  5   int res = 0;                                                                                                          
  6   int i = 0;                                                                                                            
  7   for( i = 0; i <= rum; i++)                                                                                            
  8   {                                                                                                                     
  9     res += i;                                                                                                           
 10   }                                                                                                                     
 11   return res;                                                                                                           
 12 }                                                                                                                       
 13 int main()                                                                                                              
 14 {                                                                                                                       
 15   int num = 100;                                                                                                        
 16   int result = TopAdd(num);                                                                                             
 17   printf("result = %d\n", result);                                                                                      
 18                                                                                                                                             
 19   return 0;
 20 }                          

对于c程序来说,需要在编译的时候加上-g,保留调式信息,否则不能使用GDB进行调试。

gcc -o mytest mytest.c -g 

此时,我们在Makefile文件下写入依赖方法(如果这个不理解后面会专门写一篇Linux自动化构建工具make/Makefile)

此时,c程序编译时加上了-g,就可以使用GDB来进行调试了。

但如果不是自己编译的程序,此时我们想要知道该c程序是否带有-g参数,此时我们该怎么办?

如何判断一个文件是否带有调试信息呢?

例如:

用: gdb 文件名 

gdb helloworld
Reading symbols from hellowWorld...(no debugging symbols found)...done.

这就是没有调试信息的提示:no debugging symbols found

如果是下面的提示:

Reading symbols from hellowWorld...done.

则可以进行调式。

readelf查看段信息

mytest是一个可执行文件,如果没有任何debug信息,则不能被调试。

解决完能否使用GDB调试的问题,现在,我们来谈论在Linux下如何使用GDB

GDB使用

背景:

1.程序的发布方式有两种,debug模式和release模式
2.Linux gcc/g++出来的二进制程序,默认是release模式
3.要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

指令(列举现阶段常用的):

0.gdb 文件名: 进入gdb调试

1.list  /  l  行号 : 显示binFile源代码,接着上次的位置往下列,每次列10行。

由此代码可看,l(list的缩写),可以展示binFile源代码。

或者使用:(l + 行号的用法)

注意:gdb会记录最近一条命令,如果命令无变化,可以直接回车

2.quit:退出gdb

3.run / r : 开始调试,如果没有设置断点,就直接运行结果。

4.break / b  行号 :在某一行设置断点  

5.info break(b) : 查看断点信息(断点的编号)

6.delete / d : 删除断点,用法很多

d breakpoints删除所有断点
d breakpoints n删除序号为n的断点
d breakpoints禁用断点
enable breakpoints启用断点

7.next  /  n :逐过程编译

注意,不能直接使用n来逐过程编译,要先用r来将程序跑起来

8.printf / p 变量名 : 打印变量内容

9. cintinue  /  c  : 从当前位置开始连续而非单步执行程序 

运行到下一个断点处停下来

10.  s : 逐语句

11. bt : 查看当前调用的堆栈

12. finish : 执行到当前函数返回,然后停下来等待命令(将当前函数跑完,就停下来)

分析一下该过程:

1.先给binFile源代码打一下断点,此时有了一个断点。

2.r命令,使得程序跑起来,跑到断点的地方停止。

3.使用n到下一个过程,s进入TopAdd函数

4.用finish命令,此时程序将当前函数跑完,此时光标停留在第16段

5.函数返回值为5050传给result

这群代码和解释充分展示了finish命令的用法以及实现效果

13.  display  变量名: 设置长显示 (跟踪查看一个变量,每次停下来都显示它的值)

14.  undispaly  : 取消长显示(设置的那些变量的跟踪)

总结

可以与windows IDE对应例子 

以上就是GDB的命令以及命令的如何使用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值