您的位置:首页 > 其它

gdb调试命令的使用

2016-07-09 15:20 441 查看
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]# ls
demo demo.c
要使用gdb调试要在编译时加上-g,才能够使用。

进入gdb调试:

[root@localhost 0709]# gdb demo
GNU 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 are
welcome 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) run
Starting program: /home/07/0709/demo
sum = 5050
add sum = 5065
Program exited normally.
使用(gdb) run 运行程序,如果程序设置了断点,那么将会在断点处停住。

b. 查看代码

(gdb) list
13 int tmp = 15;
14
15 return tmp + sum;
16 }
17
18 int main()
19 {
20 int i;
21
22 int sum = 0;
(gdb)
23
24 for(i = 1; i <= 100; i++)
25 {
26 sum += i;
27 }
28
29 printf("sum = %d\n", sum);
30
31 i = add_sum(sum);
32 printf("add sum = %d\n", i);
(gdb)
33
34 return 0;
35 }
(gdb)
Line number 36 out of range; demo.c has 35 lines.
使用(gdb) list 查看代码,每十行打印一次,知道打印完。如果要一次性打印完代码,如下

(gdb) list 13,35
13 int tmp = 15;
14
15 return tmp + sum;
16 }
17
18 int main()
19 {
20 int i;
21
22 int sum = 0;
23
24 for(i = 1; i <= 100; i++)
25 {
26 sum += i;
27 }
28
29 printf("sum = %d\n", sum);
30
31 i = add_sum(sum);
32 printf("add sum = %d\n", i);
33
34 return 0;
35 }
c. 设置断点

(gdb) break 26
Breakpoint 1 at 0x80483ba: file demo.c, line 26.
使用(gdb) break 26设置断点在26行。

d. 单步执行

(gdb) run
Starting program: /home/07/0709/demo

Breakpoint 1, main () at demo.c:26
26 sum += i;
(gdb) next
24 for(i = 1; i <= 100; i++)
(gdb) next

Breakpoint 1, main () at demo.c:26
26 sum += i;
要先执行(gdb) run,才能执行(gdb) next。单步执行,不会进入调用函数。

(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/07/0709/demo

Breakpoint 1, main () at demo.c:26
26 sum += i;
(gdb) step
24 for(i = 1; i <= 100; i++)
要先执行(gdb) run,才能执行(gdb) next。单步执行,会进入调用函数。

e. 单次执行

(gdb) continue
Continuing.

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

Breakpoint 1, main () at demo.c:26
26 sum += i;
单次执行,执行到下一次断点的位置。

f. 查看断点

(gdb) info break
Num Type Disp Enb Address What
1 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 break
No breakpoints or watchpoints.
删除断点时,删除的是断点的编号。

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

(gdb) break 26 if i=5
Breakpoint 2 at 0x80483ba: file demo.c, line 26.
(gdb) info break
Num Type Disp Enb Address What
2 breakpoint keep y 0x080483ba in main at demo.c:26
stop only if i = 5
当变量 i 的值为5的时候,设置断点。

j. 退出gdb

(gdb) quit
The program is running. Exit anyway? (y or n) y
You have mail in /var/spool/mail/root
我们知道gdb是一款功能十分强大的程序调试器。当执行(gdb) run 之后,程序停在哪一行,那一行就存在段错误。

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