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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 4

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

Π’ нашСм тСстовом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ reciprocal Ρ‚Ρ€ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… модуля: reciprocal.o, main.o ΠΈ сама ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° reciprocal. ΠŸΡ€Π°Π²ΠΈΠ»Π° Π½Π°ΠΌ ΡƒΠΆΠ΅ извСстны: это рассмотрСнныС Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ строки. А Π²ΠΎΡ‚ Π½Π°Π΄ зависимостями Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ. Ясно, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» reciprocal зависит ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² reciprocal.o ΠΈ main.o, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π΅ создав ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°. ПослСдниС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… исходных Ρ„Π°ΠΉΠ»ΠΎΠ². НСльзя Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ Ρ„Π°ΠΉΠ»Π΅ reciprocal.hpp: ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠ±Π° исходных Ρ„Π°ΠΉΠ»Π°, поэтому Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

Помимо ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ clean. Он ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для удалСния всСх сгСнСрированных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ всС сначала. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ модуля Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ rm, ΡƒΠ΄Π°Π»ΡΡŽΡ‰ΡƒΡŽ пСрСчислСнныС Ρ„Π°ΠΉΠ»Ρ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ всю эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ make, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Makefile. Π•Π³ΠΎ содСрТимоС Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

reciprocal: main.o reciprocal.o

       g++ $(CFLAGS) -ΠΎ reciprocal main.o reciprocal.o


main.o: main.c reciprocal.hpp

        gcc $(CFLAGS) -c main.c


reciprocal.o: reciprocal.cpp reciprocal.hpp

        g++ $(CFLAGS) -c reciprocal.cpp


clean:

        rm -f *.o reciprocal

Π¦Π΅Π»Π΅Π²Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ пСрСчислСны слСва. Π—Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ модуля слСдуСт Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ зависимости. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ создаСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ записи $(CFLAGS) ΠΌΡ‹ ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ). Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с символа табуляции, ΠΈΠ½Π°Ρ‡Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° make ΠΏΡ€ΠΎΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ созданныС Π½Π°ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ввСсти

% make

Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

% make

gcc -c main.c

g++ -c reciprocal.cpp

g++ -o reciprocal main.o reciprocal.o

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° make автоматичСски создала ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ скомпоновала ΠΈΡ…. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ внСсти ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ» main.c ΠΈ снова Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚:

% make

gcc -с main.c

g++ -ΠΎ reciprocal main.o reciprocal.o

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° make ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ создала Ρ„Π°ΠΉΠ» main.o ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ Π½Π΅ стала ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» reciprocal.cpp, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² этом Π½Π΅ Π±Ρ‹Π»ΠΎ нСобходимости.

Π—Π°ΠΏΠΈΡΡŒ $(CFLAGS) ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ make. Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ Makefile, Π»ΠΈΠ±ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° подставит Π½Π° мСсто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎ врСмя выполнСния ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ:

% make clean

rm -f *.o reciprocal

% make CFLAGS=-O2

gcc -O2 -c main.c

g++ -O2 -c reciprocal.cpp

g++ -O2 -o reciprocal main.o reciprocal.o

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ вмСсто записи $(CFLAGS) Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… появился Ρ„Π»Π°Π³ -O2.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрСли лишь самыС основныС возмоТности ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ make. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎ Π½Π΅ΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ввСдя Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

% info make

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

1.4. GNU-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ β€” это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ написанная Π²Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ. Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ приходится ΠΎΡ‡Π΅Π½ΡŒ часто. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Linux-программистов ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с GNU-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ (GNU Debugger, GDB), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт пошагово Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ значСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

1.4.1. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ GNU-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π² Π½Π΅Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎΠΉ Ρ†Π΅Π»ΠΈ слуТит опция -g компилятора. Если имССтся описанный Π²Ρ‹ΡˆΠ΅ Ρ„Π°ΠΉΠ» Makefile, достаточно Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ CFLAGS Ρ€Π°Π²Π½ΠΎΠΉ -g ΠΏΡ€ΠΈ запускС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ make:

% make CFLAGS=-g

gcc -g -с main.c

g++ -g -c reciprocal.cpp

