一份菜单

广东发展银行Breakpoints and Watchpoints using 一只手表 手表 Examples

在本教程中,我们’它将涵盖几个高级GDB功能,包括条件断点和观察点。

We’我还使用了一个简单的C程序作为 example to explain these 广东发展银行debugger concepts.

GDB条件断点

断点在您的程序到达特定位置时制动。您还可以指定断点条件。条件是布尔表达式。仅当布尔表达式的计算结果为TRUE时,条件断点才会中断。

假设您正在for循环中调用一个函数,并且每500次,该程序就会崩溃。在这些情况下,可以设置条件断点,您可以设置条件并仅在条件匹配时中断执行。

#include <stdio.h>
int main() {
        int i=0;
        for (i=0;i<1000;i++) {
                printf("%d\n",i);
        }
}
(gdb) b 8 if i=500
Breakpoint 2 at 0x400524: file a.c, line 8.
(gdb) run
Starting program: /home/lakshmanan/./a.out 

Breakpoint 1, main () at a.c:6
6		int i=0;
(gdb) c
Continuing.

Breakpoint 2, main () at a.c:8
8			printf("%d\n",i);
(gdb) p i
$1 = 500

在上述gdb会话中,当i的值为500时,程序中断。

什么是观察点?

观察点类似于我们先前讨论的断点 广东发展银行– Breakpoints 文章。但是与为函数或代码行设置的断点不同,观察点是在变量上设置的。当这些变量被读/写时,监视点将被触发并且程序执行将停止。

请注意,您要监视的变量必须在当前范围内。因此,请确保在变量范围内设置断点以对其进行监视。

#include <stdio.h>

int main() {
        int a=10;
        int b=15;
        b = a+b;
        printf("%d\n",b);
}
$ cc -g 看.c -o 看

Setting Read/Write 看point using ‘awatch’

Use the 一只手表 command to set a read/write 看point 上 a variable. The syntax for 一只手表 is, ‘awatch’然后是变量名。

$ gdb ./watch

(gdb) break 1
Breakpoint 1 at 0x400514: file a.c, line 1.
(gdb) run
Starting program: /home/lakshmanan/Personal/./a.out 

Breakpoint 1, main () at a.c:4
4		int a=10;
(gdb) 一只手表 b
Hardware access (read/write) 看point 2: b
(gdb) n
5		int b=15;
(gdb) n
Hardware access (read/write) 看point 2: b

Old value = 0
New value = 15
main () at a.c:7
7		b = a+b;
(gdb) n
Hardware access (read/write) 看point 2: b

Old value = 15
New value = 25
main () at a.c:9
9		printf("%d\n",b);

在上面的示例中,无论何时读/写给定的变量,gdb都会输出新旧值并停止执行程序。

Setting a read 看point for a variable using ‘rwatch’

手表是用于在gdb中设置读取监视点的命令。一旦设置,只要读取给定变量,程序将停止执行。语法类似于‘awatch’.

(gdb) 手表 b
Hardware read 看point 2: b
(gdb) c
Continuing.
Hardware read 看point 2: b

Value = 25
0x000000000040052b in main () at a.c:9
9		printf("%d\n",b);

同样,您可以使用‘watch’ to set a write 看point in gdb.

Deleting a 看point

监视点将显示在断点列表中。

因此,您可以使用信息断点列出观察点,并且可以删除/禁用类似于断点的功能,如下所示。

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400514 in main at a.c:1
	breakpoint already hit 1 time
2       hw 看point  keep y                      b
	breakpoint already hit 1 time
(gdb) delete 2

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 8 评论 … 加一 }

  • 瓦西尔 2014年2月11日,上午5:49

    亲,
    我阅读了所有TGS文章,这些都是通过电子邮件发送的。
    非常感谢您的工作。
    我住在乌克兰,英语水平不高,所以请耐心等待我的错误
    最好的祝福
    瓦西尔

  • 贾拉尔·哈吉霍拉玛利 2014年2月12日,上午2:02

    你好
    非常感谢您的精彩文章,

    我安装了GNU gdb(GDB)CentOS(7.0.1-45.el5.centos)
    我可以测试你的例子

    谢谢

  • 普拉蒂克 2014年2月26日,下午11:17

    几天前,我正在玩gdb,并且试图控制在我的浏览器{chrome}上运行的基于Flash的游戏。我可以通过使用列出全局变量
    “info globals”但是,每当我尝试查找本地人或参数时,都会向我显示错误。
    “找不到符号表信息” or something alike.

    如果我在某处错了,请告诉我…

    等候 …

  • 伊尔斯特 2014年2月27日,晚上11:50

    我认为有一个错误。
    “(gdb) b 8 if i=500” should be “(gdb)b 8如果i == 500”.

  • 瓦西尔 2014年2月28日,上午12:31

    嗨Pratik
    要查看局部变量,必须在希望看到的范围内停止。
    或逐步在函数内部,或在该范围内设置断点(例如,在函数内部)。
    局部变量的生命周期受到限制。只要本地功能运行,它就存在。
    我希望你问一下

  • 普拉蒂克 2014年3月4日,晚上11:27

    您好Vasil,首先感谢您的回复。
    我尝试在浏览器中调试正在运行的Flash游戏时无法设置断点。
    即使我能够列出所有程序变量’s enough for me.

    再次请帮助我

    等候 …

  • 瓦西尔 2014年3月5日,上午3:38

    亲爱的普拉蒂克
    我不知道您使用什么浏览器。但是今天所有的浏览器(opera,Firefox,chrome…)具有检查元素的工具。希望您知道。例如,在Mozilla Firefox中,单击鼠标右键,然后选择“检查元素”。有打开调试器…
    这是非常强大的工具。花时间阅读如何使用它。
    祝好运

  • 普拉蒂克 2014年3月6日,上午2:41

    嗨,瓦西尔,
    非常感谢您的回复。
    那正是我所需要的。

    再次感谢ðŸ™,

发表评论