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

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

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

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· исполняСмого Ρ„Π°ΠΉΠ»Π° Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ компиляции ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ strip <Ρ„Π°ΠΉΠ»>.

ΠžΡ‚Π»Π°Π΄ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gdb

Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU, gdb. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ распространяСтся бСсплатно ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… UNIX. Он Ρ‚Π°ΠΊΠΆΠ΅ слуТит ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² систСмах Linux. gdb пСрСнСсСн Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ встроСнных систСм Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Запуск gdb

ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ запуститС gdb:

$ cc-g -o debug3 debug3.c

$ gdb debug3

GNU gdb 6.6

Copyright (C) 2006 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you

are welcome to change it and/or distribute copies of it under certain

conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for

details.

This GDB was configured as "i586-suse-linux"...

Using host libthread_db library "/lib/libthread_db.so.1".

(gdb)

Π£ gdb Π΅ΡΡ‚ΡŒ довольно подробная интСрактивная систСма ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ справочноС руководство, прСдставляСмоС ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ info ΠΈΠ»ΠΈ ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs.

(gdb) help

List of classes of commands:


aliases -- Aliases of other commands

breakpoints -- Making program stop at certain points

data -- Examining data

files -- Specifying and examining files

internals -- Maintenance commands

obscure -- Obscure features

running -- Running the program

stack -- Examining the stack

status -- Status inquiries

support -- Support facilities

tracepoints -- Tracing of program execution without stopping the program

user-defined -- User-defined commands


Type "help" followed by a class name for a list of commands in that class.

Type "help all" for the list of all commands.

Type "help" followed by command name for full documentation.

Type "apropos word" to search for commands related to "word".

Command name abbreviations are allowed if unambiguous,

(gdb)

Π‘Π°ΠΌ ΠΏΠΎ сСбС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb β€” ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π΅ΡΡ Π² тСкстовом Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ ΠΎΠ½ прСдоставляСт нСсколько сокращСнных ΠΊΠ»Π°Π²ΠΈΡˆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ для выполнСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π°Π΄Π°Ρ‡. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… вСрсиях Π΅ΡΡ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС с Ρ…Ρ€ΠΎΠ½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ список Π½Π°Π·Π°Π΄ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ снова (ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ клавишами пСрСмСщСния курсора). ВсС вСрсии ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ "ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ"; Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши <Enter> выполняСт послСднюю ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π΅Ρ‰Π΅ Ρ€Π°Π·. Π­Ρ‚ΠΎ особСнно ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² построчном Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ step ΠΈΠ»ΠΈ next.

Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ gdb примСняйтС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ quit.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ run. Π›ΡŽΠ±Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ run, ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠ°ΠΊ Π΅Π΅ собствСнныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ваша систСма, ΠΊΠ°ΠΊ ΠΈ систСмы ΠΎΠ±ΠΎΠΈΡ… Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сообщСниС ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ сСгмСнтации памяти. Если Π½Π΅Ρ‚, Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ дальшС. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сгСнСрируСт сообщСниС ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ сСгмСнтации. Если Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ сообщСния, Π½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π²ΠΎ врСмя чтСния ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΠ³Π΄Π° пСрвая ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с доступом ΠΊ памяти, Π±ΡƒΠ΄Π΅Ρ‚ устранСна, ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° debug4.c.

(gdb) run

Starting program: /home/neil/BLP4e/chapter10/debug3


Program received signal SIGSEGV, Segmentation fault. 

0x0804846f in sort (a=0x804a040, n=5) at debug3.c:23

