Ubuntu GDB调试

来源:互联网 发布:国家化妆品备案网数据 编辑:程序博客网 时间:2024/06/05 00:47

1.什么是GDB

对于程序员来说,最经常遇到的问题就是程序中的各种bug。因此我们需要一款自己喜欢并且功能强大的编译调试器,来调试并修正程序中的bug

虽然Windows中有很多功能强大,界面美观的IDE(集成开发环境),比如微软公司的Visual c++Visual statio 系列,都可以用来开发调试c语言或者c++程序,但是在linux中类似的编译器就比较少,比如比较熟知的Codeblocks,是一个跨平台的编译器,既可以在Windows中使用,也可以在linux中使用。

然而,在linux中还有一个更受大家欢迎的调试工具:GDBGDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。可以用来调试CC++程序。

 

2.GDB功能及其对应命令

GDB功能强大,调试命令也有很多,但是对于普通程序调试中经常使用的命令并不多,如下表所示:

命令形式                                     

功能解释

示例(gdb)

gdb

进入gdb调试

gdb

help

显示帮助信息

help

quit

退出GDB调试

qquit

file  <filename>

加载被调试的可执行程序文件(文件是经过编译之后形成的可执行文件,在编译时,应该加上-g 选项,比如 gcc -o test_gdb test_dgb.c -g)

file test_gdb 

list

列出文件的内容

l (list)

run

运行调试的程序(如果程序中没有设置断点,则程序会一直运行到结束或者出现异常结束,如果设置断点,则会在断点处停止)

r(run)

break <line number>

 

break <line number> if condition

 

break <function name>

在某一行设置普通断点。

(运行到该行即停止)

在某一行设置条件断点

(运行到改行满足条件停止)

在某一个函数调用处设置断点

(运行到函数调用处即停止)

b(break) 24

 

b 24 if index == 3

 

b getSum

delete <break number>

删除断点编号对应的断点

d(delete) 1

clear

清空所有的断点信息

clear

continue

继续执行程序直到下一个断点或者程序结束

c(continue)

next

单步调试

n(next)

step

遇到函数调用时,进入函数内部调试

s(step)

print <value>

显示变量的值

p(print) index

info <>

用来显示各类信息,详细请查看“help info

i(info) break

 

3.举例说明

例子程序如下所示:

 

#include <stdio.h>int getSum(int num1,int num2);int main(int argc, char *argv[]){int num1 = 20;int num2 = 30;int sum = 0;num1 = num1 - 10;sum = getSum(num1,num2);printf("The sum is %d\n", sum);return 1;}int getSum(int num1,int num2){printf("The numbers are %d and %d\n", num1,num2);return (num1 + num2);}

 

第一步:

对源程序进行编译,加上-g选项,使其可以进行调试。其结果是生成可执行文件test_gdb,并且可以对其进行gdb调试(对于该命令的详细解释,可以查看gcc命令)

 

第二步:

进入gdb调试:

 

如上图最后一行所示,代表进入gdb调试,等待用户命令输入。

 

第三步:

加载进行调试的可执行文件,方便进行调试,以及源程序的显示。命令如下:

 

显示加载成功。

 

第四步:

1)如果在设置断点之前,输入r

 

程序正常运行,打印输出结果,并正常退出。

(1)在运行之前,设置断点,为了确定设置断点的位置(行号)可以使用list(l)命令,显示出程序的内容,从而方便的设置断点

 

(2)设置断点

第一个断点设置在main函数的入口处,第二,三个断点为普通断点,第四个断点设置在函数调用的入口处,第5个断点为条件断点。

 

(3)开始调试运行

输入r开始运行,在第一个断点处(即main函数入口)停止运行。

 

此时打印输出num1的值,显示的并不是20,而是一个随机值,因为此时还没有完成初始化操作,如下所示:

 

输入n执行下一步,此时再次打印输出num1,即可完成初始化。

输入c,执行到第二个断点处停止运行。如下图所示

 

当程序执行到getSum函数的调用处时,执行s,进入到getSum函数内部,继续调试执行

 

一直进行单步调试,直到函数结束运行,退出函数的调用

 

在getSum函数结束之前以及结束之后分别打印输出sum值:

 

很明显,函数getSum完成计算num1num2的和之后并对sum赋值。

最后程序结束运行

 



以上内容虽然是原创,但是参考了http://blog.csdn.net/liigo/article/details/582231中的博客格式以及部分

0 0
原创粉丝点击