GDB调试 小结

本文介绍使用GDB进行C调试

参考:用gdb调试程序笔记: 以段错误(Segmental fault)为例

GDB操作基本命令

1.编写调试测试代码如下

bugging.c--1到100的求和函数,代码调试

/* bugging.c */

#include <stdio.h>

int foo(int n)
{

    int sum;
    int i;

    for (i=0; i<=n; i++)
    {
        sum = sum+i;
    }

    return sum;
}

int main(int argc, char** argv)
{
    int result = 0;
    int N = 100;

    result = foo(N);

    printf("1+2+3+...+%d= %d\n", N, result);

    return 0;

}

1.如果要调试程序,需要在 gcc 编译可执行程序时加上 -g 参数,首先我们编译 bugging.c 程序,生成可执行文件bugging:其中 -o 指定输出文件名, -m32 表示构建32位可执行程序,楼主的环境是 64 位的 Ubuntu 14.04,所以默认会编译为 64 位的程序

gcc -g -o bugging bugging.c -m32

对编译文件进行验证

结果出错,说明有逻辑错误,如下开始使用GDB进行在线调试!

2.下载gdb调试软件进行调试

GDB 概述:
 GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC、 VS,BCB等 IDE的调试,但如果你是在 UNIX平台下做软件,你会发现 GDB这个调试工具有比 VC、 BCB的图形化调试器更强大的功能。所谓 “寸有所长,尺有所短 ”就是这个道理。 一般来说, GDB主要帮忙你完成下面四个方面的功能:  
1 、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。  
2 、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)  
3 、当程序被停住时,可以检查此时你的程序中所发生的事。
4 、动态的改变你程序的执行环境。
从上面看来, GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现 GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
在网上找一个链接使用wget下载!

# 下载代码压缩包
wget http://labfile.oss.aliyuncs.com/courses/496/gdbtest.zip
# 解压
unzip gdbtest.zip
# 进入到代码目录查看文件列表
cd gdbtest/
ls -l

如图:

接下来开始使用GDB调试


root@ubuntu:/home/skyler/share/Justin/gdb/gdbtest# ./bugging<---------- 启动程序--逻辑错误
1+2+3+...+100= -144836892
root@ubuntu:/home/skyler/share/Justin/gdb/gdbtest# gdb bugging<---------- 启动 GDB
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from bugging...done.
(gdb) r<-------------------- r--run运行指令,查看全速运行结果如下
Starting program: /home/skyler/share/Justin/gdb/gdbtest/bugging
1+2+3+...+100= -136153372
[Inferior 1 (process 6159) exited normally]
(gdb) l<-------------------- l 命令相当于 list,从第一行开始例出原码
7
8           int sum;
9           int i;
10
11          for (i=0; i<=n; i++)
12          {
13              sum = sum+i;
14          }
15
16          return sum;
(gdb)
17      }
18
19      int main(int argc, char** argv)
20      {
21          int result = 0;
22          int N = 100;
23
24          result = foo(N);
25
26          printf("1+2+3+...+%d= %d\n", N, result);
(gdb)
27
28          return 0;
29
30      }
31
(gdb) break 9 <-------------------- 在第9行设置断点!设置断点之后再输入运行
Breakpoint 1 at 0x8048411: file bugging.c, line 9.
(gdb) r<--------------------r-run运行调试指令
Starting program: /home/skyler/share/Justin/gdb/gdbtest/bugging

Breakpoint 1, foo (n=100) at bugging.c:11
11          for (i=0; i<=n; i++)
(gdb) p i<-------------------- 查看此处的变量i
$1 = 1
(gdb) p sum<-------------------- 查看此处的变量sum
$2 = -136158422
(gdb)           <-------------------- 空格代表下一次变量值查看
$3 = -136158422
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/skyler/share/Justin/gdb/gdbtest/bugging

Breakpoint 1, foo (n=100) at bugging.c:11
11          for (i=0; i<=n; i++)
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048411 in foo at bugging.c:9
        breakpoint already hit 1 time
(gdb) p sum
$4 = -136158422
(gdb) p i
$5 = 1
(gdb)
$6 = 1
(gdb) n
13              sum = sum+i;
(gdb) p i
$7 = 0
(gdb)
$8 = 0
(gdb) n
11          for (i=0; i<=n; i++)
(gdb) p i
$9 = 0
(gdb) n
13              sum = sum+i;
(gdb) p i
$10 = 1
(gdb) n
11          for (i=0; i<=n; i++)
(gdb) p i
$11 = 1
(gdb) n
13              sum = sum+i;
(gdb) n
11          for (i=0; i<=n; i++)
(gdb) n
13              sum = sum+i;
(gdb) p i
$12 = 3
(gdb) p sum
$13 = -136158419
(gdb) finish
Run till exit from #0  foo (n=100) at bugging.c:13
0x08048458 in main (argc=1, argv=0xffffd684) at bugging.c:24
24          result = foo(N);
Value returned is $14 = -136153372
(gdb) quit<-------------------- quit退出调试指令

经过调试发行,sum的初值是一个随机数,未初始化就使用是常见的低级错误;

此处只要,在sum处定义是赋值初值0;即可修复bug!


其他常用的gdb指令

(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     <--------------------- 继续运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxilang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值