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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux: ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 125

Автор ДСнис ΠšΠΎΠ»ΠΈΡΠ½ΠΈΡ‡Π΅Π½ΠΊΠΎ

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gdb Π²Ρ‹ смоТСтС:

♦ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ;

♦ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² пошаговом Ρ€Π΅ΠΆΠΈΠΌΠ΅;

♦ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова (breakpoint);

♦ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ условиС останова ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;

♦ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ.

22.2. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° gdb ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-sΠ΅ prog] [-c core] [-x cmds] [-d dir] [prog|core|procID]]

ΠšΠ»ΡŽΡ‡ΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° описаны Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 22.1.


ΠšΠ»ΡŽΡ‡ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки gdb Π’Π°Π±Π»ΠΈΡ†Π° 22.1

ΠšΠ»ΡŽΡ‡ НазначСниС -help ΠΈΠ»ΠΈ -h Π’Ρ‹Π²ΠΎΠ΄ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ описания всСх ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² -nx ΠΈΠ»ΠΈ -n НС ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ„Π°ΠΉΠ»Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ .gdbinit -q НС Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ привСтствиС ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± авторских ΠΏΡ€Π°Π²Π°Ρ… -batch ΠšΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли Π±Ρ‹Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅, Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -x (ΠΈ Ρ„Π°ΠΉΠ»Π΅ .gdbinit, Ссли Π΅Π³ΠΎ использованиС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ). Если ΠΆΠ΅ хотя Π±Ρ‹ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°, возвращаСтся Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -cd=ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³) -f ΠΈΠ»ΠΈ -fullname Данная опция Π½ΡƒΠΆΠ½Π°, Ссли Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс тСкстового процСссора Emacs для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gdb. Для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ описаний ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ справочной систСмС -b bps (bits per second) Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ интСрфСйсу, Ссли Π²Ρ‹ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅Ρ‚Π΅ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ -tty=Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π² качСствС стандартного Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° для ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. -s Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ -symbols=Ρ„Π°ΠΉΠ» Π§ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° -write Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ запись Π² исполняСмыС ΠΈ core-Ρ„Π°ΠΉΠ»Ρ‹ -e ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² качСствС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π΄Π°ΠΌΠΏΠ° -se=Ρ„Π°ΠΉΠ» Π§ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² качСствС исполнимого -core=Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ -с Ρ„Π°ΠΉΠ» Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π΄Π°ΠΌΠΏΠ° -command=Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ -x Ρ„Π°ΠΉΠ» Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅) -d ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΊ списку поиска исходных тСкстов [prog|core|procID] ПослСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (prog), ΠΈΠ»ΠΈ Π΄Π°ΠΌΠΏ-Ρ„Π°ΠΉΠ» (core), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ создан Π² случаС ошибки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Segmentation fault), ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ процСссу (procID) -p PID ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ процСссу (данная опция стала доступной Π² вСрсии gdb 5.2)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gdb для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² исполняСмый Ρ„Π°ΠΉΠ» ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Для этого ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -g:

$ gcc -g -o prog prog.c

Данная опция Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² Ρ€ΠΎΠ΄Π½ΠΎΠΌ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ gdb.

Π—Π°Ρ‚Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ gdb Ρ‚Π°ΠΊ:

$ gdb prog

Если послС запуска вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка ΠΈ Π±Ρ‹Π» создан Π΄Π°ΠΌΠΏ-Ρ„Π°ΠΉΠ» (core), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΡƒ ΠΈ этот Ρ„Π°ΠΉΠ»:

$ gdb prog core

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ процСссу, для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ PID:

$ gdb 1111

Волько ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ сначала Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π½Π΅Ρ‚ Ρ„Π°ΠΉΠ»Π° 1111, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ gdb сначала ΠΈΡ‰Π΅Ρ‚ исполняСмый Ρ„Π°ΠΉΠ», Π·Π°Ρ‚Π΅ΠΌ core-Ρ„Π°ΠΉΠ», Π° ΡƒΠΆΠ΅ Π·Π°Ρ‚Π΅ΠΌ PID.

ПослС запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, самыС Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… пСрСчислСны Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 22.2. Об ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π² справочной систСмС: man gdb.


ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ gdb Π’Π°Π±Π»ΠΈΡ†Π° 22.2

