linux gdb调试器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014104588/article/details/50575568

以下面的代码为例子,来说明gdb的使用。

#include <stdio.h>

int add_range1(int low, int high)
{
        int lower = low - 1;
        int higher = high +1;
        int sum = lower + higher;
        return sum;
}


int add_range2(int low, int high)
{
        int a = 1;
        int b = 2;
        int c = 3;
        int d = 4;
        low++;
        high++;
        printf("low + high = %d\n", low + high);
        printf("low - high = %d\n", low - high);
        int res = add_range1(low, high);
        printf("now wo call add_rang1 in add_range2\n");
        printf("add_range1 res = %d\n", res);
        return a + b + c + d;
}


int main(void)
{
        int result[100];
        result[0] = add_range1(1, 10);
        result[1] = add_range2(1, 100);
        printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]);

使用命令 gdb test.c -o test -g 来编译该文件,-g选项指定使用gdb调试器

再实行gdb test命令来用gdb调试test,如下

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-64.el7
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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/jason/gdb_learn/test...done.
(gdb) 

list 可以显示指定函数或者指定行周围的代码
list最大可以显示10行的代码,显示最大指定行或者指定函数名上方4行代码,和显示最大指定行或者指定函数名下方5行代码,再加上本行代码则一共10行代码。
list 的用法—list命令的缩写为 l

list function_name or list line_number

演示如下

(gdb) l add_range2
8       return sum;
9   }
10  
11  
12  int add_range2(int low, int high)
13  {
14      int a = 1;
15      int b = 2;
16      int c = 3;
17      int d = 4;

break 设置断点
break命令的缩写使 b ,用法如下

break function_name  or  break line_numbe
break ... if <condition>   该命令是当满足condition时才在该行停下,比如for循环。“...”可以是上面的function_name or line_number

设置好断点后,可以用info b命令来查看设置的的断点信息。

run 运行程序
如果没有断点则执行run的时候,程序将会运行完,若有断点,则会停留在断点处,等待用户命令来继续运行。

下面的输出就是在32行设置一个断点,然后用r命令运行到断点。

(gdb) l
23      printf("now wo call add_rang1 in add_range2\n");
24      printf("add_range1 res = %d\n", res);
25      return a + b + c + d;
26  }
27  
28  
29  int main(void)
30  {
31      int result[100];
32      result[0] = add_range1(1, 10);
(gdb) b 32
Breakpoint 1 at 0x400661: file test.c, line 32.
(gdb) r
Starting program: /home/jason/gdb_learn/test 

Breakpoint 1, main () at test.c:32
32      result[0] = add_range1(1, 10);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-78.el7.x86_64
(gdb) 

32 result[0] = add_range1(1, 10);这一行,使将要执行的代码,但是还没有执行。

continue命令表示继续执行程序
continue一定是用在run命令之后,它表示当运行中的程序,遇到断点后,要继续运行的时候可以用 c 这个命令,如果后面有断点则运行到断点处,如果没有断点,则运行完程序。所以 r命令只能运行一次,c命令可以运行许多次,但是c命令一定是运行再r命令之后。

next命令
next是单步调试命令,一行一行的运行程序。n命令也是使用在程序运行的基础上,所以n命令使用在r命令之后,普遍的情况是程序run到一个断点处停下来后,再使用n命令一步一步的执行。

step命令
如果该行的代码没有调用任何的函数,则step命令就相当于next命令,如果改行的代码调用了其他函数,则step表示进入这个函数内部执行。

print 命令
print打印一些变量或者表达试的值。用法如下

print expr

p命能自动的识别后面跟的表达式的类型。
示例如下

(gdb) n
7       int sum = lower + higher;
(gdb) p higher
$3 = 11
(gdb) p lower + higher
$4 = 11
(gdb) 

expr必须是该行已经程序中已经出现的变量或者表达式。
当需要查看一段连续内存空间的值的时间,可以使用GDB的“@”操作符,“@”的左边是第一个内存地址,“@”的右边则是想查看内存的长度。例如如下动态申请的内存:
int array = (int ) malloc (len * sizeof (int));
在GDB调试过程中这样显示出这个动态数组的值:
p *array@len

finish 命令

finish命令是运行完当前所处的函数,并打印返回值,函数调用等信息,一个示例如下

(gdb) finish
Run till exit from #0  add_range1 (low=1, high=10) at test.c:5
0x0000000000400670 in main () at test.c:32
32      result[0] = add_range1(1, 10);

until命令
until表示运行完当前所处的循环体的当前一轮循环就直接运行完所有的循环。

猜你喜欢

转载自blog.csdn.net/u014104588/article/details/50575568
今日推荐