Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 223

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

...

(gdb) <b>watch do_lint_old</b>

Β /* Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ */

Hardware watchpoint 1: do_lint_old

(gdb) <b>run --lint-old 'BEGIN { print &quot;hello, world&quot; }'</b>

Β /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

Starting program: /home/arnold/Gnu/gawk/gawk-3.1.4/gawk β€”lint-old

'BEGIN { print &quot;hello, world&quot; }'

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) <b>where</b> /* Врассировка стСка */

#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) <b>quit</b> /* На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ */

The program is running. Exit anyway? (y or n) <b>y</b> /* Π”Π° */

GDB ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС, Ρ‡Π΅ΠΌ ΠΌΡ‹ здСсь ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ. Π₯отя руководство GDB большоС, Π΅Π³ΠΎ стоит ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΈ возмоТностями. ПослС этого, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ достаточно ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„Π°ΠΉΠ»

NEWS
Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ дистрибутивС GDB, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ измСнилось.

Π‘Ρ‚ΠΎΠΈΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ GDB, которая поставляСтся Π² дистрибутивС GDB Π² Ρ„Π°ΠΉΠ»Π΅

gdb/doc/refcard.tex
. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ справочной ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ для PostScript послС извлСчСния исходника ΠΈ запуска configure ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄:

$ <b>cd gdb/doc</b> /* ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ doc */

$ <b>make refcard.ps</b> /* ΠžΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ */

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ справочная ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ распСчатана с Π΄Π²ΡƒΡ… сторон листа Π±ΡƒΠΌΠ°Π³ΠΈ 8,5Γ—11 дюймов [168] (Ρ€Π°Π·ΠΌΠ΅Ρ€ Β«letterΒ») Π² Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΌ (landscape) Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. Π’ Π½Π΅ΠΉ Π½Π° ΡˆΠ΅ΡΡ‚ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ… прСдоставлСна сводка Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ GDB. ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π΅Π΅ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ своСй ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с GDB.

15.4. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ мноТСство ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ для упрощСния ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ исходного ΠΊΠΎΠ΄Π°, ΠΎΡ‚ простых Π΄ΠΎ слоТных. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим ряд ΠΈΠ· Π½ΠΈΡ….

15.4.1. Код ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компилирования

НСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ относятся ΠΊ самому исходному ΠΊΠΎΠ΄Ρƒ.

15.4.1.1. ИспользованиС ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… макросов

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компилирования являСтся использованиС прСпроцСссора для создания условно ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. НапримСр:

#ifdef DEBUG

fprintf(stderr, &quot;myvar = %d\n&quot;, 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(&quot;myvar = %d\n&quot;, myvar);

...

DPRINT2(&quot;v1 = %d, v2 = %f\n&quot;, v1, v2);

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ нСсколько макросов, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, число ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтС Π²Ρ‹ сами. Когда ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½

MYAPPDEBUG
, Π²Ρ‹Π·ΠΎΠ²Ρ‹ макросов
DPRINT<i>x</i>()
Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Ρ‹
fprintf()
. Когда
MYAPPDEBUG
Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π½ΠΈΡ‡Ρ‚ΠΎ. (Π’Π°ΠΊ, Π² сущности, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
assert()
; ΠΌΡ‹ описали
assert()
Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 12.1 Β«ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:
assert()
Β».)