linux学习之四---gdb调试

在Linux应用程序开发中,最常用的调试器是gdb。

一、启动和退出gdb

gdb调试的对象是可执行文件,而不是程序的源代码。如果要使一个可执行文件可以被gdb调试,那么使用编译器gcc编译时需要加入-g选项,-g选项告诉gcc在编译时加入调试信息,这样gdb才可以调试这个被编译的程序。

1.编译test.c源程序

gcc -g test.c -o test

./test

test.c中的源码为:

#include<stdio.h>

int get_sum(int n)
{
   int sum=0,i;
   for(i=0;i<n;i++)
   sum+=i;
   return sum;
}

int main()
{
   int i=100,result;
   result=get_sum(i);
   printf("1+2+...+%d=%d\n",i,result);
   return 0;
}

2.启动gdb

格式一:gdb test

直接输入上面的语句启动gdb,会得到gdb的版本信息,并进入gdb调试。

[email protected]:~/linux_lan/3$ gdb test

GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu

Copyright (C) 2013 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 "x86_64-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /home/pc/linux_lan/3/test...done.

格式二:gdb -q test

[email protected]:~/linux_lan/3$ gdb -q test

Reading symbols from /home/pc/linux_lan/3/test...done.

(gdb)

3.退出gdb

直接quit即可。

二、显示和查找程序源代码

1.list:显示10行代码,若再次运行该命令则显示接下来的10行代码。

2.list 5,10:显示第5到第10行代码。

3.list test.c:5,10:显示源文件test.c中的第5到第10行代码。调试含有多个源文件程序时使用。

4.list get_sum:显示get_sum函数周围的代码。

三、执行程序和获得帮助

执行程序格式:run

获得帮助格式:help list

help all

四、设置和管理断点

在调试程序时,往往需要程序在运行到某行、某个函数或某个条件时暂停下来,然后检查此时程序的状态,如各个变量的值、某个表达式的值等。因此需要设置断点,使程序在运行到某个位置暂停下来,来检查和分析程序。因此,学习设置和管理断点是非常必要的。

1.以行号设置断点

在gdb中,大部分都使用break命令来为程序设置断点,最常用的是为某行设置断点。

格式:break 7

执行后显示设置断点后的反馈信息:

(gdb) break 7

Breakpoint 1 at 0x400543: file test.c, line 7.

2.以函数名设置断点

格式:break get_sum

执行后显示设置断点后的反馈信息:

(gdb) break get_sum

Breakpoint 1 at 0x400533: file test.c, line 5.

3.以条件表达式设置断点

格式:break 7 if i==99

可以看到,程序运行到i==99时,程序中断在第7行:

(gdb) break 7 if i==99

Breakpoint 1 at 0x400543: file test.c, line 7.

4.特殊设置断点的方式

格式:watch i==99

这种会出现一个问题,直接执行上面语句,会显示如下:

(gdb) watch i==99

No symbol "i" in current context.

gdb提示在当前程序上下文中没有符号i,折算因为此时test程序没有运行,变量i未定义,为了解决这个问题,首先在第6行设置中断,然后使用run命令运行程序,程序暂停在第6行,此时i已被定义,所以watch i==99 设这断点成功。因为第6行断点已经没有用了,可以通过clear 6 命令删除该行的断点。

5.run命令

格式;run

执行该程序,直到程序结束或遇到断点。

6.clear命令 (删除设置的断点)

格式:clear 行数

显示:删除该行断点

(gdb) clear 7

已删除的断点 1

格式:clear 函数名

显示:删除该函数中的断点

(gdb) clear get_sum

已删除的断点 2

7.delete命令 (根据断点编号删除)

格式:delete 断点编号

8.info breakpoints  (查看当前设置的中断)

格式:info breakpoints

显示:

(gdb) info breakpoints

Num     Type           Disp Enb Address            What

1       breakpoint     keep y   0x0000000000400543 in get_sum at test.c:7

stop only if i==99

breakpoint already hit 1 time

11.使中断失效或有效

格式:disable 中断号

显示:第2个中断End被设为‘n’

(gdb) info breakpoints

Num     Type           Disp Enb Address            What

1       breakpoint     keep y   0x0000000000400543 in get_sum at test.c:7

stop only if i==99

breakpoint already hit 1 time

2       breakpoint     keep y   0x0000000000400533 in get_sum at test.c:5

(gdb) disable 2

(gdb) info breakpoints

Num     Type           Disp Enb Address            What

1       breakpoint     keep y   0x0000000000400543 in get_sum at test.c:7

stop only if i==99

breakpoint already hit 1 time

2       breakpoint     keep n   0x0000000000400533 in get_sum at test.c:5

五、查看和设置变量的值

当程序执行到中断点暂停执行时,往往要查看变量或表达式的值,来了解程序的执行状态,进而发现问题所在。

1.print命令

一般用来打印变量或表达式的值,也可以用来打印内存中某个变量开始的一段内存区域的内容,还可以用来对某个变量进行赋值。

格式:print 变量或表达式    打印变量或表达式的当前值

print 变量=值        对变量赋值

