Linux下进行GDB调试

标签: linux gdb 调试 | 发表时间:2013-01-01 17:31 | 作者:xiongyaoqiongyao
出处:http://blog.csdn.net

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具

一般来说,GDB主要帮助自己完成下面四个方面的功能;

1:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序

2:可以让被调试的程序在你所指定的调制的断点处停住(断点可以是条件表达式)

3:当程序被停住时,可以检查你的程序中发生的事

4:动态的改变你程序的执行环境


利用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 *


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


(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。


作者:xiongyaoqiongyao 发表于2013-1-1 17:31:58 原文链接
阅读:0 评论:0 查看评论

相关 [linux gdb 调试] 推荐:

Linux下gdb调试

- - CSDN博客移动开发推荐文章
关于gdb的其他客套话不多说,直接进入正题. 列出产生执行文件源代码的一部分. 执行一行源代码但不进入函数内部. 执行一行源代码而且进入函数内部. 监视一个变量的值,一旦值有变化程序停住. 1.新建一个源文件vi yrp.cc,源代码如下:. 2.生成可执行文件 g++ -g -o yrp yrp.cc  注意必须使用-g参数,编译会加入调试信息,否则无法调试执行文件..

Linux下进行GDB调试

- - CSDN博客推荐文章
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. 一般来说,GDB主要帮助自己完成下面四个方面的功能;. 1:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2:可以让被调试的程序在你所指定的调制的断点处停住(断点可以是条件表达式). 3:当程序被停住时,可以检查你的程序中发生的事.

Linux下gdb调试工具的使用

- - CSDN博客综合推荐文章
gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具. gdb主要完成四个方面的功能:(1)、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序;(2)、可让被调试的程序在你所指定的调试的断点处停住(断点可以是条件表达式);(3)、当程序被停住时,可以检查此时你的程序中所发生的事;(4)、动态的改变你程序的执行环境.

gdb调试工具

- - CSDN博客系统运维推荐文章
查看帮助一是man 命令,二是进入 www.gnu.org,找到gdb的帮助文档(更详细). gcc -Wall -g main.c -o main,只有这样才能产生调试信息,包括core的调试信息.     run(r)  运行,执行到断点,重新用r,表示重新开始执行.     list(l)  列出源代码,l 2,l main,l 2,16(数字表示行数).

[转]GDB调试多线程

- - 小彰
GDB 多线程调试基本命令 实现简介 以及一个问题的解决. 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 切换当前调试的线程为指定ID的线程.

GDB学习之道:GDB调试精粹及使用实例

- - CSDN博客系统运维推荐文章
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、. 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的. 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表.

使用 gdb 调试 Python 进程

- yinseny - python.cn(jobs, news)
有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump. 例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到哪行Python代码呢. 这时就需要祭出gdb这个神器了. 确认你的gdb版本是>=7,gdb从版本7开始支持对Python的debug.

用gdb+nm调试php c extension程序

- ndv - 淘宝核心系统团队博客
最近在写Beanstalkd的php c extension客户端程序,写程序离不开调试,下面把调试中碰到的问题和解决方法和大家分享一下. .so写好了是给php脚本调用的,如果php脚本执行崩掉了,.so也只能在进程中饮恨而终,这时候php脚本调试经常用的echo, print_r, var_dump都派不上用场了.

GDB调试精粹及使用实例

- - CSDN博客推荐文章
当出现EXE_BAD_ACCESS, SIGABRT 及其他Crash时可以尝试用:. 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、. 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的.

[C++] gdb高级调试方法

- - CSDN博客推荐文章
1,启动gdb的时候自动执行脚本. 注意:your_script里面只能有gdb命令. 不过我们都知道gdb命令里面有个shell指令,所以实际上这里可以做任何事. 在gdb里面有个attach指令,可以调试运行中的进程. 结合上面的-x参数,实际上我们可以写一个脚本,自动的attach到我们关心的进程上面,然后自动的做很多事情:比如设置trace命令并且continue.