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

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

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

GNU gdb 5.3

...

(gdb) <b>break do_print</b> /* ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π² do_print */

Breakpoint 1 at 0x805a36a: file builtin.c, line 1504.

(gdb) <b>run 'BEGIN { print &quot;hello, world&quot; }'</b> /* Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

Starting program: /home/arnold/Gnu/gawk/gawk-3.1.3/gawk 'BEGIN { print &quot;hello, world&quot; }'

Breakpoint 1, do_print (tree=0x8095290) at builtin.c:1504

1504 struct redirect *rp = NULL; /* ИсполнСниС достигаСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ */

(gdb) <b>list</b> /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ */

1499

1500 void

1501 do_print(register NODE *tree)

1502 {

1503 Β register NODE **t;

1504Β  struct redirect *rp = NULL;

1505 Β register FILE *fp;

1506Β  int numnodes, i;

1507 Β NODE *save;

1508Β  NODE *tval;

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

next
:

(gdb) <b>next</b> /* Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (строка 1504 Π²Ρ‹ΡˆΠ΅) */

1510 fp = redirect_to_fp(tree-&gt;rnode, &amp;rp); /* GDB Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ */

(gdb) /* НаТмитС ENTER для Π΅Π³ΠΎ выполнСния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ */

1511 if (fp == NULL)

(gdb) /* снова ENTER */

1519 save = tree = tree-&gt;lnode; (gdb) /* И снова */

1520 for (numnodes = 0; tree != NULL; tree = tree-&gt;rnode)

Команда

step
являСтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ для пошагового исполнСния. ΠœΠ΅ΠΆΠ΄Ρƒ
next
ΠΈ
step
Π΅ΡΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅,
next
выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€. Если этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ содСрТит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, эта функция вызываСтся ΠΈ возвращаСтся Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ GDB Π²Π΅Ρ€Π½Π΅Ρ‚ сСбС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ с содСрТащим Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ

step
, GDB Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, позволяя Π²Π°ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ пошаговоС исполнСниС (ΠΈΠ»ΠΈ трассировку) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ содСрТит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ,
step
Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π°
next
.

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. Π›Π΅Π³ΠΊΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ, какая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Ρ‹Π»Π° использована, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ ENTER для выполнСния ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅

step
, Π²Ρ‹ случайно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΠΉΡ‚ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ
strlen()
ΠΈΠ»ΠΈ
printf()
, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
finish
, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ исполнСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ВывСсти содСрТимоС памяти ΠΌΠΎΠΆΠ½ΠΎ с использованиСм ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

print
. GDB распознаСт синтаксис Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π‘, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ СстСствСнным ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ структур, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ:

(gdb) <b>print *save</b> /* ВывСсти структуру, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ save */

$1 = {sub = {nodep = {l = {lptr = 0x8095250, param_name = 0x8095250 &quot;pR\t\b&quot;,

Β 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-&gt;rnode)

(gdb) <b>cont</b> /* ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ *!

Continuing.

hello, world

Program exited normally. /* Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ GDB */

(gdb) <b>quit</b> /* Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° */

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΠ°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° (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[] = {

Β ...

Β { &quot;lint-old&quot;, no_argument, &amp;do_lint_old, 1 },

Β ...

};

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сСанса, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π² дСйствии:

$ <b>gdb gawk</b> /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ GDB с gawk */

GNU gdb 5.3