g++ -g -ΠΎ reciprocal main.o reciprocal.o

ВстрСчая Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Ρ„Π»Π°Π³ -g, компилятор Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΈ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹. Благодаря этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΡƒΠ·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ адрСса ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ строкам Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ исходном Ρ„Π°ΠΉΠ»Π΅, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ Ρ‚.Π΄.

1.4.2. Запуск ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb запускаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

% gdb reciprocal

ПослС запуска появится строка ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°:

(gdb)

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ. Для этого Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ run ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

(gdb) run

Starting program: reciprocal


Program received signal SIGSEGV, Segmentation fault.

__strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

at strtol.c:287

287  strtol.c: No such file or directory.

(gdb)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() Π½Π΅ прСдусмотрСны срСдства контроля ошибок. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ наличия Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π΅Π³ΠΎ Π½Π΅Ρ‚. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сигнала SIGSEGV ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΡ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ опрСдСляСт, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΊΡ€Π°Ρ…Π° находится Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ __strtol_internal(). Π­Ρ‚Π° функция являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½ΠΎ Π΅Π΅ исходный Ρ„Π°ΠΉΠ» отсутствуСт. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ появляСтся сообщСниС "No such file or directory". Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ where ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ содСрТимоС стСка:

(gdb) where

#0 __strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

   at strtol.c:287

#1 0x40096fb6 in atoi (nptr=0x0) at ../stdlib/stdlib.h:251

#2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8

Как Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, функция main() Π²Ρ‹Π·Π²Π°Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ atoi(), ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ стало ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ошибки.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ up ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒΡΡ Π½ΠΎ стСку Π½Π° Π΄Π²Π° уровня, дойдя Π΄ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main():

(gdb) up 2

#2 0x804863Π΅ in main (argc=1, argv=0xbffff5e4) at main.c:8

8    i = atoi(argv[1]);

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ нашСл исходный Ρ„Π°ΠΉΠ» main.c ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ» строку, Π³Π΄Π΅ располагаСтся ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π£Π·Π½Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎΠΉ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ позволяСт ΠΊΠΎΠΌΠ°Π½Π΄Π° print:

(gdb) print argv[1]

$2 = 0x0

Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ Π½Π°ΡˆΡƒ Π΄ΠΎΠ³Π°Π΄ΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ошибки β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ atoi() указатСля NULL.

Установка ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ осущСствляСтся посрСдством ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ break:

(gdb) break main

Breakpoint 1 at 0x804862e: file main.c, line 8.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(). Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ запустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΉ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚:

(gdb) run 7

Starting program: reciprocal 7


Breakpoint 1, main (argc=2, argv=0xbffff5e4) at main.c:8

8   i = atoi(argv[1]);

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ остановился Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅- ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ next:

(gdb) next

9    printf("The reciprocal of %d is %g\n", i,

reciprocal(i));

Если трСбуСтся ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reciprocal(), Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ step:

(gdb) step

reciprocal (i=7) at reciprocal.cpp:6

6    assert(i != 0);

Иногда ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb нСпосрСдствСнно ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs, Π° Π½Π΅ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Для этого слСдуСт ввСсти Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ M-x gdb. Когда ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ останавливаСтся Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Emacs автоматичСски ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ исходный Ρ„Π°ΠΉΠ». НС ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ. ΠΏΡ€ΠΎΡ‰Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² происходящСм, глядя Π½Π° вСсь Ρ„Π°ΠΉΠ», Π° Π½Π΅ Π½Π° ΠΎΠ΄Π½Ρƒ Π΅Π³ΠΎ строку?

1.5. Поиск Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

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

НиТС описаны Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ источники ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² Linux.

1.5.1. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ докумСнтация

Π’ дистрибутивы Linux входят man-страницы с описаниСм Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° стандартных ΠΊΠΎΠΌΠ°Π½Π΄, систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ докумСнтация Ρ€Π°Π·Π±ΠΈΡ‚Π° Π½Π° Ρ€Π°Π·Π΄Π΅Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ присвоСны Π½ΠΎΠΌΠ΅Ρ€Π°. Для программистов Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹:

(1) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹;