gdb的简要了解和实例使用

一、了解

背景

1. gdb是什么?——gdb为Linux/Unix的调试工具,和各类IDE中自带的调试如出一辙。

2. 程序的发布方式有两种,debug和release版本,debug是开发者调试编写的版本release是发布给用户的版本,而linux中c语言生成的可执行程序默认为release版本。

3. Linux gcc/g++出来的二进制程序,默认是release模式

4. 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。

安装

推荐使用命令直接安装

$ yum install -y gdb

安装后执行命令gdb -v或者gdb -version检查自己安装版本或者是否已经已安装

二、使用

gdb的使用在于启动gdb后的调试操作,我们首先列举一些实例中会用到的

命令(其缩写)作用
list(l)显示程序代码
run(r执行代码到间断点(无间断点直接结束)
next(n)使程序代码单条执行 (逐过程)
step(s)进入函数调用(逐语句)
break(b)在某一行(或函数开头)设置断点
info break(b)查看断点信息(查看编号)
delete(d)删除某个断点(后面跟编号)
continue(c运行到下一个断点处(或结束程序)
display常显示
undisplay取消常显示
finish结束行数调用,然后停下

以及

  1. 在开始gcc时可以使用的命令,-q-quiet-silent可以进入gdb中不打印默认的各种条款,简洁明了
  2. 在退出时可以使用qui命令退出或者键盘ctrl^d退出

开始调试仍然可以选用1.直接执行

$ ls
test.c
$ gcc test.c -o test -g

或者2.makefile

test:test.c                                                                    
   gcc  $^ -o $@ -g

.PHONY:clean
clean:
   rm -f test

出现下面即完成

$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/aiyimu/Test/gdb/mytest...done.
(gdb) 

正式开始进行调试

(gdb) l 1		<——list 打印从1行后的十行
warning: Source file is more recent than executable.
1	#include <stdio.h>
2	
3	int MySum(int n)
4	{
5	int sum=0,i=1;
6	  for(;i<n;i++) 
7	  {
8	    sum+=i;
9	  }
10	  return sum;
(gdb) 
11	}
12	
13	int main()
14	{
15	  printf("process begin running...\n");
16	  int result = MySum(100);
17	  printf("result:%d\n",result);
18	  printf("process end running...\n");
19	  return 0;
20	}

使用 l 1,gdb会自动打印出第一行往后的10行
gdb会记忆上次操作,我们回车gdb自动打印其后10行的内容
此时以及完全打印出test.c的内容

(gdb) b 15		 <—— 在15行打个断点
Breakpoint 3 at 0x4005b3: file mytest.c, line 15.
(gdb) r			<——运行程序
Starting program: /home/aiyimu/Test/gdb/mytest 

Breakpoint 3, main () at mytest.c:15
15	  printf("process begin running...\n");
(gdb) n			<—向下一行走
process begin running...
16	  int result = MySum(100);
(gdb) n			<——使用'n'直接跳过函数步骤
17	  printf("result:%d\n",result);
(gdb) info b	<——查询断点信息
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x00000000004005b3 in main at mytest.c:15
	breakpoint already hit 1 time
(gdb) d 3		<——删除断点
(gdb) info b
No breakpoints or watchpoints.
(gdb) b 16
Breakpoint 4 at 0x4005bd: file mytest.c, line 16.
(gdb) r		<——重新运行
The program being debugged has been started already.
Start it from the beginning? (y or n) y		<——确定
Starting program: /home/aiyimu/Test/gdb/mytest 
process begin running...

Breakpoint 4, main () at mytest.c:16
16	  int result = MySum(100);
(gdb) s		<——进入函数
MySum (n=100) at mytest.c:5
5	int sum=0,i=1;
(gdb) n
6	  for(;i<n;i++) 
(gdb) n
8	    sum+=i;
(gdb) n
6	  for(;i<n;i++) 
(gdb) n
8	    sum+=i;
(gdb) n
6	  for(;i<n;i++) 
(gdb) n
8	    sum+=i;
(gdb) display i		<——常显示,即监视i的值(监视地址使用&i)
1: i = 3
(gdb) display sum	<——监视sum的值
2: sum = 3
(gdb) n
6	  for(;i<n;i++) 
2: sum = 6
1: i = 3
(gdb) n
8	    sum+=i;
2: sum = 6
1: i = 4
(gdb) until 10		<——结束循环直接跳转到第十行(若跳转行为空跳转到下一行)&&也可以使用finish直接结束当前函数,打出结果进入下一行
MySum (n=100) at mytest.c:10
10	  return sum;
2: sum = 4950
1: i = 100
(gdb) undisplay 1	<——取消监控

小结

  1. 当我们调试排查错误的时候可以采用二分查找的方法更高效的排查
  2. 当打印两个以上的断点时(gdb) c直接从当前断点处跳转到下一个断点处
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值