23 /* 23 */ if(a[j].key > a[j+1].key) {

(gdb)

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, выполняСтся Π½Π΅Π²Π΅Ρ€Π½ΠΎ. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ сбой, gdb ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΈ мСстонахоТдСниС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΡΡΠ½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π’ зависимости ΠΎΡ‚ ядра вашСй систСмы, вСрсий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ ΠΈ компилятора сбой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² строкС 25, ΠΊΠΎΠ³Π΄Π° элСмСнты массива ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ мСстами, Π° Π½Π΅ Π² строкС 23, ΠΊΠΎΠ³Π΄Π° ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ поля key элСмСнтов массива. Если это Ρ‚Π°ΠΊ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС:

Program received signal SIGSEGV, Segmentation fault.

0x8000613 in sort (a=0x8001764, n=5) at debug3.c:25

25 /* 25 */ a[j] = a[j+1];

Π’Ρ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ сСанса Ρ€Π°Π±ΠΎΡ‚Ρ‹ gdb, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСтся Π΄Π°Π»Π΅Π΅.

Врассировка стСка

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° остановлСна ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort Π² строкС 23 исходного Ρ„Π°ΠΉΠ»Π° debug3.c. Если ΠΏΡ€ΠΈ компиляции Π²Ρ‹ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (cc -g), Ρ‚ΠΎ Π½Π΅ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π³Π΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π»Π° сбой, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для просмотра Π΄Π°Π½Π½Ρ‹Ρ….

Π£Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ этого мСста, ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ backtrace:

(gdb) backtrace

#0 0x0804846f in sort (a=0x804a040, n=5) at debug3.c:23

#1 0x08048583 in main() at debug3.c:37

(gdb)

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈ трассировка Ρƒ Π½Π΅Π΅ короткая, Ρ‚.ΠΊ. Π²Ρ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ sort Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° ΠΈΠ· main Π² строкС 37 Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π° debug3.c. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС, ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° backtrace примСняСтся для опрСдСлСния ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π» ΠΊ мСсту ошибки. Π­Ρ‚Π° информация ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· мноТСства Ρ€Π°Π·Π½Ρ‹Ρ… мСст.

Π£ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ backtrace Π΅ΡΡ‚ΡŒ сокращСнная Ρ„ΠΎΡ€ΠΌΠ° bt ΠΈ для совмСстимости с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° where, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π²Ρ‹Π²Π΅Π» Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ остановки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Π² трассировкС стСка ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Ѐункция sort Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π°, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ 0Ρ…804Π°040. Π­Ρ‚ΠΎ адрСс массива. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… систСмах Ρ€Π°Π·Π½Ρ‹ΠΉ ΠΈ зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… компилятора ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

Ббойная строка 23 β€” сравнСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта массива с Π΄Ρ€ΡƒΠ³ΠΈΠΌ:

/* 23 */ if (a[j].key > a[j+1].key) {

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для просмотра содСрТимого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Команда print ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

(gdb) print j

$1 = 4

Π’Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ j Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4. Π›ΡŽΠ±Ρ‹Π΅ значСния, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ gdb, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½ΠΎΠΉ, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ использования Π² псСвдопСрСмСнных. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $1 присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4, Π½Π° случай, Ссли ΠΎΠ½Π° Π²Π°ΠΌ ΠΏΠΎΠ·ΠΆΠ΅ понадобится. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ свои Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… $2, $3 ΠΈ Ρ‚.Π΄.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ j, Ρ€Π°Π²Π½ΠΎΠ΅ 4, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

if (Π°[4].key > Π°[4+1].key)

Π£ массива array, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡΡ‚ΡŒ элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ 0 Π΄ΠΎ 4. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ считываСт Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт массива array[5]. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ†ΠΈΠΊΠ»Π° j приняла Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Если ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ Π² строкС 25, систСма ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ массива, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° взялась Π·Π° пСрСстановку элСмСнтов массива, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

/* 25 */ Π°[j] = a[j+1];

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ j, Ρ€Π°Π²Π½ΠΎΠΉ 4, Π΄Π°Π΅Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅

Π°[4] = Π°[4+1];

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ элСмСнты ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ массива ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ print. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ gdb Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ любоС допустимоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ языка Π‘ для Π²Ρ‹Π²ΠΎΠ΄Π° значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, элСмСнта массива ΠΈΠ»ΠΈ указатСля.

(gdb) print Π°[3]

$2 = {data = "alex", '\0' <repeats 4091 times>, key = 1}

(gdb)

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ Π² псСвдопСрСмСнных Π²ΠΈΠ΄Π° $<Π½ΠΎΠΌΠ΅Ρ€>. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ послСднСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ всСгда хранится Π² псСвдопСрСмСнной $, Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ β€” Π² $$. Π­Ρ‚ΠΎ позволяСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. НапримСр:

(gdb) print j

$3 = 4

(gdb) print a[$-1].key

$4 = 1

Π’Ρ‹Π²ΠΎΠ΄ листинга ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ gdb вывСсти Π½Π° экран исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ list. Она Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, располоТСнного рядом с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ list Π²Ρ‹Π²Π΅Π΄ΡƒΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ тСкст. КомандС list ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ тСкста Π² этом мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² строк, ΠΈ Π½Π° экранС появится тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, находящийся ΠΌΠ΅ΠΆΠ΄Ρƒ этими строками.