gdb调试命令的使用

来源:互联网 发布:java窗口按钮大小 编辑:程序博客网 时间:2024/05/18 03:42

1、 gdb是一款功能强大的程序调试工具,它不仅能够启动被调试的代码,还能够让被调试的程序在指定位置停住等等。

2.、gdb调试常用命令

run

运行程序(如果有断点,会停在断点处)

list

查看代码(10行)

break 20

设置断点在20行

next

单步执行,但不会进入子函数

step

单步执行,能够进入子函数

continue

执行到下一个断点处

start

开始执行程序,停在main函数第一行语句前面等待命令

finish

执行到该函数运行结束

info  break

查看断点位置

delete  断点编号

删除断点

print  i

打印i的值

break 20 if  i=10

当i=20时,设置断点

break + 函数名

在调用该函数的时候停住

quit

退出gdb

set var

修改变量的值

backtrace

查看各级函数调用和参数

3、gdb调试程序的源代码

#include <stdio.h>int add_sum(int sum){    int tmp = 15;    return tmp + sum;}int main(){    int i;    int sum = 0;    for(i = 1; i <= 100; i++)    {        sum += i;    }    printf("sum = %d\n", sum);    i = add_sum(sum);    printf("add sum = %d\n", i);    return 0;}

4、gdb调试

[root@localhost 0709]# gcc -g demo.c -o demo[root@localhost 0709]# lsdemo  demo.c

要使用gdb调试要在编译时加上-g,才能够使用。

进入gdb调试:

[root@localhost 0709]# gdb demoGNU gdb Red Hat Linux (6.5-25.el5rh)Copyright (C) 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB.  Type "show warranty" for details.This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

a. 运行程序

(gdb) runStarting program: /home/07/0709/demo sum = 5050add sum = 5065Program exited normally.

使用(gdb) run 运行程序,如果程序设置了断点,那么将会在断点处停住。

b. 查看代码

(gdb) list 13          int tmp = 15;1415          return tmp + sum;16      }1718      int main()19      {20          int i;2122          int sum = 0;(gdb) 2324          for(i = 1; i <= 100; i++)25          {26              sum += i;27          }2829          printf("sum = %d\n", sum);3031          i = add_sum(sum);32          printf("add sum = %d\n", i);(gdb) 3334          return 0;35      }(gdb) Line number 36 out of range; demo.c has 35 lines.

使用(gdb) list 查看代码,每十行打印一次,知道打印完。如果要一次性打印完代码,如下

(gdb) list 13,3513          int tmp = 15;1415          return tmp + sum;16      }1718      int main()19      {20          int i;2122          int sum = 0;2324          for(i = 1; i <= 100; i++)25          {26              sum += i;27          }2829          printf("sum = %d\n", sum);3031          i = add_sum(sum);32          printf("add sum = %d\n", i);3334          return 0;35      }

c. 设置断点

(gdb) break 26Breakpoint 1 at 0x80483ba: file demo.c, line 26.

使用(gdb) break 26设置断点在26行。

d. 单步执行

(gdb) runStarting program: /home/07/0709/demo Breakpoint 1, main () at demo.c:2626              sum += i;(gdb) next24          for(i = 1; i <= 100; i++)(gdb) nextBreakpoint 1, main () at demo.c:2626              sum += i;

要先执行(gdb) run,才能执行(gdb) next。单步执行,不会进入调用函数。

(gdb) runThe program being debugged has been started already.Start it from the beginning? (y or n) yStarting program: /home/07/0709/demo Breakpoint 1, main () at demo.c:2626              sum += i;(gdb) step24          for(i = 1; i <= 100; i++)

要先执行(gdb) run,才能执行(gdb) next。单步执行,会进入调用函数。

e. 单次执行

(gdb) continue Continuing.Breakpoint 1, main () at demo.c:2626              sum += i;(gdb) continue Continuing.Breakpoint 1, main () at demo.c:2626              sum += i;

单次执行,执行到下一次断点的位置。

f. 查看断点

(gdb) info breakNum Type           Disp Enb Address    What1   breakpoint     keep y   0x080483ba in main at demo.c:26        breakpoint already hit 2 times

g. 打印变量的值

(gdb) print i$1 = 2

打印变量 i 的值。

h. 删除断点

(gdb) delete 1(gdb) info breakNo breakpoints or watchpoints.

删除断点时,删除的是断点的编号。

i. 测试变量的值设置断点

(gdb) break 26 if i=5Breakpoint 2 at 0x80483ba: file demo.c, line 26.(gdb) info breakNum Type           Disp Enb Address    What2   breakpoint     keep y   0x080483ba in main at demo.c:26        stop only if i = 5

当变量 i 的值为5的时候,设置断点。

j. 退出gdb

(gdb) quitThe program is running.  Exit anyway? (y or n) yYou have mail in /var/spool/mail/root

我们知道gdb是一款功能十分强大的程序调试器。当执行(gdb) run 之后,程序停在哪一行,那一行就存在段错误。

 

0 0
原创粉丝点击