使用 awatch rwatch 示例的 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
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)