一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    3、当程序被停住时,可以检查此时你的程序中所发生的事。
    4、动态的改变你程序的执行环境。

GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:

(参考:Debugging with GDB https://sourceware.org/gdb/current/onlinedocs/gdb/

  • Start your program, specifying anything that might affect its behavior.
  • Make your program stop on specified conditions.
  • Examine what has happened, when your program has stopped.
  • Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.

一个调试示例:

1、源程序:tst.c

  1. #include <stdio.h>
  2.  
  3. int func(int n)
  4. {
  5. int sum=,i;
  6. for(i=; i<n; i++)
  7. {
  8. sum+=i;
  9. }
  10. return sum;
  11. }
  12.  
  13. int main()
  14. {
  15. int i;
  16. long result = ;
  17. for(i=; i<=; i++)
  18. {
  19. result += i;
  20. }
  21.  
  22. printf("result[1-100] = %ld /n", result );
  23. printf("result[1-250] = %d /n", func() );
  24. }

2、 编译生成执行文件:#gcc -g tst.c -o tst

3、启用GDB调试程序

4、#gdb tst                     //启动gdb,进入gdb调试环境

5、(gdb)list                     //list命令 从第一行开始列出源码

  1. sum+=i;
  2. }
  3. return sum;
  4. }
  5.  
  6. int main()
  7. {
  8. int i;
  9. long result = ;

6、(gdb)                         //直接回车,表示执行上一条命令

  1. for(i=; i<=; i++)
  2. {
  3. result += i;
  4. }
  5.  
  6. printf("result[1-100] = %ld /n", result );
  7. printf("result[1-250] = %d /n", func() );
  8. }

7、(gdb)                         //直接回车,表示执行上一条命令

  1. Line number out of range; tst.c has lines.

8、(gdb) break 16           //在源程序tst.c第16行设置断点

  1. Breakpoint at 0x400563: file tst.c, line .

9、(gdb)break func          //在源程序中函数func()的入口处设置断点,断点在第5行

  1. Breakpoint at 0x400534: file tst.c, line .

10、(gdb)info break          //查看断点信息

  1. Num Type Disp Enb Address What
  2. breakpoint keep y 0x0000000000400563 in main at tst.c:
  3. breakpoint keep y 0x0000000000400534 in func at tst.c:

11、(gdb)r                       //输入r,r是run命令的简写

  1. Starting program: /root/c_study/tst
  2.  
  3. Breakpoint , main () at tst.c:
  4. long result = ;
  5. Missing separate debuginfos, use: debuginfo-install glibc-2.17-.el7_4..x86_64

12、(gdb)n                     //输入n,n是next命令的简写,next命令:执行下一条程序

  1. for(i=; i<=; i++)

13、(gdb)n

  1. result += i;

14、(gdb)n

  1. for(i=; i<=; i++)

15、(gdb)n

  1. result += i;

用gdb调试程序(Linux环境)的更多相关文章

  1. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  2. Linux高级编程--04.GDB调试程序(入门概述)

    GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试 ...

  3. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  4. Linux高级编程--04.GDB调试程序(查看数据)

    查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...

  5. Linux下使用GDB调试程序

    问题描述:          Linux下使用GDB调试程序 问题解决:          (1)生成调试文件 注:         使用命令   gdb IOStream.c   -o IOStre ...

  6. 在qemu环境中用gdb调试Linux内核

    简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...

  7. 利用QEMU+GDB搭建Linux内核调试环境

    前言 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试. 其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qe ...

  8. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  9. 用GDB调试程序(一)

    http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或 ...

随机推荐

  1. STM32启动代码分析

    STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在<<STM32不完全手册里面>>,我们所有的例程都采用了一个叫STM32F10x.s的启动文 ...

  2. 处理HTML表单(11)

    PHP和Web表单 <?php if(isset($_POST["name"])){//isset()函数设置变量是否设置,并且不能为空 $name = $_POST[&qu ...

  3. uboot中ftd命令

    可以从u-boot官网源码下载一个比较新的u-boot, 查看它的cmd/fdt.cftp://ftp.denx.de/pub/u-boot/ fdt命令使用示例nand read.jffs2 320 ...

  4. goldengate简单配置

    goldendate配置单项同步 源数据库    extract抽取进程 trail文件 复制进程 目标进程 由于最开始配置goldengate的时候,没有弄清除原理,导致出错了都不知道怎么解决. 最 ...

  5. macOS:按钮类型

    for (int i = 0; i < 10; i++) { for (int j = 1; j < 16; j++) { NSButton *btn = [[NSButton alloc ...

  6. 随机获取指定范围内N个不重复数字

    /// <summary> /// 随机获取指定范围内N个不重复数字 /// </summary> /// <param name="min"> ...

  7. 使用VMware安装CentOS7

    以前一直用的CentOS6,这次搭建一套CentOS7. 感觉和6还是有一些差异,在这边记录下. 一.选择典型(推荐): 二.选择安装程序光盘映像文件: 网上有几个版本,mini版,DVD版,不过mi ...

  8. rpm与yum,at与crontab,sed命令使用

    1.简述rpm与yum命令的常见选项,并举例. rpm——软件包管理系统,它使得在Linux下安装.升级.删除软件包的工作变得容易,并且具有查询.验证软件包的功能. 1)安装选项 命令格式: rpm ...

  9. scrapy基础

    scrapy Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy ...

  10. 获取vue路由跳转路径

    平时BUG: 在vue中使用element ui 中的导航组件时,使用index作为跳转的路径,单击跳转没有问题,但是当刷新页面是,选项卡的激活 状态就变成初始化的了,起起初想到用获取window.l ...