注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小可尼の博客

Linux后端的技术窝窝

 
 
 

日志

 
 

linux c 一个gdb调试程序的最简单例子  

2011-12-27 15:28:10|  分类: Linux的部分 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
linux c 一个gdb调试程序的最简单例子
开始学习linux c开发,
1、准备:
     需要工具gcc,gdb工具.
-bash-3.2$ cd /home/chenlong/
-bash-3.2$ mkdir linuxc003
-bash-3.2$ cd linuxc003
-bash-3.2$ whereis gcc 
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz
-bash-3.2$ whereis gdb
gdb: /usr/bin/gdb /usr/share/man/man1/gdb.1.gz
2、测试程序编写:
建立目录:mkdir include src(两个目录,一个为头文件include,一个为源文件src)
编写程序:src/sum.c
CODE:
#include <stdio.h>
main()
{
        int i,sum;
sum = 0;
for(i=0;i<100;i++)
{
sum += i;
}
printf("the sum of 1+2+3+....+99 is %d\n",sum);
}
3、执行gcc 编译
CODE:
[root@localhost str]# cd src
[root@localhost str]# gcc -g -o sum sum.c
-bash-3.2$ ls
sum  sum.c
4.测试 
CODE:
-bash-3.2$ ./sum 
the sum of 1+2+3...+99 is 4950
5. gdb调试
CODE:
-bash-3.2$ gdb sum
GNU gdb Red Hat Linux (6.5-37.el5_2.2rh)
Copyright (C) 2006 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-redhat-linux-gnu"...Using host libthread_db library "/lib/i686/nosegneg/libthread_db.so.1".
(gdb) list
1       #include <stdio.h>
2       main()
3       {
4               int i,sum;
5               sum=0;
6               for(i=0;i<100;i++)
7               {
8                       sum += i;
9               }
10              printf("the sum of 1+2+3...+99 is %d\n",sum);
(gdb) break 5
Breakpoint 1 at 0x8048395: file sum.c, line 5.
(gdb) run
Starting program: /home/chenlong/linuxc003/src/sum 
Breakpoint 1, main () at sum.c:5
5               sum=0;
(gdb) n
6               for(i=0;i<100;i++)
(gdb) n
8                       sum += i;
(gdb) n
6               for(i=0;i<100;i++)
(gdb) watch sum
Hardware watchpoint 2: sum
5.  参数
 GCC用于编译程序,而Linux的另一个GNU工具gdb则用于调试程序。
gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。
其最常用的命令如下:
  file:装入想要调试的可执行文件。 
  kill:终止正在调试的程序。 
  list:列表显示源代码。 
  next:执行一行源代码但不进入函数内部。 
  step:执行一行源代码而且进入函数内部。 
  run:执行当前被调试的程序 
  quit:终止gdb
  watch:监视一个变量的值 
  break:在代码里设置断点,程序执行到这里时挂起 
  make:不退出gdb而重新产生可执行文件
  shell:不离开gdb而执行shell
  下面我们来演示怎样用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,屏幕上将看到如下内容:
  list命令:
  list命令用于列出源代码,对上述程序两次运行list,将出现如下画面(源代码被标行号):
  根据列出的源程序,如果我们将断点设置在第5行,只需在gdb 命令行提示符下键入如下命令设置断点:(gdb) break 5,执行情况如下图:
  这个时候我们再run,程序会停止在第5行,如下图:
  设置断点的另一种语法是 break <function>,它在进入指定函数(function)时停住。
  相反的,clear用于清除所有的已定义的断点,clear <function>清除设置在函数上的断点, clear <linenum>则清除设置在指定行上的断点。
  watch命令:
   
  watch命令用于观查变量或表达式的值,我们观查sum变量只需要运行watch sum:
   watch <expr>为表达式(变量)expr设置一个观察点,一量表达式值有变化时,程序会停止执行。
  要观查当前设置的watch,可以使用info watchpoints命令。
  next、step命令:
   next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Old value和New value),如下图:
   next、step命令的区别在于step遇到函数调用,会跳转到到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。
  评论这张
 
阅读(610)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018