调试是所有程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 就如读者熟知的Windwos下的一些调试工具, 如VC自带的设置断点, 单步跟踪等, 都受到了广大用户的赞赏. 那么, 在Liunx下有什么好的调试工具呢?

Gdb是一款GNU开发组织并发布的Linux下的程序调试工具. 虽然它没有图形化的友好界面, 但是它强大的功能也足以与微软的VC工具相媲美.

下面举一个例子, 演示一下Gdb的使用流程:

测试文件 test.c 的代码如下:
#include <stdio.h>
int sum(int m);
int main()
{
  int i, n=0;
  sum(50);
  for(i=1; i<=50; i++)
  {
    n += i;
  }
  printf("The sum of 1-50 is %d \n", n);
}

int sum(int m)
{
  int i, n=0;
  for(i=1; i<=m; i++)
    n += i;
  printf("The sum of 1-m is %d\n", n);
}

编译源代码文件, 生成可执行文件.
注意:一定要加上选项"-g", 这样编译出的可执行代码中才包含调试信息, 否则Gdb无法载入该可执行文件.
$ gcc -g test.c -o test
虽然这段程序没有错误, 但调试完全正确的程序可以更加了解Gdb的使用流程. 接下来就启动Gdb进行调试. 注意, Gdb进行调试的是可执行文件, 而不是".c"源文件, 因此, 需要先通过Gcc编译生成可执行文件才能用Gdb进行调试.

启动Gdb
$gdb test
GNU gdb (GDB) 7.0-debian
Copyright (C) 2009 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-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/wangsheng/tmp/demo/gdb/test...done.

可以看出, 在Gdb的启动画面中指出了Gdb的版本号, 使用的库文件等头信息, 接下来就进入了由"(gdb)"开头的命令行界面了.

(1) 查看源文件
在Gdb中键入"l"(list的缩写)可以查看所载入的文件, 如下所示:
(gdb) l
1       #include <stdio.h>
2       int sum(int m);
3       int main()
4       {
5         int i, n=0;
6         sum(50);
7         for(i=1; i<=50; i++)
8         {
9           n += i;
10        }
(gdb) l
11        printf("The sum of 1-50 is %d \n", n);
12      }
13
14      int sum(int m)
15      {
16        int i, n=0;
17        for(i=1; i<=m; i++)
18          n += i;
19        printf("The sum of 1-m is %d\n", n);
20      }
(gdb) l
Line number 21 out of range; test.c has 20 lines.
可以看出, Gdb列出的源代码中明确地给出了对应的行号, 这样就可以大大地方便代码的定位.

(2) 设置断点
    设置断点是调试程序中一个非常重要的手段, 它可以使程序到一定位置暂停运行. 因此,可以在该位置方便地查看变量的值, 堆栈情况等, 从而找出代码的症结所在.

在Gdb中设置断点非常简单, 只需在"b"后加入对应的行号即可(这时最常用的方式). 如下所示:
(gdb) b 6
Breakpoint 1 at 0x4004fb: file test.c, line 6.

注意: 该断点的作用是当程序运行到第6行时暂停(第5行执行完毕, 第6行未执行)

(3) 查看断点情况
    在设置完断点之后, 用户可以键入"info b" 来查看设置断点情况, 在Gdb中可以设置多个断点.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at test.c:6

(4) 运行代码
    接下来就可运行代码了, Gdb默认从首行开始运行代码, 可键入"r"(run的缩写)即可. 若想从程序中指定的行开始运行, 可在r后面加上行号.
(gdb) r
Starting program: /home/wangsheng/tmp/demo/gdb/test

Breakpoint 1, main () at test.c:6
6         sum(50);

可以看到程序运行到断点处就停止了.

(5) 查看变量值
    在程序停止运行之后, 程序员所要做的工作是查看断点处的相关变量值. 在Gdb中只需键入"p"(print的缩写) +变量名称 即可.
(gdb) p n
$1 = 0
(gdb) p i
$2 = 0

(6) 单步运行
    单步运行可以使用n(next的缩写)或者s(step的缩写), 它们之间的区别在于: 若有函数调用的时候, s会进入该函数而n不会. 因此, s就类似于VC等工具中的"step in", n就类似于VC等工具中的"step over".

下面是使用n命令的输出
(gdb) n
The sum of 1-m is 1275
7         for(i=1; i<=50; i++)

下面是使用s命令的输出
(gdb) s
sum (m=50) at test.c:16
16        int i, n=0;

可以看出执行s命令时进入了sum函数内部, 而n命令则跳过函数的调用部分

(7) 恢复程序运行
    在查看变量值以及堆栈之后, 就可以使用命令c(continue)恢复程序的正常运行了. 这时, 它会把剩余还未执行的程序执行完, 并显示剩余程序的执行结果.
