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

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

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

Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΎ обсудим ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСдства, lint ΠΈ splint. Как ΠΈ компилятор, ΠΎΠ½ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΠ΄ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ.

ΠžΡΠ½Π°Ρ‰Π΅Π½ΠΈΠ΅ срСдствами контроля

ΠžΡΠ½Π°Ρ‰Π΅Π½ΠΈΠ΅ срСдствами контроля β€” это вставка Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠΎΠ΄Π° для сбора Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя Π΅Π΅ выполнСния. ΠžΡ‡Π΅Π½ΡŒ популярна вставка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf для Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… стадиях выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ с пользой для сСбя Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² printf, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот процСсс ΠΏΠΎΠ²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΏΡ€ΠΈ любом ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Π°ΠΌ придСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ошибки Π±ΡƒΠ΄ΡƒΡ‚ исправлСны.

Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° оснащСния срСдствами контроля. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прСпроцСссор языка Π‘ для Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° срСдств контроля Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для вставки ΠΈΠ»ΠΈ удалСния ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкций, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π΄Π°Π»Π΅Π΅:

#ifdef DEBUG

 printf("variable x has value = %d\n", x);

#endif

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Ρ„Π»Π°Π³ΠΎΠΌ компилятора -DDEBUG для опрСдСлСния символичСского ΠΈΠΌΠ΅Π½ΠΈ DEBUG ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Π±Π΅Π· этого Ρ„Π»Π°Π³Π° β€” для удалСния ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. МоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ слоТный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… макросов:

#define BASIC_DEBUG 1

#define EXTRA_DEBUG 2

#define SUPER_DEBUG 4

#if (DEBUG & EXTRA_DEBUG)

 printf...

#endif

Π’ этом случаС Π²Ρ‹ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ макрос DEBUG, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ объСм ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π€Π»Π°Π³ компилятора -DDEBUG=5 Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ макросы BASIC_DEBUG ΠΈ SUPER_DEBUG, Π½ΠΎ Π½Π΅ EXTRA_DEBUG. Π€Π»Π°Π³ DDEBUG=0 ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ всю ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, вставка ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строк устранит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ задания Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС DEBUG, Ссли ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π½Π΅ трСбуСтся.

#ifndef DEBUG

#define DEBUG 0

#endif

НСсколько макросов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… прСпроцСссором Π‘, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΈ макросы Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ для прСдоставлСния свСдСний ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ компиляции (Ρ‚Π°Π±Π». 10.1).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ символичСскиС ΠΈΠΌΠ΅Π½Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ двумя символами подчСркивания. Π­Ρ‚ΠΎ стандартноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для символичСских ΠΈΠΌΠ΅Π½ прСпроцСссора, ΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ². Π’Π΅Ρ€ΠΌΠΈΠ½ "Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅" Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… описаниях ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния прСпроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚.Π΅. врСмя ΠΈ Π΄Π°Ρ‚Π° запуска компилятора ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°.


Π’Π°Π±Π»ΠΈΡ†Π° 10.1

ΠœΠ°ΠΊΡ€ΠΎΡ ОписаниС __LINE__ ДСсятичная константа, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки __FILE__ Π‘Ρ‚Ρ€ΠΎΠΊΠ°, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° __DATE__ Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π² Ρ„ΠΎΡ€ΠΌΠ΅ "ΠΌΠΌΠΌ Π΄Π΄ Π³Π³Π³Π³", тСкущая Π΄Π°Ρ‚Π° __TIME__ Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π² Ρ„ΠΎΡ€ΠΌΠ΅ "Ρ‡Ρ‡:ΠΌΠΌ:сс", Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.1.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.1. ΠžΡ‚Π»Π°Π΄ΠΎΡ‡Π½Π°Ρ информация

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° cinfo.c, которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя компиляции, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

#include <stdio.h>

# include <stdlib.h>


int main() {

#ifdef DEBUG

 printf("Compiled: " __DATE__ " at " __TIME__ "\n");

 printf("This is line %d of file %s\n", __LINE__, __FILE__);

#endif

 printf("hello world\n");

 exit(0);

}

Когда Π²Ρ‹ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Π»Π°Π³ -DDEBUG), Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свСдСния ΠΎ компиляции:

$ cc -ΠΎ cinfo -DDEBUG cinfo.c

$ ./cinfo

Compiled: Jun 30 2007 at 22:58:43

This is line 8 of file cinfo.c

hello world

$

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π‘, Ρ‡Π°ΡΡ‚ΡŒ компилятора, отслСТиваСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ строку ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» Π²ΠΎ врСмя компиляции. Он подставляСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ (Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции) значСния этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ символичСскиС ΠΈΠΌΠ΅Π½Π° __LINE__ ΠΈ __FILE__. Π”Π°Ρ‚Π° ΠΈ врСмя компиляции становятся доступными Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ __DATE__ ΠΈ __TIME__ β€” строки, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ строк Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Ρ‚.ΠΊ. Π² языкС Π‘ ANSI смСТныС строки Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π°.

ΠžΡ‚Π»Π°Π΄ΠΊΠ° Π±Π΅Π· пСрСкомпиляции

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС, стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сущСствуСт способ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±Π΅Π· примСнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° #ifdef DEBUG, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π³ΠΎ пСрСкомпиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ использованиСм.

ΠœΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎ вставкС глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ Ρ„Π»Π°Π³Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠΏΡ†ΠΈΠΈ -d Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, которая Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° Π² ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚Π°Ρ†ΠΈΡŽ, ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° процСсса ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΡ€Π°ΠΏΠ»ΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ строки, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

if (debug) {

 sprintf(msg, ...)

 write_debug(msg)

}

Π—Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ слСдуСт Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ ошибок stderr ΠΈΠ»ΠΈ, Ссли это Π½Π΅ годится ΠΈΠ·-Π·Π° Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ возмоТности ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, прСдоставляСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ syslog.

Если Π²Ρ‹ вставляСтС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ трассировку для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, просто ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ этот ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Если Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ‡ΡƒΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ всСгда, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ проявится, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Π²Π΅Π΄Π΅Π½Π° Π² ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚Π°Ρ†ΠΈΡŽ; Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΠ½ΠΈ смогут Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки для вас. ВмСсто извСстия ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСниС ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ сСгмСнтации, ΠΎΠ½ΠΈ смогут Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² Ρ…ΠΎΠ΄Π΅ выполнСния, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ свои дСйствия. Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ.

Π£ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ явный нСдостаток: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° становится большС, Ρ‡Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это, скорСС, мнимая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ρ‡Π΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π½Π° 20–30% большС, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ всСго это Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ сущСствСнного влияния Π½Π° Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ наступаСт ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° нСсколько порядков, Π° Π½Π΅ Π½Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

ВСрнСмся ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π£ вас Π΅ΡΡ‚ΡŒ ошибка. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, вставив Π² Π½Π΅Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ для контроля Π½Π°Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ просмотра Π΅Π΅ состояния Π² Ρ…ΠΎΠ΄Π΅ выполнСния.

Π’ коммСрчСских UNIX-систСмах Π΅ΡΡ‚ΡŒ ряд ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠ², Π½Π°Π±ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависит ΠΎΡ‚ поставщика систСмы. НаиболСС распространСнныС β€” adb, sdb, idebug ΠΈ dbx. Π‘ΠΎΠ»Π΅Π΅ слоТныС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ состояниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ исходного ΠΊΠΎΠ΄Π°. ИмСнно ΠΊ Ρ‚Π°ΠΊΠΈΠΌ относится ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ GNU, gdb, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² систСмах Linux ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… UNIX. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ внСшниС интСрфСйсы (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹) для gdb, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ; ΠΊ Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ относятся xxgdb, KDbg ΠΈ ddd. НСкоторыС IDE, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ познакомились Π² Π³Π»Π°Π²Π΅ 9, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ срСдства ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΠ»ΠΈ внСшний интСрфСйс для gdb. Π£ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs Π΄Π°ΠΆΠ΅ Π΅ΡΡ‚ΡŒ срСдство (gdb-mode), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ gdb Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова ΠΈ построчно ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ исходного ΠΊΠΎΠ΄Π°.

Для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ нСсколькими ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ опциями. Π­Ρ‚ΠΈ ΠΎΠΏΡ†ΠΈΠΈ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ компилятор Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Она Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° строк β€” свСдСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ мСста Π² исходном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ дошло Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

Π€Π»Π°Π³ -g β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСмых ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ компиляции всСх исходных Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ вСрсии стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… функциях. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилятора пСрСдаст Ρ„Π»Π°Π³ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ автоматичСски. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, Π½Π΅ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ для этой Ρ†Π΅Π»ΠΈ, Π½ΠΎ с мСньшСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ.

ΠžΡ‚Π»Π°Π΄ΠΎΡ‡Π½Π°Ρ информация ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ (Π΄ΠΎ дСсяти) Ρ€Π°Π·. НСсмотря Π½Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΎΠ½ Π·Π°ΠΉΠΌΠ΅Ρ‚ большС мСста Π½Π° дискС), объСм памяти, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, практичСски остаСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ самым. ΠŸΠ΅Ρ€Π΅Π΄ Π²Π²ΠΎΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚Π°Ρ†ΠΈΡŽ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Π°.