`
8366
  • 浏览: 807068 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

GDB调试例子

阅读更多

2010-06-15: 调试一个在正运行的c程序

 

工作中会遇到需要debug一个运行中的c进程,debug步骤

 

1. ps -ef |grep xxx  找到进程的pid

 

2. gdb -p xxx  用gdb关联 这个c进程

 

3. dir /**/**   关联源程序的目录位置

 

4. b ***.c:行号  或者 b 方法名  设置断点

 

5. c  完成程序执行

 

6. info b 查看断点信息

 

7. delete 断点number 删除断点

 

8. step 进入函数内部

 

9. q 推出debug

 

 

 

1 #include
2
3 static char buff [256];
4 static char* string;
5 int main ()
6 {
7   printf ("Please input a string: ");
8   gets (string);  
9   printf ("\nYour string is: %s\n", string);
10 }

上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误:
$ gcc -o bugging -g bugging.c
$ ./bugging
Please input a string: asfd
Segmentation fault (core dumped)
为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行:
1.运行 gdb bugging 命令,装入 bugging 可执行文件;
2.执行装入的 bugging 命令 run;
3.使用 where 命令查看程序出错的地方;
4.利用 list 命令查看调用 gets 函数附近的代码;
5.唯一能够导致 gets 函数出错的因素就是变量 string。用print命令查看 string 的值;
6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为此,我们在第8行处设置断点 break 8;
7.程序重新运行到第 8行处停止,这时,我们可以用 set variable 命令修改 string 的取值; 例如:set variable string = (char*)malloc(100)
8.然后继续运行,将看到正确的程序运行结果。

例子二:

源程序:tst.c

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

编译生成执行文件:(Linux下)
cc -g tst.c -o tst

使用GDB调试:

gdb tst  <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-SuSE -linux"...
(gdb) l     <-------------------- l命令相当于list,从第一行开始例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <-------------------- 直接回车表示,重复上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;   
(gdb) break 16    <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <-------------------- 查看断点信息。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <--------------------- 运行程序,run命令简写
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <---------- 在断点处停住。
17               long result = 0;
(gdb) n          <--------------------- 单条语句执行,next命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <--------------------- 继续运行程序,continue命令简写。
Continuing.
result[1-100] = 5050       <----------程序输出。

Breakpoint 2, func (n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <--------------------- 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <--------------------- 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d \n", func(250) );
Value returned is $6 = 31375
(gdb) c     <--------------------- 继续运行。
Continuing.
result[1-250] = 31375    <----------程序输出。

Program exited with code 027. <--------程序退出,调试结束。
(gdb) q     <--------------------- 退出gdb。

 

 

参考:

http://unix-cd.com/unixcd12/article_7137.html

 

gdb参数详解(整理过)

 

分享到:
评论

相关推荐

    Ubuntu GDB调试例子

    ### Ubuntu GDB调试详解 #### 一、GDB概述 GDB(GNU Debugger)是一款功能强大的命令行程序调试工具,广泛应用于Unix/Linux操作系统环境中。它主要用于C和C++程序的调试,但也可用于其他多种语言的程序调试。GDB...

    GDB调试实例

    ### GDB调试实例详解 #### 一、GDB概述 GDB(GNU Debugger)是由GNU开源组织发布的强大程序调试工具,适用于UNIX系统及其类UNIX环境(如Linux)。相较于图形界面的调试工具(如Visual Studio、Borland C++ Builder...

    gdb调试常用命令及调试例子

    本资料主要围绕“gdb调试常用命令及调试例子”展开,旨在为开发者提供一份实用的手册。 首先,我们需要了解GDB的基本使用。启动GDB通常通过在终端输入`gdb &lt;program&gt;`,其中是你要调试的可执行文件。进入GDB后,你...

    堆栈溢出调试-gdb-例子

    通过列举linux平台下的例子,并结合gdb描述了堆栈溢的过程。

    gdb调试标准教程gdb学习必备

    这篇教程是学习GDB调试的重要资源,适合嵌入式开发人员使用,因为它能够帮助理解并解决程序中的错误和问题。 GDB的基本功能包括: 1. **启动程序**:你可以通过GDB来启动你的程序,并根据需要定制运行参数,如传入...

    gdb调试费方法详解[含例子]

    《GDB调试方法详解》 GDB,全称GNU Debugger,是GNU开源组织提供的一款强大的程序调试工具,尤其适用于UNIX操作系统。尽管许多开发者可能更倾向于使用具有图形界面的调试器,如VC或BCB,但在UNIX环境下,GDB展现出...

    gdb调试器详解

    ### gdb调试器详解 #### 一、gdb概述与重要性 gdb(GNU Debugger)是一种功能强大的开源调试工具,广泛应用于Unix/Linux平台上的程序调试。对于任何软件开发者而言,编写无bug的代码几乎是一项不可能完成的任务。...

    linux下GDB调试

    下面通过一个具体的例子来展示如何使用GDB进行调试: **源代码示例:** ```c #include int func(int n) { int sum = 0, i; for (i = 0; i ; i++) { sum += i; } return sum; } int main() { int i; long ...

    GDB调试工具教程

    GDB(GNU Debugger)是一个广泛使用的命令行调试工具,尤其在Unix-like系统中,它为开发者提供了深入程序内部运行情况的能力。GDB的核心功能包括: 1. **启动程序**:你可以通过GDB来启动你的程序,并且可以设置...

    GDB调试命令手册

    19. quit:退出GDB调试环境。 20. run:启动被调试的程序,可以带参数来模拟程序启动时的环境。 21. search:在源代码中搜索字符串或正则表达式。 22. set variable(或简写为set):为程序中的变量赋予新的值。 ...

    GDB调试和例子

    GDB(GNU调试器)是Linux环境中用于C和C++程序调试的强大工具,它提供了丰富的功能,帮助开发者在运行时检查程序的内部状态。通过GDB,你可以: 1. **列文件清单**:使用`list`命令查看源代码,例如`list line1,...

    gdb调试工具详解

    ### gdb调试工具详解 #### GDB概述与优势 GDB,全称为GNU Debugger,是由GNU开源组织发布的强大调试工具,专为Unix系统设计,但在包括Linux在内的多种操作系统中都有广泛应用。GDB之所以受到青睐,主要归功于其...

    GDB调试工具指南.pdf

    ### GDB调试工具指南 #### 一、GDB简介与安装 GDB(GNU Debugger)是GNU项目下的一款开源调试工具,广泛应用于Linux系统中。它可以帮助开发者在程序运行时进行断点设置、变量查看、单步执行等操作,从而有效地定位...

    GDB调试方法

    ### GDB调试方法详解 #### 一、GDB简介 GNU调试器(GDB)是一款功能强大且广泛使用的开源调试工具,适用于多种编程语言,包括C、C++、Objective-C、Fortran等。GDB主要在字符模式下运行,通过一系列的命令帮助...

    使用GDB调试linux软件

    【使用GDB调试Linux软件】 在Linux环境中,开发和维护软件的过程中,调试是必不可少的一环。GDB(GNU调试器)作为一个强大的工具,为开发者提供了深入洞察程序内部工作原理的能力。GDB允许用户查看程序的内存布局,...

    linux下使用GDB调试程序

    以下是一个简单的例子,展示了如何使用GDB调试C语言程序: 首先,编写一个名为`test.c`的源文件,其中包含了一个计算阶乘的函数`func`和一个主函数`main`。 ```c #include int func(int n) { int sum=0, i...

    用GDB调试程序

    ### GDB调试程序知识点详解 #### 一、GDB简介 **GDB**(GNU Debugger)是由GNU项目开发的一款开源的、功能强大的程序调试工具。它最初设计用于UNIX平台,并逐渐扩展支持包括Linux在内的多种操作系统。与Visual ...

    gdb_linux下的应用程序GDB调试方法

    接下来,我们将通过一个具体的例子来演示如何使用GDB进行调试。假设我们有以下简单的C程序: ```c #include int func(int n) { int sum = 0, i; for (i = 0; i ; i++) { sum += i; } return sum; } int ...

    用GDB调试linux程序

    在这个例子中,我们编译生成了带调试信息的可执行文件`tst`,然后使用GDB启动调试会话。在GDB中,我们使用`list`(或简写`l`)命令查看源代码,通过直接回车重复上一个命令,查看函数`func`和`main`的定义。接下来,...

    GDB调试实例.pdf

    【GDB调试实例详解】 GDB(GNU Debugger)是一款强大的命令行程序调试工具,尤其在UNIX/Linux环境下广泛使用。对于那些在Windows系统下工作但需要跨平台开发的程序员和程序爱好者,掌握GDB的使用至关重要。尽管GDB...

Global site tag (gtag.js) - Google Analytics