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