Команда НазначСниС break [Ρ„Π°ΠΉΠ»:]функция Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова run [Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹] Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΉ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ bt ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ трассировка: ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ стСк ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ print Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ВывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π‘ ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (послС останова) Next Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ шаг Β«Π½Π°Π΄Β» (step over). Если ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка β€” Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π΅ Π·Π° ΠΎΠ΄ΠΈΠ½ шаг β€” Β«ΠΏΠ΅Ρ€Π΅ΡˆΠ°Π³Π½Π΅ΠΌΒ» Π΅Π΅ Step Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку, Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ шаг Β«Π²Β» (step into). Если ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка β€” Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ help [имя] ВывСсти справку ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΈΠ»ΠΈ вывСсти ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π½Π΅ΠΌ Quit Π’Ρ‹Ρ…ΠΎΠ΄

Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Если вас интСрСсуСт Π±ΠΎΠ»Π΅Π΅ полная информация, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ руководству ΠΏΠΎ gdb.

22.3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая обнуляСт элСмСнты массива a[]. Π”Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, Π½ΠΎ Π½Π° Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ gdb.

Π’ΠΎΡ‚ листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

Листинг 22.1. ДСмонстрационная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, содСрТащая ΠΎΡˆΠΈΠ±ΠΊΡƒ

#include <stdio.h>


int main() {

 char developer[]="Denis";

 int a[10];

 int i;

 do {

  a[i]=0;

  i++;

 } while (i<10);

 return 0;

}

НазовСм Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ test.c ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π΅:

$ gcc -g -o test test.с

ΠžΠΏΡ†ΠΈΡ -g добавляСт ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° gdb, Π° опция -o ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ имя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°.

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ β€” ΠΎΠ½Π° всСго лишь Π² Ρ†ΠΈΠΊΠ»Π΅ do обнуляСт всС элСмСнты массива β€” сначала Π½ΡƒΠ»Π΅Π²ΠΎΠΉ элСмСнт a[0] становится Π½ΡƒΠ»Π΅ΠΌ, ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС: Segmentation fault. Π’ Ρ‡Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°? ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° gdb. ЗапуститС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ test (это имя нашСго исполняСмого Ρ„Π°ΠΉΠ»Π°):

$ gdb test

Π’ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ gdb Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ run для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. И Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ? Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° сигнал SIGSEGV, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ мСсто ошибка Segmentation fault. Π­Ρ‚Π° ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π² строкС 12: a[i]=0. Но Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ опасного Π² этом ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅? Ошибка Segmentation fault ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ нСскольким ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ массива. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ это: Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ print i.

Команда print Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΈΠ»ΠΈ выраТСния). Ого! ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΌΡ‹ пытаСмся ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ Π½Π΅ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ элСмСнт массива, Π° 715910728-ΠΎΠΉ! ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Ρ‚Π°ΠΊ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ? ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, это gdb Π½Π°Π³Π»ΠΎ Π²Ρ€Π΅Ρ‚ ΠΈ вмСсто значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ нСпонятно Ρ‡Ρ‚ΠΎ? Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π»ΠΆΠΈΠ²ΠΎΡΡ‚ΡŒ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ print developer, которая Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π½Π° экран Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ developer. Π‘ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ developer всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ β€” Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«DenisΒ» (рис. 22.1).

Рис. 22.1. БСссия gdb

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ? Π’Π°ΠΊ ΠΊΠ°ΠΊ пСрСмСнная i Π½Π΅ являСтся глобальной, Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ обнуляСтся ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ошибки, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ объявлСнии:

int i = 0;

Π’ΠΎΡ‚ ΠΌΡ‹ ΠΈ нашли ΠΎΡˆΠΈΠ±ΠΊΡƒ!

Π§Ρ‚ΠΎ ΠΆΠ΅ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gdb? МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ breakpoint, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова, ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ мСстС. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ состояниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ/ΠΈΠ»ΠΈ стСка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΆΠ΅ для пошаговой трассировки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Для пошаговой трассировки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ установитС Ρ‚ΠΎΡ‡ΠΊΡƒ останова для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main: