gdb常用命令的用法

  今天花了几分钟来学习使用gdb调试程序,有过以前使用IDE调试程序的基础,仅仅只需要花几分钟就能够很快的学会使用gdb命令来调试程序了。这里结合实例来说明怎么使用gdb命令。首先写一个简单的程序,然后载对程序进行调试。

    用于调试的示例程序:

示例代码
 1 #include <stdio.h>
 2 
 3 int sum(int a, int b)
 4 {
 5     int result;
 6     result = a + b;
 7     return result;
 8 }
 9 
10 int main(int argc, char ** argv)
11 {
12     if (argc != 3)
13     {
14         printf("请输入2个数字参数,用空格分开");
15         return -1;
16     }
17     int a = *argv[1]-'0';
18     int b = *argv[2]-'0';
19     int re = sum(a,b);
20     printf("%d + %d = %d",a,b,re);
21     return 0;
22 }

 

  这个程序很简单,只做了个加法运算。现在我们开始调试程序了。

  1.编译生成。     

  IDE中分Debug和Release版本,那么在Linux我们一般编译这个文件使用:

    gcc -o testgdb testgdb.c 

    这就相当于IDE中的Release版本的编译生成工作了,那么怎么编译出Debug版本呢?这样,只需要添加 -g 命令就行:

    gcc -o testgdb testgdb.c -g

  2.进入调试状态,即进入dgb。 

    进入gdb有两种方式,一种是直接输入命令gdb。另一种是在gdb后面加上第一步编译好的文件名。进入到gdb调试状态后可以看到

GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 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 "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

(gdb)

    如果使用的是第一种方式,那么进入后得继续使用file命令来打开待调试的文件:(gdb)file testgdb

    会给出如下提示信息:

    Reading symbols from /home/hanxi/cpp/testgdb/testgdb...done.

  3.调试程序。   

    常用命令:

GDB常用命令 格式 含义 简写
list List [开始,结束] 列出文件的代码清单 l
prit Print 变量名 打印变量内容 p
break Break [行号或函数名] 设置断点 b
continue Continue [开始,结束] 继续运行 c
info Info 变量名 列出信息 i
next Next 下一行 n
step Step 进入函数(步入) S
display Display 变量名 显示参数  
file File 文件名(可以是绝对路径和相对路径) 加载文件  
run Run args 运行程序 r

 

    接下来对一个一个命令进行测试。(注:(gdb)后面是输入的命令和参数)

       (1):  (gdb)run 2 3    

    表示执行调试并传入两个参数2,3

    运行结果:

Starting program: /home/hanxi/cpp/testgdb/testgdb 2 3
2 + 3 = 5
Program exited normally. 

    这样就出现了计算结果,因为没有设置断点,所以就会执行完程序。下面就是使用设置断点的命令了。

       (2):    (gdb)b 4   

    表示在第4行设置断点,gdb给出以下提示说明设置断点成功

Breakpoint 1 at 0x80483ca: file testgdb.c, line 4.

    设置完断点后,我们再来运行程序,执行run命令。出现下面的提示信息:

Starting program: /home/hanxi/cpp/testgdb/testgdb 2 3

Breakpoint 1, sum (a=2, b=3) at testgdb.c:6
6 result = a + b;

    这样它停留在第6行了。我们怎么来继续执行了,使用c命令,相当于VS中的快捷键F5

    (3):     (gdb)c   

    继续执行程序,gdb给出以下提示信息

Continuing.
2 + 3 = 5
Program exited normally.

    这里又把程序执行完了,因为前面只设置一个断点。那么我们怎么知道设置了多少个断点呢?使用info break命令就能满足

    (4):     (gdb)info break   

    gdb给出了下面的提示信息: 

Num Type Disp Enb Address What
2 breakpoint keep y 0x080483ca in sum at testgdb.c:4
breakpoint already hit 1 time

    这信息提示我们,已经在第4行设置了一个断点,接下来就是去除断点的问题了,我们怎么把刚才的断点删除掉呢?在VS6.0是重复点工具栏的鼠型图标,在VS2010是点击每行的行首。在这里,我们也可以使用命令简单的删除或者禁用断点。删除断点的命令是delete b,禁用断点的命令是disable b。推荐使用disable b 命令。恢复禁用的断点的命令是enable b。这些命令后面可以带参数来说明第几个断点(是第几个不是第几行)。如:

    (5):     (gdb)disable b   

    然后执行run命令后就不会断点了,接着使用enable b命令后再使用run命令,这样又有了断点。有时候我们断点了就需要查看某个变量的值,那么使用什么命令查看变量的值和设置变量的值呢?答案是使用display或者是p

    (6):     (gdb)display result   

    这个效果在IDE中也有对应的:display相当于添加监听变量,每一次run后都会给出result的值。而print就对应着IDE中的鼠标停留时显示变量的值。

    (7):     (gdb)s   

    这是步入命令step,同样也有步过命令next(简写为n)。

  好吧,上面说的一些基本命令用来调试一些小代码差不多够用了,刚百度搜索了下,百度文库中有个不错的详细教程,如果有想深入的朋友可以进去Linux下GDB教程看看。 如果平时使用的时候忘记了命令也可以使用help命令来查看帮助信息,会提示一些命令的用法,只可惜是英语的,一般也能将就的看懂,实在看不懂的可以把可能的命令测试就ok了。下面是输入help命令后的信息:

List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

        上面的提示是:比如说你想查看断点(breakpoints)的信息可以使用help breakpoints命令。希望各位看了这文章的朋友们可以学到点东西!欢迎拍砖!

posted @ 2012-06-14 22:13  涵曦  阅读(11217)  评论(0编辑  收藏  举报