GNU/Linux >> Znalost Linux >  >> Linux

GDB Breakpoints a Watchpoints pomocí awatch rwatch Příklady

V tomto tutoriálu probereme několik pokročilých funkcí GDB včetně podmíněných bodů přerušení a sledovacích bodů.

K vysvětlení těchto konceptů ladicího programu GDB jsme také použili jednoduchý program v jazyce C jako příklad.

Podmíněné zlomové body GDB

Bod zlomu, brzdy pokaždé, když váš program dosáhne určitého místa. Můžete také zadat podmínku pro zarážky. Podmínka je booleovský výraz. Podmíněný bod přerušení se přeruší, pouze pokud se booleovský výraz vyhodnotí jako TRUE.

Předpokládejme, že voláte funkci ve smyčce for a každých 500. čas dojde k selhání programu. Podmíněný bod přerušení přichází na pomoc v těch situacích, kdy můžete nastavit podmínku a přerušit provádění pouze v případě, že podmínka odpovídá.

#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

Ve výše uvedené relaci gdb se program přeruší, když je hodnota i 500.

Co je to Watchpoint?

Watchpoint jsou podobné bodům přerušení, o kterých jsme hovořili v předchozím článku GDB – Body zlomu. Ale na rozdíl od bodů přerušení, které jsou nastaveny pro funkce nebo řádky kódu, jsou body sledování nastaveny na proměnné. Když jsou tyto proměnné čteny/zapisovány, bude spuštěn sledovací bod a provádění programu se zastaví.

Upozorňujeme, že proměnná, kterou chcete sledovat, musí být v aktuálním rozsahu. Ujistěte se tedy, že jste v rozsahu proměnné nastavili bod přerušení, abyste ji mohli sledovat.

#include <stdio.h>

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

Nastavení sledovacího bodu čtení/zápisu pomocí „awatch“

Pomocí příkazu awatch nastavte sledovací bod pro čtení/zápis pro proměnnou. Syntaxe pro awatch je „awatch“ následovaná názvem proměnné.

$ 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);

Ve výše uvedeném příkladu, kdykoli je daná proměnná čtena/zapisována, gdb vypíše starou a novou hodnotu a zastaví provádění programu.

Nastavení sledovaného bodu čtení pro proměnnou pomocí „rwatch“

rwatch je příkaz, který se používá k nastavení bodu sledování čtení v gdb. Jakmile je nastavena, při každém čtení dané proměnné program zastaví provádění. Syntaxe je podobná „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);

Podobně můžete použít ‘watch’ k nastavení bodu sledování zápisu v gdb.

Odstranění sledovaného bodu

Sledované body se zobrazí v seznamu bodů přerušení.

Takže můžete použít informační body přerušení k vypsání bodů sledování a můžete je odstranit/zakázat podobně jako body přerušení, jak je uvedeno níže.


(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


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Jak ladit programy C v Linuxu pomocí gdb

  3. Linuxové příkazy – přehled a příklady

  1. 10 Praktické příklady použití příkazu scp

  2. Co je to IP adresa? Příklady adres IPv4 a IPv6

  3. 5 Praktické příklady příkazů linuxové fixační jednotky

  1. Příklad bodu přerušení GDB pro C – nastavení, zobrazení, pokračování a odstranění bodů přerušení

  2. Jak kombinovat Ping a Traceroute v Linuxu pomocí příkladů příkazů MTR

  3. Problémy s používáním sort a comm