C编译: 使用gdb调试

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 

 

gdb是the GNU Debugger的简称。它是一款UNIX平台的调试器(debugger),可用于为C, C++, Objective-C, Java, Fortran等程序debug。

在gdb中,你可以通过设置断点(break point)来控制程序运行的进度,并查看断点时的变量和函数调用状况,从而发现可能的问题。在许多IDE中,gdb拥有图形化界面。

这里主要介绍gdb的命令行使用,并以C程序为例。测试使用的计算机是Mac OS系统。

 

启动gdb

下面的有两个C文件。(并没有bug。我们使用gdb来查看程序运行的细节)

程序的一个为test.c,其中有主程序main()。mean.c程序中定义了mean()函数,并在main()中调用。

test.c

#define ARRAYSIZE 4

float mean(float, float);

int main()
{
    int i;
    float a=4.5;
    float b=5.5;
    float rlt=0.0;

    float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
    float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};
    float array_rlt[ARRAYSIZE];

    for(i = 0; i < ARRAYSIZE - 1; i++) {
        array_rlt[i] = mean(array_a[i], array_b[i]);
    }

    rlt = mean(a, b);

    return 0;
}

 

mean.c

float mean(float a, float b)
{
   return (a + b)/2.0;
}

 

使用gcc同时编译上面两个程序。为了使用gdb对进行调试,必须使用-g选项(在编译时生成debugging信息):

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

生成main可执行文件。

(如有必要,使用:

$chmod +x test

来增加用户的执行权限。)

 

进入gdb,准备调试程序:

$gdb test

进入gdb的互动命令行。

 

显示程序

我们可以直接显示某一行的程序,比如查看第9行程序:

(gdb) list 9

将显示以第9行为中心,总共10行的程序。我们实际上编译了两个文件,在没有说明的情况下,默认为主程序文件test.c:

4
5    int main()
6    {
7        int i;
8        float a=4.5;
9        float b=5.5;
10        float rlt=0.0;
11
12        float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
13        float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};

 

如果要查看mean.c中的内容,需要说明文件名:

(gdb) list mean.c:1

 

可以具体说明所要列出的程序行的范围:

(gdb) list 5, 15

即显示5-15行的程序。

 

显示某个函数,比如:

(gdb) list mean

 

设置断点

我们可以运行程序:

(gdb) run

程序正常结束。

 

运行程序并没有什么有趣的地方。gdb的主要功能在于能让程序在中途暂停。

断点(break point)是程序执行中的一个位置。在gdb中,当程序运行到该位置时,程序会暂停,我们可以查看此时的程序状况,比如变量的值。

 

我们可以在程序的某一行设置断点,比如:

(gdb) break 16

将在test.c的第16行设置断点。

 

你可以查看自己设置的断点:

(gdb) info break

每个断点有一个识别序号。我们可以根据序号删除某个断点:

(gdb) delete 1

也可以删除所有断点:

(gdb) delete breakpoints

 

查看断点

设置断点,并使用run运行程序,程序将运行到16行时暂停。gdb显示:

Breakpoint 1, main () at test.c:16
16        for(i = 0; i < ARRAYSIZE - 1; i++) {

 

查看断点所在行:

(gdb) list

 

查看断点处的某个变量值:

(gdb) print a

(gdb) print array_a

 

查看所有的局部变量:

(gdb) info local

 

查看此时的栈状态 (反映了函数调用,见Linux从程序到进程):

(gdb) info stack

 

可以更改变量的值。

(gdb) set var a=0.0

(gdb) set var array_a={0.0, 0.0, 1.0, 1.0}

当程序继续运行时,将使用更改后的值。

 

如果我们将断点设置在:

(gdb) break mean.c:2

此时栈中有两个a,一个属于main(),一个属于mean()。我们可以用function::variable的方式区分:

(gdb) print mean::a

 

运行控制

让程序从断点开始,再多运行一行:

(gdb) step

也可以使用下面命令,从断点恢复运行,直到下一个断点:

(gdb) continue

使用run重新开始运行。

 

帮助

你可以通过gdb的帮助学到更多:

(gdb) help

或者更具体的命令:

(gdb) help info

 

退出

使用下面命令退出gdb:

(gdb) quit

 

debug

下面是一个有bug的C程序,demo.c

#include <stdio.h>

struct node {
    int element;
};

typedef struct node *PNode;

int main()
{
    int i;
    PNode np=NULL;

    for (i=0; i<10; i++) {
        printf("Hello World!");
    }

    printf("%d \n", np->element);
}

程序可以成功编译,但运行将返回:

Segmentation fault

可以使用gdb来查找问题。

 

Updata:

水土精灵提醒: gdb命令可以只输入首字母的缩写,比如c代表continue,b代表break,q代表quit。

时间: 2024-09-20 06:36:56

C编译: 使用gdb调试的相关文章

openjdk在ubuntu下编译通过后,我该怎么用gdb调试呢 (小的只有5金币 只能悬赏那么多了 )

问题描述 情景是这样的:ubuntu下成功编译openjdk7 接下来 我想先单步调试javac 看看它里边是怎么运行的 等把javac弄清楚了 在去看看jvm内部可是 在用gdb调试javac时 提示错误 我google了一下 原因可能是在编译openjdk时 没有添加调试信息我转去看看的它makefile 期待能在里边加上个gcc -g 这样的段子 可是我发现它的makefile是一层套一层 以小的的功力 基本是看不懂所以 我就想求教大大们 大家编译过openjdk7后 怎么调试它的啊(ub

nginx模块_使用gdb调试nginx源码

工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段. ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正. 熟悉gdb的使用 这里就不说了,谷歌一搜一堆,这里推荐一篇文章:GDB 命令详细解释 请重点看一下step,run,break,list,info,continue命令 下载nginx源码 这里使用nginx-1.0.14 src是源代码,auto文件夹是configure运行时候的各种命令集合 修改config并编译

Xcode的gdb调试

关于GDB 对于大多数Cocoa程序员来说,最常用的debugger莫过于Xcode自带的调试工具了.而实际上,它正是gdb的一个图形化包装.相对于gdb,图形化带来了很多便利,但同时也缺少了一些重要功能.而且在某些情况下,gdb反而更加方便.因此,学习gdb,了解一下幕后的实质,也是有必要的. gdb可以通过终端运行,也可以在Xcode的控制台调用命令.本文将通过终端讲述一些gdb的基本命令和技巧. 首先,我们来看一个例子:     #import <Foundation/Foundation

gcc/g++编译器和gdb调试器

gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld] [参数详解]-x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C

经典的GDB调试命令

导语 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: print print / 是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x.   一.表达式 print和许多GDB的命令一样,可以接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运行中的cons

gcc-怎么用GDB调试数据库找错。

问题描述 怎么用GDB调试数据库找错. 用gcc怎么编译数据库,然后用gdb调试数据库,找出数据库中的错误,然后进行改正. 解决方案 gdb不是用来调试数据库的.你要调试数据库,要用数据库提供的工具.比如sql server提供的profiler. 解决方案二: 数据库?那应该是直接用数据库客户端来连接测试 解决方案三: gcc 编译,命令行示例网上很多,Debug 模式就可以调试.数据库中的错误,需要你分析代码. 当然, GDB 可以调试对数据库的使用代码,但分析代码还是要依赖人.

比较全面的gdb调试命令

用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成.在这里并不是要和Win

《深入剖析Nginx》——第2章  跟踪与调试2.1 利用gdb调试

第2章 跟踪与调试 跟踪与调试,不仅是我们解决程序Bug的有力途径,也是帮助我们理解现有代码的有效方法.通过跟踪程序执行的过程,我们可以清楚地了解程序的内部逻辑,对于不明就里的实现细节,调试查看程序内部变量也能更好地帮助我们做出正确的理解.本章将介绍一些跟踪与调试程序的方法,除了最基本的 gdb 调试,我还将结合个人经验,介绍一些相对高级的应用技巧. 2.1 利用gdb调试 gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb

《深入剖析Nginx》一2.1 利用gdb调试

2.1 利用gdb调试 深入剖析Nginx gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb本身的详细用法,我们不多详述,读者可以参考gdb官网手册1,而在这里,我们将重点介绍一些与Nginx相关的注意点与调试技巧. 2.1.1 绑定Nginx到gdb 利用gdb调式Nginx,首先得在生成Nginx程序时把-g编译选项打开.当然,这并不是说不打开-g选项就无法用gdb调试它,只是会因为缺少相应的符号信息导致调试不便,而此