GDB调试器

来源:互联网 发布:网络阅读的好处议论文 编辑:程序博客网 时间:2024/06/05 00:48
GCC用于编译程序,而Linux的另一个GNU工具gdb则用于调试程序。gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。
其最常用的命令如下:

  file:装入想要调试的可执行文件。
  kill:终止正在调试的程序。
  list:列表显示源代码。
  next:执行一行源代码但不进入函数内部。
  step:执行一行源代码而且进入函数内部。
  run:执行当前被调试的程序
  quit:终止gdb
  watch:监视一个变量的值

  break:在代码里设置断点,程序执行到这里时挂起

        info break:查看所设断点

  make:不退出gdb而重新产生可执行文件

        shell:不离开gdb而执行shell

        print:打印变量的值


  下面我们来演示怎样用GDB来调试一个求0+1+2+3+…+99的程序:

/* Filename:sum.c */
main()
{
int i, sum;
sum = 0;
for (i = 0; i < 100; i++)
{
sum + = i;
}

printf("the sum of 1+2+...+ is %d", sum);
}
  执行如下命令编译sum.c(加-g选项产生debug信息):

gcc –g –o sum sum.c

  在命令行上键入gdb sum并按回车键就可以开始调试sum了,再运行run命令执行sum,屏幕上将看到如下内容:
yc@yc-virtual-machine:~$ gdb sum
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/yc/sum...done.
(gdb) run
Starting program: /home/yc/sum
the sum of 1+2+...+100 is 4950[Inferior 1 (process 15784) exited with code 036]

  list命令:

  list命令用于列出源代码,对上述程序两次运行list,将出现如下画面(源代码被标行号):
(gdb) list
1    main()
2    {
3        int i, sum;
4        sum = 0;
5        for(i = 0; i < 100; i++)
6        {
7            sum += i;
8        }
9        printf("the sum of 1+2+...+100 is %d", sum);
10    }

  根据列出的源程序,如果我们将断点设置在第4行,只需在gdb 命令行提示符下键入如下命令设置断点:(gdb) break 4,执行情况如下图:
(gdb) break 4
Breakpoint 1 at 0x80483ed: file sum.c, line 4.

  这个时候我们再run,程序会停止在第4行,如下图:
(gdb) run
Starting program: /home/yc/sum

Breakpoint 1, main () at sum.c:4
4        sum = 0;

  设置断点的另一种语法是 break <function>,它在进入指定函数(function)时停住。

  相反的,clear用于清除所有的已定义的断点,clear <function>清除设置在函数上的断点, clear <linenum>则清除设置在指定行上的断点。

  watch命令:
   
  watch命令用于观查变量或表达式的值,我们观查sum变量只需要运行watch sum:
(gdb) watch sum
Hardware watchpoint 2: sum

   watch <expr>为表达式(变量)expr设置一个观察点,一量表达式值有变化时,程序会停止执行。

  要观查当前设置的watch,可以使用info watchpoints命令。

  next、step命令:

   next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Old value和New value)

   next、step命令的区别在于step遇到函数调用,会跳转到到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。
原创粉丝点击