使用 awatch rwatch 示例的 GDB 断点和观察点

举报
Tiamo_T 发表于 2022/08/20 17:49:34 2022/08/20
【摘要】 在本文中,我们将介绍几个高级 GDB 函数,包括条件断点和观察点。 我们还使用一个简单的 C 程序作为示例来解释这些 GDB 调试器概念。

在本文中,我们将介绍几个高级 GDB 函数,包括条件断点和观察点。

我们还使用一个简单的 C 程序作为示例来解释这些 GDB 调试器概念。

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 时程序会中断。

什么是观察点?

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

请注意,您要监视的变量必须在当前范围内。因此,请确保在变量变量范围内设置断点来观察它。


#include <stdio.h>

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

使用“awatch”设置读/写观察点

使用 awatch 命令在变量变量上设置读/写观察点。awatch 的语法是 '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) awatch b
Hardware access (read/write) watchpoint 2: b
(gdb) n
5		int b=15;
(gdb) n
Hardware access (read/write) watchpoint 2: b

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

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

在上面的例子中,每当给定变量被读/写时,gdb 都会打印旧值和新值并停止程序的执行。

使用“rwatch”为变量设置读取观察点

rwatch 是用于在 gdb 中设置读取观察点的命令。一旦设置,每当读取给定变量时,程序将停止执行。语法类似于'awatch'。

(gdb) rwatch b
Hardware read watchpoint 2: b
(gdb) c
Continuing.
Hardware read watchpoint 2: b

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

同样,您可以使用 'watch'  'watch' 在 gdb 中设置写入观察点。

删除观察点

观察点将显示在断点列表中。

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

(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 watchpoint  keep y                      b
	breakpoint already hit 1 time
(gdb) delete 2
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。