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

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

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

6

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

| &gt;factorial

| &lt;factorial

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

| &gt;factorial

| | &gt;factorial

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

| &lt;factorial

2

| &gt;factorial

| | &gt;factorial

| | | &gt;factorial

| | | &lt;factorial

| | &lt;factorial

| &lt;factorial

6

&lt;?func?

$ <b>factorial -#d 1 2</b>/* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ сообщСния 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(&quot;abort&quot;, abort());

DBUG_FILE

Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°

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

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 строк ΠΊΠΎΠ΄Π° Π·Π° нСсколько часов Ρ€Π°Π±ΠΎΡ‚Ρ‹. Если Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ сборкС вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΅Π΅ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π΅Π· нСобходимости ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ пСрСкомпиляции.