Linux下GDB调试程序

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

    一般来说,GDB主要帮忙你完成下面四个方面的功能:
启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
当程序被停住时,可以检查此时你的程序中所发生的事。
动态的改变你程序的执行环境。
调试指令:
gdb+a.out
l :从main函数开始开始
l + 行号
l + 函数名
b + 行号:设断点
b + 函数名
i b:查看断点信息
r:执行(有断点则在第一个断点处停下来)
n:单步向下执行
s:单步执行,且可以进入函数
print +内容:打印内容
whatis +内容:查看该内容的类型
d +编号:删除编号处(不是行号)的断点。
b +行号 if i==9:设置条件断点
finish:执行到当前函数返回处(退出函数)
bt:打印栈帧关系

先写一个简单程序来调试一把:

#include<stdio.h>

int Add(int a,int b)
{   
    int ret = 0 ;
    ret = a + b;
    return ret;
}

int main()
{

    int a = 10;
    int b = 20;
    int ret = Add(a,b);
    printf("ret = %d\n",ret);
    return 0;
}

调试过程:

[root@localhost gdbtmp]# ls
tmp  tmp.c
[root@localhost gdbtmp]# gdb tmp //启动调试
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
Copyright (C) 2010 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 "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/centos/code/gdbtmp/tmp...done.
(gdb) b 5 //设置断点,在源程序第5行处。
Breakpoint 1 at 0x80483ca: file tmp.c, line 5.
(gdb) b 10//设置断点,在源程序第10行处。
Breakpoint 2 at 0x80483eb: file tmp.c, line 10.
(gdb) i b//查看断点信息
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x080483ca in Add at tmp.c:5
2       breakpoint     keep y   0x080483eb in main at tmp.c:10
(gdb) r //运行程序,run命令简写
Starting program: /home/centos/code/gdbtmp/tmp 

Breakpoint 2, main () at tmp.c:13   //在断点处停住。
13      int a = 10;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
(gdb) n  //单条语句执行,next命令简写。
14      int b = 20;
(gdb) n   //单条语句执行,next命令简写。
15      int ret = Add(a,b);
(gdb) c  //继续运行程序,continue命令简写。
Continuing.

Breakpoint 1, Add (a=10, b=20) at tmp.c:5
5       int ret = 0 ;
(gdb) n
6       ret = a + b;
(gdb) p i 
No symbol "i" in current context.
(gdb) p a  //打印变量a的值,print命令简写。
$1 = 10
(gdb) p ret
$2 = 0
(gdb) c  //继续运行程序,continue命令简写。
Continuing.
ret = 30

Program exited normally.
(gdb) q //退出gdb。

简单的栗子希望能理解

下来再来看看其他技巧
    一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

cc -g hello.c -o hello
g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:
1、gdb
program也就是你的执行文件,一般在当然目录下。
2、gdb core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:
-symbols
-s
从指定文件中读取符号表。
-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。
-core
-c
调试时core dump的core文件。
-directory
-d
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

猜你喜欢

转载自blog.csdn.net/qq_38646470/article/details/79901401