我是靠谱客的博主 苗条过客,最近开发中收集的这篇文章主要介绍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:%dn",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:%dn",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直接从当前断点处跳转到下一个断点处

最后

以上就是苗条过客为你收集整理的gdb的简要了解和实例使用的全部内容,希望文章能够帮你解决gdb的简要了解和实例使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部