知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

Linux下进行GDB调试

发布时间:2014-09-05 15:21:58作者:知识屋

Linux下进行GDB调试
 
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具
一般来说,GDB主要帮助自己完成下面四个方面的功能;
1:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
2:可以让被调试的程序在你所指定的调制的断点处停住(断点可以是条件表达式)
3:当程序被停住时,可以检查你的程序中发生的事
4:动态的改变你程序的执行环境
  www.zhishiwu.com  
利用print命令可以检查各个变量的值。   
(gdb)print p (p为变量名)  print是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:  对程序中函数的调用   (gdb)print find_entry(1,0)   数据结构和其他复杂对象  (gdb)print *table_start   ={e=reference=’/000’,location=0x0,next=0x0}  值的历史成分   (gdb)print(为历史记录变量,在以后可以直接引用的值)
 
  因此,要想显示在h后面的10个元素,可以使用h@10:  (gdb)printh@10   =(-1,345,23,-234,0,0,0,98,345,10)  whatis命令可以显示某个变量的类型   (gdb)whatis p   type= int *
  www.zhishiwu.com  
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:  breakline-number 使程序恰好在执行给定行之前停止。  breakfunction-name 使程序恰好在进入指定的函数之前停止。  breakline-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。  breakroutine-name 在指定例程的入口处设置断点  如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:  (gdb)break filename:line-number   (gdb)break filename:function-name   要想设置一个条件断点,可以利用breakif命令,如下所示:   (gdb)break line-or-function if expr
 
finish结束执行的当前函数,显示其返回值
 
一个程序例子
 
源程序:tst.c  
1#include <stdio.h>   
2  
3int func(int n)   
4{  
 5int sum=0,i;  
 6for(i=0; i<=n; i++)   
7{   
8sum+=i;   
9}   
10return sum;   
11}   
12  
13  
14main()   
15{   
16int i;  
 17long result = 0;  
 18for(i=1; i<=100; i++)  
 19{   
20result += i;   
 
21}   
22  
23printf("result[1-100] = %d /n", result );   
24printf("result[1-250] = %d /n", func(250) );  
 25}   编译生成执行文件:(Linux下)  hchen/test>gcc -g tst.c -o tst   
使用GDB调试:  
hchen/test>gdb tst <---------- 启动GDB 
 GNUgdb 5.1.1   Copyright2002 Free Software Foundation, Inc.   GDBis free software, covered by the GNU General Public License, and youare   welcometo change it and/or distribute copies of it under certain conditions.  Type"show copying" to see the conditions.   Thereis absolutely no warranty for GDB. Type "show warranty" fordetails.   ThisGDB was configured as "i386-suse-linux"...  
 (gdb)l <-------------------- l命令相当于list,从第一行开始例出原码。 
 1#include <stdio.h>   
2  
3int func(int n)   
4{   
5int sum=0,i;  
 6for(i=0; i<=n; i++)   
7{   
8sum+=i;   
9}  
 10return sum;
 
整个过程:
首先写出源代码文件
 
写出之后进行编译生成不带.c的可执行文件
命令 gcc -g tst.c -o tst
再进行启用GDB来调试
 
gdbtst  www.zhishiwu.com  
 
(gdb)l l命令相当于list,从第一行开始例出原码。
 
(gdb)break 16 设置断点,在源程序16行处
 
breakfunc <-------------------- 设置断点,在函数func()入口处。
 
(gdb)infobreak 察看断点信息
(r)运行程序 ,run命令简写
 
(gdb)n <--------------------- 单条语句执行,next命令简写。
 
gdb)c <--------------------- 继续运行程序,continue命令简写。
 
(gdb)p sum
 
gdb)bt <--------------------- 查看函数堆栈。
 
(gdb)finish <--------------------- 退出函数。
 
 (gdb)c <--------------------- 继续运行。
 
gdb)q <--------------------- 退出gdb。
 
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