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

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

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

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

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

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

strip &lt;<i>Ρ„Π°ΠΉΠ»</i>&gt;
.

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

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

Запуск gdb

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

$ <b>cc-g -o debug3 debug3.c</b>

$ <b>gdb debug3</b>

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 &quot;show copying&quot; to see the conditions.

There is absolutely no warranty for GDB. Type &quot;show warranty&quot; for

details.

This GDB was configured as &quot;i586-suse-linux&quot;...

Using host libthread_db library &quot;/lib/libthread_db.so.1&quot;.

(gdb)

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

info
ΠΈΠ»ΠΈ ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs.

(gdb) <b>help</b>

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 &quot;help&quot; followed by a class name for a list of commands in that class.

Type &quot;help all&quot; for the list of all commands.

Type &quot;help&quot; followed by command name for full documentation.

Type &quot;apropos word&quot; to search for commands related to &quot;word&quot;.

Command name abbreviations are allowed if unambiguous,

(gdb)

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

step
ΠΈΠ»ΠΈ
next
.

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

quit
.

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

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

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

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

(gdb) <b>run</b>

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 &gt; 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
), Ρ‚ΠΎ Π½Π΅ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π³Π΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π»Π° сбой, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для просмотра Π΄Π°Π½Π½Ρ‹Ρ….