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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 191

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

Β Β  Β data = "john", '\0' <repeats 4091 times>, key =2}, {

Β Β  Β data = "neil", '\0' <repeats 4091 times>, key = 4}, {

Β Β  Β data = "alex", '\0' <repeats 4091 times>, key =1}, {

Β Β  Β data = "rick", '\0' <repeats 4091 times>, key =5}}

(gdb)

МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ

display
, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Π² gdb автоматичСскоС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ массива ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ остановкС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ останова:

(gdb) <b>display array[0]@5</b>

1: array[0]@5 = {{data = &quot;bill&quot;, '\0' &lt;repeats 4091 times&gt;, key = 3}, {

Β Β  Β data = &quot;john&quot;, '\0' &lt;repeats 4091 times&gt;, key = 2}, {

Β Β  Β data = &quot;neil&quot;, '\0' &lt;repeats 4091 times&gt;, key = 4}, {

Β Β  Β data = &quot;alex&quot;, '\0' &lt;repeats 4091 times&gt;, key = 1}, {

Β Β  Β data = &quot;rick&quot;, '\0' &lt;repeats 4091 times&gt;, key, = 5}}

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вмСсто остановки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ½Π° просто ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ запросили, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Для этого ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

commands
. Она ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΈ Π² Ρ‚ΠΎΡ‡ΠΊΡƒ останова. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ лишь Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ останова для продолТСния выполнСния:

(gdb)<b> commands</b>

Type commands for when breakpoint 1 is hit, one per line.

End with a line saying just &quot;end&quot;.

&gt; <b>cont</b>

&gt; <b>end</b>

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΎΠ½Π° продолТаСтся Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, выводя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ массива ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° оказываСтся Π²Π±Π»ΠΈΠ·ΠΈ внСшнСго Ρ†ΠΈΠΊΠ»Π°.

(gdb) <b>cont</b>

Continuing.

Breakpoint 1, sort (a=0x8049684, n=3) at debug4.c:21

21 /* 21 */Β Β Β  s = 0;

1: array[0]@5 = {{data = &quot;john&quot;,Β '\000' &lt;repeats 4091 times&gt;, key = 2}, {

Β Β Β  data = &quot;bill&quot;,Β '\000' &lt;repeats 4091 times&gt;, key =3}, {

Β Β Β  data = &quot;alex&quot;,Β '\000' &lt;repeats 4091 times&gt;, key =1}, {

Β Β Β  data = &quot;neil&quot;,Β '\000' &lt;repeats 4091 times&gt;, key =4}, {

Β Β Β Β data = &quot;rick&quot;,Β '\000' &lt;repeats 4091 times&gt;, key = 5}}

array[0] = {john, 2}

array[1] = {alex, 1}

array[2] = {bill, 3}

array[3] = {neil, 4}

array[4] = {rick, 5}

Program exited with code 025.

(gdb)

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb сообщаСт ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сама Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚

exit
ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
main
. Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла, Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
exit
.

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ выполняСт внСшний Ρ†ΠΈΠΊΠ» ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько оТидалось. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

n
, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² условии Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π°, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ достиТСнии Ρ‚ΠΎΡ‡ΠΊΠΈ останова. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½ΡƒΠΆΠ½ΠΎΠ΅ число Ρ€Π°Π·. Π”Π΅Π»ΠΎ Π² ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ
n
Π² строкС 30.

/* 30 */Β Β  n--;

Π­Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° внСшнСго Ρ†ΠΈΠΊΠ»Π° наибольший, элСмСнт

array
окаТСтся Π²Π½ΠΈΠ·Ρƒ ΠΈ поэтому остаСтся мСньшС элСмСнтов для сортировки. Но ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, это ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ Ρ†ΠΈΠΊΠ»Ρƒ ΠΈ создаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ исправлСния (хотя Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅) β€” ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΡƒΡŽ строку. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ, устранило Π»ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ исправлСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Вставка исправлСний с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°

Π’Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ для установки Ρ‚ΠΎΡ‡Π΅ΠΊ останова ΠΈ просмотра Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ‚ΠΎΡ‡ΠΊΠΈ останова с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ дСйствиями, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ исправлСниС, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ "Π·Π°ΠΏΠ»Π°Ρ‚ΠΎΠΉ", ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² строкС 30 ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

n
. Π’ дальнСйшСм, ΠΊΠΎΠ³Π΄Π° строка 30 выполнится, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ останСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ пСрСзапустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с самого Π½Π°Ρ‡Π°Π»Π°. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ info ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ останова ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ:

(gdb)<b> info display</b>

Auto-display expressions now in effect:

Num Enb Expression

1:Β y array[0]@5 (gdb)<b> info break</b>

Num TypeΒ Β Β Β Β Β  Disp Enb AddressΒ Β Β  What

1Β Β  breakpoint keepΒ yΒ Β  0x08048427 in sort at debug4.c:21

Β Β Β  breakpoint already hit 3 times

Β Β  Β cont

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эти Ρ‚ΠΎΡ‡ΠΊΠΈ останова, Π»ΠΈΠ±ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… совсСм. Если ΠΈΡ… ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Ρƒ вас останСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° понадобится.

(gdb) <b>disable break 1</b>

(gdb) <b>disable display 1</b>

(gdb) <b>break 30</b>

Breakpoint 2 at 0x8048545: file debug4.c, line 30.

(gdb) <b>commands 2</b>

Type commands for when breakpoint 2 is hit, one per line.

End with a line saying just &quot;end&quot;.

&gt;<b>set variable n = n+1</b>

&gt;<b>cont</b>

&gt;<b>end</b>