ΠΡΠ²Π΅ΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ print. GDB ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π‘, ΡΡΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΡΡΡΠΊΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ:
(gdb) print *save /* ΠΡΠ²Π΅ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ save */
$1 = {sub = {nodep = {l = {lptr = 0x8095250, param_name = 0x8095250 "pR\t\b",
l1 = 134828624}, r = {rptr = 0x0, pptr = 0, preg = 0x0,
hd = 0x0, av = 0x0, r_ent =0}, x = {extra = 0x0, x1 = 0,
param_list = 0x0},
name = 0x0, number = 1, reflags = 0}, val = {
fltnum = 6.6614191194446594e-316, sp = 0x0, slen = 0, sref = 1,
idx = 0}, hash = {next = 0x8095250, name = 0x0, length = 0, value = 0x0,
ref = 1}}, type = Node_expression_list, flags = 1}
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠΌΠ°Π½Π΄Π° cont (continue β ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ) Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ½Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ Π΄ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΠΎΡΠ΅ΠΊ Π½Π΅Ρ. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ Ρ ΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ:
1520 for (numnodes = 0; tree != NULL; tree = tree->rnode)
(gdb) cont /* ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ *!
Continuing.
hello, world
Program exited normally. /* Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ GDB */
(gdb) quit /* ΠΡΠΉΡΠΈ ΠΈΠ· ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° */
ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΡΠΎΡΠΊΠ° (watchpoint) ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ , Π° Π½Π΅ Π΄Π»Ρ ΠΊΠΎΠ΄Π°. ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΎΡΠΊΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΈΠ»ΠΈ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π°), ΠΏΡΠΈ ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ GDB ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ. GDB ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ do_lint_old Π² gawk ΡΠ°Π²Π½Π° true, ΠΊΠΎΠ³Π΄Π° Π±ΡΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΠΎΠΏΡΠΈΡ --lint_old. ΠΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² true ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ getopt_long(). (ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ getopt_long() Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 2.1.2 Β«ΠΠ»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ GNUΒ»). Π ΡΠ°ΠΉΠ»Π΅ main.c ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ gawk:
int do_lint_old = FALSE;
/* ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΡΡ ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π΅, Π½Π΅ ΠΈΠΌΠ΅Π²ΡΠ΅ΠΉΡΡ Π² V7 awk */
...
static const struct option optab[] = {
...
{ "lint-old", no_argument, &do_lint_old, 1 },
...
};
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π½ΡΠ°, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΎΡΠΊΡ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ:
$ gdb gawk /* ΠΠ°ΠΏΡΡΡΠΈΡΡ GDB Ρ gawk */
GNU gdb 5.3
...
(gdb) watch do_lint_old
/* Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΎΡΠΊΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ */
Hardware watchpoint 1: do_lint_old
(gdb) run --lint-old 'BEGIN { print "hello, world" }'
/* ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
Starting program: /home/arnold/Gnu/gawk/gawk-3.1.4/gawk βlint-old
'BEGIN { print "hello, world" }'
Hardware watchpoint 1: do_lint_old
Hardware watchpoint 1: do_lint_old
Hardware watchpoint 1: do_lint_old
/* ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
Hardware watchpoint 1: do_lint_old
Hardware watchpoint 1: do_lint_old
Old value = 0 /* ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΡΠΎΡΠΊΠ° ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
New value = 1
0x420c4219 in _getopt_internal() from /lib/i686/libc.so.6
(gdb) where /* Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅ΠΊΠ° */
#0 0x420c4219 in _getopt_internal() from /lib/i686/libc.so.6
#1 0x420c4e83 in getopt_long() from /lib/i686/libc.so.6
#2 0x080683a1 in main (argc=3, argv=0xbffff8a4) at main.c:293
#3 0x420158d4 in __libc_start_main() from /lib/i686/libc.so.6
(gdb) quit /* ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ */
The program is running. Exit anyway? (y or n) y /* ΠΠ° */
GDB ΠΌΠΎΠΆΠ΅Ρ Π΄Π΅Π»Π°ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΌΡ Π·Π΄Π΅ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ. Π₯ΠΎΡΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ GDB Π±ΠΎΠ»ΡΡΠΎΠ΅, Π΅Π³ΠΎ ΡΡΠΎΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΡΡΠΎΠ±Ρ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°ΠΉΠ» NEWS Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π΅ GDB, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΡΡΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ.
Π‘ΡΠΎΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°ΡΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΡ ΠΊΠ°ΡΡΠΎΡΠΊΡ GDB, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π΅ GDB Π² ΡΠ°ΠΉΠ»Π΅ gdb/doc/refcard.tex. Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΠ΅ΡΠ°ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΉ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π΄Π»Ρ PostScript ΠΏΠΎΡΠ»Π΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ° ΠΈ Π·Π°ΠΏΡΡΠΊΠ° configure ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄:
$ cd gdb/doc /* ΠΠ΅ΡΠ΅ΠΉΡΠΈ ΠΎ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ doc */
$ make refcard.ps /* ΠΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΡ ΠΊΠ°ΡΡΠΎΡΠΊΡ */
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΠΏΡΠ°Π²ΠΎΡΠ½Π°Ρ ΠΊΠ°ΡΡΠΎΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°Π½Π° Ρ Π΄Π²ΡΡ ΡΡΠΎΡΠΎΠ½ Π»ΠΈΡΡΠ° Π±ΡΠΌΠ°Π³ΠΈ 8,5Γ11 Π΄ΡΠΉΠΌΠΎΠ²[168] (ΡΠ°Π·ΠΌΠ΅Ρ Β«letterΒ») Π² Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠΌ (landscape) ΡΠΎΡΠΌΠ°ΡΠ΅. Π Π½Π΅ΠΉ Π½Π° ΡΠ΅ΡΡΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° ΡΠ²ΠΎΠ΄ΠΊΠ° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ GDB. ΠΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°ΡΡ Π΅Π΅ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΏΠΎΠ΄ ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠΎΠΉ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ GDB.
15.4. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
ΠΠΌΠ΅Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΡ ΠΏΡΠΎΡΡΡΡ Π΄ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ . Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ΄ ΠΈΠ· Π½ΠΈΡ .
15.4.1. ΠΠΎΠ΄ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠ°ΠΌΠΎΠΌΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ.
15.4.1.1. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΎΠΉ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
#ifdef DEBUG
fprintf(stderr, "myvar = %d\n", myvar);
fflush(stderr);
#endif /* DEBUG */
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ -DDEBUG ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ fprintf() ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΠΎΡΡΠ»Π°ΠΉΡΠ΅ Π² stderr, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ Π² ΠΊΠ°Π½Π°Π»Π΅ ΠΈ ΡΡΠΎΠ±Ρ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ fflush(), ΡΡΠΎΠ±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΈ Π²ΡΠ²Π΅Π΄Π΅Π½Ρ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡΠ΅Π΅
ΠΠΠΠΠ§ΠΠΠΠ. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ DEBUG, Ρ ΠΎΡΡ ΠΎΠ½ ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ, ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΎ Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅ΡΡΡ. ΠΡΡΡΠ΅ΠΉ ΠΌΡΡΠ»ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°, ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ MYAPPDEBUG. ΠΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ°ΠΊΠΈΡ , ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄, Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ , ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΡΡ ΠΈ Ρ.Π΄.
Π Π°Π·Π±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² #ifdef ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠ΄Ρ Π±ΡΡΡΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΡΠΎΠΌΠΈΡΠ΅Π»ΡΠ½ΡΠΌ. ΠΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ #ifdef ΡΠΊΡΡΠ²Π°ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ±, ΠΈ Π² ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° Ρ ΡΡΠ»ΠΎΠ²Π½ΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΠΊΡΠΎΡΠ° Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π°:
/* ΠΠΠ’ΠΠΠΠΠ 1 --- ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ, Π½ΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΠ°Ρ, ΡΠΌ. ΡΠ΅ΠΊΡΡ */
/* Π Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: */ #ifdef MYAPPDEBUG
#define DPRINT0(msg) fprintf(stderr, msg)
#define DPRINT1(msg, v1) fprintf(stderr, msg, v1)
#define DPRINT2(msg, v1, v2) fprintf(stderr, msg, v1, v2)
#define DPRINT3(msg, v1, v2, v3) fprintf(stderr, msg, v1, v2, v3)
#else /* ! MYAPPDEBUG */
#define DPRINT0(msg)
#define DPRINT1(msg, v1)
#define DPRINT2(msg, v1, v2)
#define DPRINT3(msg, v1, v2, v3)
#endif /* ! MYAPPDEBUG */
/* Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: */
DPRINT1("myvar = %d\n", myvar);
...
DPRINT2("v1 = %d, v2 = %f\n", v1, v2);
ΠΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠΈΡΠ»ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΠ΅ Π²Ρ ΡΠ°ΠΌΠΈ. ΠΠΎΠ³Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ MYAPPDEBUG, Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² DPRINTx() ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°ΡΡΡΡ Π² Π²ΡΠ·ΠΎΠ²Ρ fprintf(). ΠΠΎΠ³Π΄Π° MYAPPDEBUG Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½, ΡΡΠΈ Π²ΡΠ·ΠΎΠ²Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°ΡΡΡΡ Π² Π½ΠΈΡΡΠΎ. (Π’Π°ΠΊ, Π² ΡΡΡΠ½ΠΎΡΡΠΈ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ assert(); ΠΌΡ ΠΎΠΏΠΈΡΠ°Π»ΠΈ assert() Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 12.1 Β«ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ: assert()Β».)
ΠΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ; ΠΌΡ ΡΠ°ΠΌΠΈ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΈ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ Π΅Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ Π² ΡΡΠ΅Π±Π½ΠΈΠΊΠ°Ρ . ΠΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½Π° ΠΈ Π΄Π°Π»ΡΡΠ΅ Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ:
/* ΠΠΠ’ΠΠΠΠΠ 2 --- Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠ°; ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ */
/* Π Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: */
#ifdef MYAPPDEBUG
#define DPRINT(stuff) fprintf stuff
#else
#define DPRINT(stuff)
#endif
/* Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: */
DPRINT((stderr, "myvar = %d\n", myvar));
/* ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²ΠΎΠΉΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ */
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΎΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΡΡΡ Ρ Π΄Π²ΡΠΌΡ Π½Π°Π±ΠΎΡΠ°ΠΌΠΈ ΡΠΊΠΎΠ±ΠΎΠΊ! ΠΠΎΠΌΠ΅ΡΡΠΈΠ² Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ fprintf() Π² ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, Π²Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ².
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΡ Π‘ 1999 Π³., Ρ Π²Π°Ρ Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π²ΡΠ±ΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°Π΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΈΡΡΡΠΉ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄:
/* ΠΠΠ’ΠΠΠΠΠ 3 --- ΡΠ°ΠΌΠ°Ρ ΡΠΈΡΡΠ°Ρ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ C99 */
/* Π Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: */
#ifdef MYAPPDEBUG
#define DPRINT(mesg, ...) fprintf(stderr, mesg, __VA_ARGS__)
#else
#define DPRINT(mesg, ...)
#endif
/* Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: */
DPRINT("myvar = %d\n", myvar);
DPRINT("v1 = %d, v2 = %f\n", v1, v2);
Π‘ΡΠ°Π½Π΄Π°ΡΡ Π‘ 1999 Π³. ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²Π°ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΌΠ°ΠΊΡΠΎΡ (variadic macros); Ρ.Π΅. ΠΌΠ°ΠΊΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². (ΠΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° Π²Π°ΡΡΠΈΡΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ printf()). Π ΠΌΠ°ΠΊΡΠΎΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΡΠΈ ΡΠΎΡΠΊΠΈ '...' ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π½ΠΎΠ»Ρ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². Π ΡΠ΅Π»Π΅ ΠΌΠ°ΠΊΡΠΎΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ __VA_ARGS__ Π·Π°ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Ρ ΠΈΡ Π½ΠΈ Π±ΡΠ»ΠΎ.