2.whatis命令

whatis命令用来显示某个变量或表达式值的数据类型。

格式:whatis 变量表达式

3.set命令

set命令用来给变量赋值

格式:set variable 变量=值

六、控制程序的执行

当程序执行到指定的中断点,查看了变量或表达式的值后,可以让程序继续运行。可以让程序一步一步地执行,也可以让程序一直运行下去直到下一个断点或运行完为止。

1.continue命令

让程序继续运行,直到下一个断点或运行完为止。

格式:continue

2.kill命令

该命令用于结束当前程序的调试,在gdb提示符下输入kill,gdb会询问是否退出当前程序的调试,输入y结束调试,输入n继续调试程序。

格式:kill

3.next和step命令

在调试程序时,有时会怀疑程序的错误可能出现在某个地方,那么可以使用next或step命令一次一条执行该段代码。next与step的区别是:如果遇到函数调用,next会把该函数调用当作一条语句来执行,再次输入next会执行函数调用后的语句,而step则会跟踪进入函数,一次一条地执行函数的代码,直到函数内的代码执行完,才执行函数调用后的语句。

4.nexti和stepi命令

nexti与stepi命令用来单步执行一条机器指令,注意不是单步执行一条语句。单步执行一条语句是next和step。通常一条语句由多条机器指令构成。

例如for(i=0;i<n;i++)

如果输入next或step一次即可执行完,但是单步执行一条语句,则这行语句要输入多个nexti和stepi才能执行完。

nexti与stepi的区别和next与step区别一样,不在赘述。

时间: 2024-07-28 14:05:41

linux学习之四---gdb调试的相关文章

linux应用开发-gdb调试

linux应用开发-gdb调试 一 gdb概念 gdb是GNU开发的linux下的调试工具 二 基本使用过程 1 进入调试程序的模式: gcc -g test.c -o test.out 2 开启gdb:            gdb test.out 3 运行程序:           run(r) 4 退出:               quit(q) 5 也可以先进入gdb在执行file装载要调试的文件 三 基本命令 1 设置断点:break(b) 行号 或 break(b)文件名:行号

Linux学习: 使用gdb和gdbserver进行远程调试

1.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,有很友好的图形化操作界面,而在Linux中使用的是没有图形界面的调试工具-GDB(听说eclipse支持GUI调试,暂未尝试),所以需要通过指令进行操作,下面逐步介绍gdb调试环境的搭建和使用方法. 2.gdb调试环境搭建 (1)下载gdb工具源码:http://www.gnu.org/softwar

Linux学习: 使用gdb和gdbserver进行调试

1.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,有很友好的图形化操作界面,而在Linux中使用的是没有图形界面的调试工具-GDB(听说eclipse支持GUI调试,暂未尝试),所以需要通过指令进行操作,下面逐步介绍gdb调试环境的搭建和使用方法. 2.gdb调试环境搭建 (1)下载gdb工具源码:http://www.gnu.org/softwar

【转】 linux编程之GDB调试

GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来 3 单步执行 4 运行时修改变量的值 5 跟踪路径 6 线程切换 等等 下面以以下程序为例 当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下: GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选项的时候,GCC会向程序中塞入一下信息,作为GDB调

Linux下使用GDB调试应用程序示例

GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长,尺有所短"就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式)

linux应用程序设计--GDB调试

GDB简介:GDB是GNU发布的一款功能强大的程序调试工具,GDB主要完成下面三个方面功能: 一.GDB的使用操作 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). GDB调试实例: 1.在linux下编写test.c程序: 1 #include <stdio.h> 2 3 int main() 4 { 5 int i; 6 long result = 0; 7 for(i=0;i<100;i++) 8 { 9 result

linux基础2——gdb调试器

gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功: 4." l " (小写l)命令可以查看当前代码是否是要执行的代码: 5.断点 b 行号/函数名字——作用是程序执行过程中会自动在断点处暂停,等待指令 info b—— 查看断点列表 d 编号——删除指定编号的断点 6.执行程序 r 回车——程序启动,执行到代码中第一个出现断点处暂停 7

Linux系统下GDB调试

GDB 一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) locals 查看当前栈帧局部变量的值 list(或l) 列出源代码,接着上次的位置往下列,每次列10行 list 行号 列出从第几行开始的源代码 list 函数名 列出某个函数的源代码 next(或n) 执行下一行语句 print(或p) 打印表达式的值,通过表达式可以修改变量的值或

linux学习之gdb调试工具篇

gdb 1.gdb介绍 本章介绍一种很强大的调试工具gdb,可以完全操控程序的运行,使得程序就像你手里的玩具一样,叫它走就走,叫它停就停,并且随时可以查看程序中所有的内部状态,比如各变量的值.传给函数的参数.当前执行的代码行等. 有了gdb以后,即使调试手段丰富了,调试的基本思想仍然是"分析现象->假设错误原因->产生新的现象去验证假设"这样一个循环,根据现象如何假设错误原因,以及如何设计新的现象去验证假设,这都需要非常严密的分析和思考,如果因为手里有了强大的工具就滥用而忽