gdb调试技巧(二)———— gdb 条件断点

43 篇文章 0 订阅
21 篇文章 0 订阅



《一日二十四挨踢www.1024it.net》站文章在未特殊说明下默认为原创性文章。

在未有正式书面授权情况下,请勿转载。谢谢配合 


GDB是linux上的调试利器,是我们每个基于linux系统编程coder必须掌握的一门技术。在此记录一个使用gdb条件断点的小例子:


gdb条件调试一般应用在循环、链表的遍历、或者其他变量的值可能被多次改变的场合。先上一个例子:

调试用例一:

gdb_condition.c源码:

  1 /***************************************************
  2 * Author: Robin
  3 * Mail: liuyalong.email@gmail.com
  4 * Description:
  5 ***************************************************/
  6 
  7 #include <stdio.h>
  8 
  9 void show (const char* const cheers){
 10     const int count = 10;
 11     int i = 0;
 12     for (i; i < count; ++i){
 13         printf ("%d\t%s\n", i, cheers);
 14     }
 15 }
 16 
 17 int main(int argc, char** argv, char** envp){
 18     show ("中国达人秀,加油!!!!!");
 19     return 0;
 20 }


编译方法:

robin@ubuntu:/media/2ndDisk/workspace/c_wspace$ gcc -g gdb_condition.c -o gdb_condition

调试方法:

1.启动gdb:

robin@ubuntu:~/workspace/c_wspace$ gdb ./gdb_condition 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /media/2ndDisk/workspace/c_wspace/gdb_condition...done.

(gdb)

2.设置条件断点:

(gdb) b 13 if i == 8
Breakpoint 1 at 0x80483fa: file gdb_condition.c, line 13.

(gdb)

3.在gdb中运行程序:

(gdb) r
Starting program: /media/2ndDisk/workspace/c_wspace/gdb_condition 
0	中国达人秀,加油!!!!!
1	中国达人秀,加油!!!!!
2	中国达人秀,加油!!!!!
3	中国达人秀,加油!!!!!
4	中国达人秀,加油!!!!!
5	中国达人秀,加油!!!!!
6	中国达人秀,加油!!!!!
7	中国达人秀,加油!!!!!

Breakpoint 1, show (cheers=0x8048518 "中国达人秀,加油!!!!!")
    at gdb_condition.c:13
13	        printf ("%d\t%s\n", i, cheers);

(gdb)

我们可以看到,程序输出了前面7个,也就是说i=8时,程序自动设置了断点,并且停在了给i赋值为8的操作上,即,i=7;++i;此时我们可以查看断点位置处,程序的状态,可以打印i的值,cheers的值:

(gdb) p i
$1 = 8
(gdb) p cheers 
$2 = 0x8048518 "中国达人秀,加油!!!!!"
(gdb) 


条件调试容易出的问题:

1.设置断点时,把if == 8错设为 if=8,这样会导致一直在该断点:

(gdb) b 13 if i = 8
Breakpoint 1 at 0x80483fa: file gdb_condition.c, line 13.
(gdb) r
Starting program: /media/2ndDisk/workspace/c_wspace/gdb_condition 

Breakpoint 1, show (cheers=0x8048518 "中国达人秀,加油!!!!!")
    at gdb_condition.c:13
13            printf ("%d\t%s\n", i, cheers);
(gdb) c
Continuing.
8    中国达人秀,加油!!!!!

Breakpoint 1, show (cheers=0x8048518 "中国达人秀,加油!!!!!")
    at gdb_condition.c:13
13            printf ("%d\t%s\n", i, cheers);
(gdb) c
Continuing.
8    中国达人秀,加油!!!!!

Breakpoint 1, show (cheers=0x8048518 "中国达人秀,加油!!!!!")
    at gdb_condition.c:13
13            printf ("%d\t%s\n", i, cheers);
(gdb) c
Continuing.
8    中国达人秀,加油!!!!!

Breakpoint 1, show (cheers=0x8048518 "中国达人秀,加油!!!!!")
    at gdb_condition.c:13
13            printf ("%d\t%s\n", i, cheers);
(gdb) 

2.在条件变量i的作用域外设置断点,这样会导致断点设置无效(下面的结果是因为,我设置断点到第10行,但是i是在第11行才有的,所以断点无效):

(gdb) b 10 if i == 8
Breakpoint 3 at 0x80483ea: file gdb_condition.c, line 10.
(gdb) r
Starting program: /media/2ndDisk/workspace/c_wspace/gdb_condition 
0	中国达人秀,加油!!!!!
1	中国达人秀,加油!!!!!
2	中国达人秀,加油!!!!!
3	中国达人秀,加油!!!!!
4	中国达人秀,加油!!!!!
5	中国达人秀,加油!!!!!
6	中国达人秀,加油!!!!!
7	中国达人秀,加油!!!!!
8	中国达人秀,加油!!!!!
9	中国达人秀,加油!!!!!
[Inferior 1 (process 3562) exited normally]
(gdb) 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值