您的位置:首页 > 其它

gdb调试器

2015-10-04 19:11 281 查看

GDB调试器

gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。

下面以一个简单程序为例,介绍gdb使用流程:

编辑文件test.c

#include "stdio.h"

int sum(int m);

int main()

{

int i,n = 0;

sum(50);

for(i = 1 ; i <= 50 ;i++)

{

n += i;

}

printf("The sum of 1-50 is %d \n",n);

}

int sum(int m)

{

int i,n =0;

for (i = 1; i <= m; i++)

{

n += i;

printf("The sum of 1-m is %d\n",n);

}

}

对test.c进行编译

hh@hh-virtual-machine:~$ gcc -g test.c -o test

注意:一定要加上 -g 选项,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。

启动调试

hh@hh-virtual-machine:~$ gdb test

注意:gdb进行调试的是可执行文件,而不是“.c”的源代码,因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。

“l” 查看载入的文件

(gdb) l
1   #include <stdio.h>
2   int sum(int m);
3   int main()
4   {
5       int i,n = 0;
6       sum(50);
7       for(i = 1 ; i <= 50 ;i++)
8       {
9           n += i;
10      }
(gdb) l
11      printf("The sum of 1-50 is %d \n",n);
12  }
13  int sum(int m)
14  {
15      int i,n =0;
16      for (i = 1; i <= m; i++)
17      {
18          n += i;
19          printf("The sum of 1-m is %d\n",n);
20      }


“b”设置断点

(gdb) b 6
Breakpoint 1 at 0x804842e: file test.c, line 6.

注意:gdb中利用行号设置断点是指代码运行到对应行之前停止,如上例,代码运行到第6行之前停止(并没有运行第6行)

“info b”查看断点情况

(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x0804842e in main at test.c:6


运行代码

(gdb) r
Starting program: /home/hh/test

Breakpoint 1, main () at test.c:6
6       sum(50);

可以看到,程序运行到断点处就停止了。

查看变量值“p”+变量名

(gdb) p n
$1 = 0
(gdb) p i
$2 = 134513851


“n”(next)单步运行

(gdb) n
The sum of 1-m is 1275
7       for(i = 1 ; i <= 50 ;i++)

“s”(step)单步运行

(gdb) s
9           n += i;


注意:它们之间的区别在于,若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。

10 . "c"恢复程序运行

(gdb) c
Continuing.
The sum of 1-50 is 1275
[Inferior 1 (process 6666) exited with code 031]

GDB最基本的命令有

gdb programm      启动GDB
list(或l)        列出源代码,接着上次的位置往下列,每次列10行
list 行号          列出从第几行开始的源代码
list 函数名        列出某个函数的源代码
b(break)          设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
delete            删除指定断点
run               开始运行程序
bt                打印函数调用堆栈
info  break         查看断点详细信息
p                 查看变量值
c                 从当前断点继续运行到下一个断点
backtrace(或bt)  查看当前栈的情况,即可以查看到哪些被调用的函数尚未返回
next(或n)        单步恢复程序运行,但不进入函数调用
step(或s)        执行下一行语句,如果有函数调用则进入到函数中
quit              退出GDB]

其他几个我认为应该掌握的调试命令有:

display 跟踪变量值的改变
until   跳出循环
finish  跳出函数
help    帮助

gdb使用时的注意点



在gcc编译选项中一定要加入“-g”




只有在代码处于“运行”或“暂停”状态时才能查看变量值




设置断点后程序在指定行之前停止

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: