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

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

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

ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ factorial():

1  #include <stdio.h>

2  #include "dbug.h"

3

4  int factorial (value)

5  register int value;

6  {

7   DBUG_ENTER("factorial");

8   DBUG_PRINT("find", ("find %d factorial", value));

9   if (value > 1) {

10   value *= factorial(value β€” 1);

11  }

12  DBUG_PRINT("result", ("result is %d", value));

13  DBUG_RETURN(value);

14 }

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈ скомпонована вмСстС с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ dbug, Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ создаСт Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Но со Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ доступны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π°:

$ factorial 1 2 3 /* ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ запуск, Π±Π΅Π· ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ */

1

2

6

$ factorial -#t 1 2 3/* ВывСсти трассировку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ */

| >factorial

| <factorial

1 /* ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π² stdout */

| >factorial

| | >factorial

| | <factorial /* Π’Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² stderr */

| <factorial

2

| >factorial

| | >factorial

| | | >factorial

| | | <factorial

| | <factorial

| <factorial

6

<?func?

$ factorial -#d 1 2/* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ сообщСния DBUG_PRINT() */

?func?: args: argv[2] = 1

factorial: find: find 1 factorial

factorial: result: result is 1

1

?func?: args: argv[3] = 2

factorial: find: find 2 factorial

factorial: find: find 1 factorial

factorial: result: result is 1

factorial: result: result is 2

2

ΠžΠΏΡ†ΠΈΡ -# управляСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ dbug. Она «особая» Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ DBUG_PUSH() Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ всю строку, игнорируя Π²Π΅Π΄ΡƒΡ‰ΠΈΠ΅ символы '-#', хотя Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² DBUG_PUSH() лишь строку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠΏΡ†ΠΈΠΉ (Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ getopt(), это optarg).

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ строка состоит ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΎΠΏΡ†ΠΈΠΉ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². КаТдая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΎΠΏΡ†ΠΈΠΉ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² отдСляСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… символом двоСточия. КаТдая опция прСдставлСна ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ, Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ этой ΠΎΠΏΡ†ΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ Π½Π΅Π΅ запятыми. НапримСр:

$ myprog -#d,mem,ipc:f,check_salary,check_start_date -f infile -o outfile

ΠžΠΏΡ†ΠΈΡ d Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ DBUG_PRINT(), Π½ΠΎ лишь Ссли пСрвая строка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° являСтся "mem" ΠΈΠ»ΠΈ "ipc". (Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅Ρ‚, выводятся всС сообщСния DBUG_PRINT().) Π‘Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ опция f ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ трассировку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ лишь ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ функциями, check_salary() ΠΈ check_start_date().

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ список ΠΎΠΏΡ†ΠΈΠΉ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² воспроизвСдСн ΠΈΠ· руководства Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ dbug. ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ΠœΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ здСсь лишь Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ; ΠΏΠΎΠ»Π½Ρ‹ΠΉ список см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

d [,ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова]

Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚ макросов с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ словами. ΠŸΡƒΡΡ‚ΠΎΠΉ список ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ всС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова.

F

ΠŸΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ исходного Ρ„Π°ΠΉΠ»Π°, содСрТащСго макрос, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄.

i

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ процСсс, выводящий ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ Ρ‚Ρ€Π°ΡΡΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½ΡƒΡŽ строку Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ID для этого процСсса.

L

ΠŸΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки исходного Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ макрос.

ΠΎ[,Ρ„Π°ΠΉΠ»]

ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ΠŸΠΎΡ‚ΠΎΠΊΠΎΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся stderr. ΠŸΡƒΡΡ‚ΠΎΠΉ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² пСрСнаправляСт Π²Ρ‹Π²ΠΎΠ΄ Π² stdout.

t[,N]

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ трассировку ΠΏΠΎΡ‚ΠΎΠΊΠ° управлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Максимальная Π³Π»ΡƒΠ±ΠΈΠ½Π° влоТСния опрСдСляСтся N, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 200.

Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ нашСго обсуТдСния Π²ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ макросы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ dbug.

DBUG_EXECUTE(строка, ΠΊΠΎΠ΄)

Π­Ρ‚ΠΎΡ‚ макрос ΠΏΠΎΡ…ΠΎΠΆ Π½Π° DBUG_PRINT(): ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ являСтся строкой, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ d, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΠΊΠΎΠ΄ для исполнСния:

DBUG_EXECUTE("abort", abort());

DBUG_FILE

Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° FILE* для использования с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ <stdio.h>. Оно позволяСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ собствСнный Π²Ρ‹Π²ΠΎΠ΄ Π² ΠΏΠΎΡ‚ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

DBUG_LONGJMP(jmp_buf env, int val)

Π­Ρ‚ΠΎΡ‚ макрос Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Π²Ρ‹Π·ΠΎΠ² longjmp(), принимая Ρ‚Π΅ ΠΆΠ΅ самыС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° dbug Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ сдСлали Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄.

DBUG_POP()

Π­Ρ‚ΠΎΡ‚ макрос Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ· стСка ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сохранСнного состояния ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, созданный макросом DBUG_PUSH(). Он довольно эзотСричСский; Π²Ρ‹ скорСС всСго Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

DBUG_SETJMP(jmp_buf env)

Π­Ρ‚ΠΎΡ‚ макрос Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Π²Ρ‹Π·ΠΎΠ² setjmp(), принимая Ρ‚Π΅ ΠΆΠ΅ самыС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Он позволяСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ dbug ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹.

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π²ΠΎΠΏΠ»ΠΎΡ‰Π΅Π½ΠΈΠΈ, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ[177], ΠΌΡ‹ использовали Π² своСм ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ dbug. Она Π±Ρ‹Π»Π° Π½Π΅ΠΎΡ†Π΅Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π° опустив -DDBUG Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ сборкС, ΠΌΡ‹ смогли ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π±Π΅Π· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ исходного ΠΊΠΎΠ΄Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Ρ‹Π³ΠΎΠ΄Ρƒ ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ dbug, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Π΅ с Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π½ΠΎ Π² качСствС экспСримСнта ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого сцСнария awk ΠΌΡ‹ смогли Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с 30 000 строк ΠΊΠΎΠ΄Π° Π·Π° нСсколько часов Ρ€Π°Π±ΠΎΡ‚Ρ‹. Если Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ сборкС вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΅Π΅ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π΅Π· нСобходимости ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ пСрСкомпиляции.

ΠœΡ‹ нашли, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° dbug являСтся ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ внСшним ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ GDB; ΠΎΠ½Π° обСспСчиваСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ способ примСнСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊ ΠΊΠΎΠ΄Ρƒ Π‘. Она Ρ‚Π°ΠΊΠΆΠ΅ довольно элСгантно сочСтаСт ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π°Π½Π΅Π΅ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΎΡ‡Π΅Ρ€Ρ‚ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. ОсобСнно ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ динамичСской трассировки Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ ΠΎΠ½Π° Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ свою Π±Π΅ΡΡ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² качСствС ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ссли Π²Ρ‹ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π½Π΅ΠΉ.

15.5.2. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ выдСлСния памяти

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠ°ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, для любого ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠ³ΠΎ практичСского прилоТСния СдинствСнной слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ программиста Π½Π° Π‘ являСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (посрСдством malloc(), realloc() ΠΈ free()).

Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ большим количСством инструмСнтов, доступных для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ динамичСской памяти. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. НапримСр:

β€’ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая выдСляСтся, Π° Π·Π°Ρ‚Π΅ΠΌ становится нСдоступной.

β€’ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ освобоТдаСмой памяти: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая выдСляСтся, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ освобоТдаСтся. НС освобоТдаСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ всСгда являСтся ошибкой, Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… случаСв Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ всС Π² порядкС.

β€’ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… освобоТдСний: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая освобоТдаСтся Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free() ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc().

β€’ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ использования ΡƒΠΆΠ΅ освобоТдСнной памяти: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая освобоТдСна, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· висячий ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

β€’ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΈΠ»ΠΈ сохранСниС Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹.

β€’ ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ± использовании Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ памяти. (МногиС компиляторы ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ прСдупрСТдСния.)

β€’ Π”инамичСская трассировка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: ΠΊΠΎΠ³Π΄Π° появляСтся ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ доступ ΠΊ памяти, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ трассировку ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°.

β€’ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ инструмСнтами посрСдством использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния.

β€’ Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² для Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΠΏΠΎΠ·ΠΆΠ΅ для создания ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ².

НСкоторыС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ просто Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ эти события. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‚ ΠΆΡƒΡ‚ΠΊΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ прилоТСния (посрСдством SIGSEGV), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° ΠΊΠΎΠ΄-Π½Π°Ρ€ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ спроСктированы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ вмСстС с GDB.

НСкоторыС инструмСнты Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ измСнСния исходного ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ использованиС особого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… #define ΠΈ статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ посрСдством использования ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΎΠ±Ρ‰Π΅Π³ΠΎ пользования Linux/Unix для ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΉ установки сСбя Π² качСствС замСститСля стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… вСрсий malloc() ΠΈ free().