3、利用GDB进行程序调试

本文将用一个实际例子讲解如何通过GDB进行程序调试。

首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么,或者运行过程中在做什么,一般来说,GDB主要帮助实现以下四个方面的功能。

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

在命令行上输入gdb即可启动GDB,一旦启动完毕,就可以接受用户从键盘输入的命令并完成相应的任务。若想退出GDB,只需在工作环境中输入命令quit即可。

下面给出一个调试程序mian.c

#include <stdio.h>

     int func(int n)
      {
             int sum=0,i;
             for(i=0; i<n; i++)
              {
                      sum+=i;
              }
             return sum;
     }

     main()
     {
             int i;
             long result = 0;
             for(i=1; i<=100; i++)
             {
                     result += i;
             }

            printf("result[1-100] = %d /n", result );
           printf("result[1-250] = %d /n", func(250) );
     }

使用指令

gcc -g main.c -o main

进行编译后,通过

gdb -tui main

再输入return,就使用”-tui“选项可以将代码显示在一个漂亮的交互式窗口内(所以被称为“文本用户界面 TUI”),在这个窗口内可以使用光标来操控,同时在下面的GDB shell中输入命令。

使用gdb调试命令添加断点,并查看断点信息如下:

运行程序可以看到程序在断点后停止:

继续运行及相关变量的查看

继续运行及删除断点操作

查看程序堆栈,运行出当前函数及退出gdb调试

通过上面比较直观的操作,可以对gdb的操作有了一个大体上的理解了。

命令gdb的使用语法如下所示:

gdb 选项  可执行程序 core文件|进程ID

命令gdb的参数一般为待调试运行的程序,也可以为程序运行错误时产生的core文件,或者正在运行的进程ID.

GDB常用的选项如下:

-c core 使用指定的core文件检查程序。

-h 给出帮助选项的简单说明

-n 忽略./gdbinit文件中指定的命令

-q 不显示版权等信息。

-s 使用保存在指定文件中的符号表。

GDB的所有命令

GDB的所有命令可以查看http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf,但是我们通常用不到这么多调试命令,这里将一些程序调试时常用的命令列出如下:

list 查看程序

1、break 行号 在指定行添加断点。

2、break 文件名 行号 在指定的文件的指定行添加断点。

3、break 行号 if 条件 当条件为真时,指定行号处的断点生效。

例如:

b 5 if i =10  //当i=10时第5行断点生效

4、set var 变量 =新变量  给某个变量赋值

5、info break 查看所有设置的断点

6、delete 断点编号 删除断点

7、run 开始运行程序

8、next 单步运行(不进入子函数)

9、step 单步运行(进入子函数)

10、 continue 继续运行程序

11、print(p) p为变量名,查看指定变量名的值

12、finish 运行程序,直到当前函数结束

13、watch 变量名 对指定变量名进行监控

14、quit 退出GDB

15、bt 显示所有的调试栈帧,该命令可以用来显示函数的调用顺序

16、clear 删除设置在特定文件、特定行上的断点

17、display EXPR 每次程序停止后显示表达式的值

18、file FILE  装在制定的可执行文件中进行调试

19、help name 显示指定命令的帮助信息

20、info func 显示所有函数的名称

21、info local 显示函数中的局部变量信息

22、info prog 显示被调试程序的执行状态

23、info var显示所有的全局和静态变量名称

24、kill 终止正在调试的程序

25、make 在不退出GDB的情况下,运行make工具。

26、print EXPR 显示表达式EXPR的值。

参考链接

https://baike.baidu.com/item/gdb/10869514?fr=aladdinGDB的百度百科

https://linux.cn/article-4302-1.html使用GDB进行调试的一个实例

http://blog.csdn.net/yyaong_520/article/details/6766831GDB调试命令详解

原文地址:https://www.cnblogs.com/noticeable/p/8361901.html

时间: 2024-11-09 20:43:38

3、利用GDB进行程序调试的相关文章

利用GDB对程序进行调试

第一章初涉调试会话 调试工具 GDB Unix下最常用的调试工具 DDD 基于GUI的调试器,大多数工具都是GDB的GUI前端. Eclipse IDE也是一种调试工具 atoi( )把字符串变为整数,头文件是include<stdlib.h> gcc -g -Wall -o insert_sort ins.c -g选项可以让编译器将符号表(对应于程序的变量和代码行的内存地址列表)保存在生成的可执行文件里中. 这样才能在调试会话的过程中引用源代码中的变量和行号,比如"在第30行停止&

Linux下C++的编程——GDB进行程序调试

GDB简介 我们在Linux下C++的编程--开偏介绍一文中已经简单介绍了GDB的功能,是类Unix系统的主要调试工具,可进行断点调试,跟踪程序,动态改变执行环境等功能. 从一个程序开始调试 下面我们就从一个程序开始讲解一下GDB的简单用法.假设我们有如下的程序: GDBTest1.cpp #include <iostream> int Accumulation(int n) { int result = 0; for(int i = 0; i < n; i ++) { result +

使用gdb进行程序调试1-在GDB中运行程序

在GDB中运行程序 一.启动程序 如果在启动gdb时没有指明程序,可以使用命令file或exec-file加载程序: run(r): run(r)命令使程序启动,可以在run命令中指明程序参数:值得注意的是,首次运行run后,如果再次执行run并且不带参数,会以之前的参数运行程序. set args: 指定程序的参数.set args后,run可以不带参数而以指定的参数运行程序.如果set args不太参数,清楚程序参数,执行run后程序不太参数运行. 在加载程序后,如果程序重新编译,gdb会根

c/c++程序调试

程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正. 减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,,可以尝试着在纸上写出核心代码,这样可以减少今后修改代码的时间. 1.常用的调试技巧 (1)代码检查,重新阅读程序,排除比较明显的错误.编译时带上-Wall参数,生成所有的警告信息.          gcc -Wall -pedantic -ansi   表示以ansi/iso生成所有的警告西信息. (2)取样法:在程

C/C++程序调试和内存检测

程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正.减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心代码,这样可以减少今后修改代码的时间.创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学C++能够持之以恒C++爱好群,如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给

GDB 程序调试简单实践

用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是很大,一般有错,直接看编译器编译结果就差不多知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows下面调试,但是总是不太方便,因此有必要看一下GDB调试方法和基本步骤. 下面是一个简单的演示: 首先创建一个有错误的代码,如下: 这个程序很简单,目的是接受用户的输入,并将用户的输入回应输出来. 但是这个程序的第17行有个错误,使用了未初始化的字符指针name,因此编译运行后会出现段错误,如下: 下面利用GD

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具. 分以下几个内容介绍: 1.调试之前的工作 2.选择调试工具 3.调试步骤 点我,请帮我投一票! 调试之前的工作 编译器在编译阶段需要产生可供调试的代码,才能被

20145311利用gdb调试汇编代码

利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const static long addend3 = 3; static int g(int x){    return x + addend1;} static const int f(int x){    return g(x + addend2);} int main(void){    retur

利用GDB在远程开发机进行调试

由于一些环境的制约,很多同学都可能需要在开发机上进行调试,但由于开发机资源的限制,在开发机上直接进行本地的GDB环境配置就成了难题,这个时候其实我们可以利用GDB中自带的gdbserver工具就可以进行远程开发机的调试. gdbserver可以走网络,串口等通信机制,对于网络来说支持ip:prot格式运行.比如你的开发机所在IP是192.168.3.11,你的机器是192.168.3.1,这个时候你首先先下好GDB的源码,然后进入到gdb_src/gdb/gdbserver目录下进行./conf