(gdb) c
Continuing.
The sum of 1-m is 1275
The sum of 1-50 is 1275

Program exited with co

de 031.

可以看出, 程序在运行完后退出, 之后程序处于"停止状态".
说明: 在Gdb中, 程序的运行状态有"运行","暂停"和"停止"3种. 其中"暂停"状态是程序遇到了断点或者观察点, 程序暂时停止运行, 而此时函数的地址, 函数参数, 函数内的局部变量都会被压入"栈(Stack)中. 故在这种状态下可以查看函数的变量值等各种属性. 但在函数处于"停止"状态之后, "栈"就会自动撤销, 它也就无法查看各种信息了.

Linux下C语言的调试器 Gdb相关推荐

  1. Linux下C语言的调试--转

    调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...

  2. Linux下c语言串口调试助手,World Hello

    调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...

  3. Arch Linux/其他 Linux 下给 Link2/LPC-Link2 调试器刷 CMSIS-DAP 和 J-Link 固件

    文章目录 NXP 提供的 LPCScrypt 工具 我 Arch 用户或其他 Linux 发行版用户想使用怎么办? 1. 注册 NXP 官网下载相应的 Linux 版本文件 2. 用文本编辑器打开看了 ...

  4. GDB调试器——GDB调试器简介

    以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除. 一.程序调试器的含义 程序中的错误主要分为 2 类,分别为语法错误和逻辑错误. 程序中出现的语法错误可以借助编译器解决:但逻辑错误则只能靠 ...

  5. Day 3 Linux(目录篇 、文件操作篇 、压缩解压相关命令, 编辑器vi 、编译器gcc 、调试器gdb、 makefile工程管理器初学)

    一.目录篇: 1.文件处理命令:cp 英文原意:copy 语法:cp -rp[源文件或目录][目的目录] 源文件可以同时是多个,即同时复制到多个文件 -r 复制目录 -p保留文件属性,比如文件创建时间 ...

  6. 【Linux】Linux调试器--gdb详解

    Linux环境基础开发工具使用(二) 一.Linux调试器-gdb使用 1.背景 2.使用 二.Linux项目自动化构建工具-make/Makefile 1.背景 2.依赖关系和依赖方法 3.原理 4 ...

  7. linux c语言 ppt,Linux下C语言编程.ppt

    Linux下C语言编程 Linux中C语言的重要性 Linux和C天生有不解之缘. Linux操作系统的内核主要是用C写的,另外Linux下的很多软件也是用C写的,特别是一些著名的服务软件,比如MyS ...

  8. 关于Linux下C语言开发基础的实验内容。

    Linux下C语言开发基础实验内容 目录 1.Linux下C语言开发流程 2.vi,vim编辑器的使用 3.Gcc编译器的使用 总体选项: 警告选项: 4.GDB 基本命令的使用 5.Make 工程管 ...

  9. Linux下C语言编程

    第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...

最新文章

  1. 又见yx — 说说IT公司的团队头儿
  2. 重磅:苹果人工智能最完整解密,iBrain早已无处不在
  3. 【重学Vue】数据响应原理真的是双向绑定吗?
  4. 如何激活React的跟踪模式和打开日志记录
  5. php 访问第三方接口吗,PHP-----------HTTP请求的第三方接口
  6. window8下安装RabbitMQ
  7. 3月任务--target
  8. c语言闰年的判断条件DS1302,DS1302驱动程序(平年和闰年天数自动调整)
  9. opencv计算机视觉编程攻略 第2版,OpenCV计算机视觉编程攻略(第2版)pdf
  10. 关于如何修改ISA server 防火墙并行最大TCP连接数问题和优化ISA 服务器淹没缓解设置
  11. Java核心API -- 9(异常)
  12. [排错] Status error 2850
  13. 识别你的ADFS是什么版本的(Which version of ADFS is running)
  14. 台达plc用c语言编程软件,台达plc编程
  15. JavaScript下载本地文件
  16. 万能采集网站php源码,PHP采集系统UZCMS万能最新版
  17. 淘宝为什么有的人月销量上万,他们是怎么操作的?
  18. OCJP 考试题之八
  19. 部落战争手游源码( 服务端+客户端+资源+开发文档)
  20. 最近听到一首挺好听的歌,但是……

热门文章

  1. [转载] Python中关于字符串的使用演示
  2. SignalTap II里面Power-Up Trigger的使用
  3. C++学习网站——www.cplusplus.com
  4. idea 创建Javaweb 动态工程
  5. 手把手教你写一个java的orm(二)
  6. Identityserver4配置证书
  7. 由href return false 来看阻止默认事件
  8. 如何在centos7上安装源码包
  9. 定制属于自己的自动化安装的linux系统镜像
  10. 谜底是计算机的谜语英语,英语谜语(Riddle)  谜底