ΠΡΠ»Π°Π΄ΠΎΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ (Π΄ΠΎ Π΄Π΅ΡΡΡΠΈ) ΡΠ°Π·. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° (ΠΎΠ½ Π·Π°ΠΉΠΌΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ° Π½Π° Π΄ΠΈΡΠΊΠ΅), ΠΎΠ±ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ°ΠΌΡΠΌ. ΠΠ΅ΡΠ΅Π΄ Π²Π²ΠΎΠ΄ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈΠ· Π½Π΅Π΅ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠ»Π°ΠΆΠ΅Π½Π°.
Π£Π΄Π°Π»ΠΈΡΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π±Π΅Π· ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ
strip <<i>ΡΠ°ΠΉΠ»</i>>ΠΡΠ»Π°Π΄ΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ gdb
ΠΠ»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠ° GNU, gdb. ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΌΠΎΡΠ½ΡΠΉ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ UNIX. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΡΠ»ΡΠΆΠΈΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Linux. gdb ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅Π½ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ°ΠΏΡΡΠΊ gdb
ΠΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ gdb:
$ <b>cc-g -o debug3 debug3.c</b>$ <b>gdb debug3</b>GNU gdb 6.6Copyright (C) 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and youare welcome to change it and/or distribute copies of it under certainconditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" fordetails.This GDB was configured as "i586-suse-linux"...Using host libthread_db library "/lib/libthread_db.so.1".(gdb)Π£ gdb Π΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΠΌΠΎΡΠΈ ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ΅ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
info(gdb) <b>help</b>List of classes of commands:aliasesΒ -- Aliases of other commandsbreakpointsΒ -- Making program stop at certain pointsdataΒ -- Examining datafilesΒ -- Specifying and examining filesinternalsΒ -- Maintenance commandsobscureΒ -- Obscure featuresrunningΒ -- Running the programstack -- Examining the stackstatus -- Status inquiriessupport -- Support facilitiestracepoints -- Tracing of program execution without stopping the programuser-definedΒ -- User-defined commandsType "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> Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΅ΡΠ΅ ΡΠ°Π·. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄
stepnextΠΠ»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ gdb ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
quitΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
runrunΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠ°ΠΊ ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠ±ΠΎΠΈΡ Π°Π²ΡΠΎΡΠΎΠ², ΡΠ΅ΠΏΠ΅ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΈΡΠ°ΠΉΡΠ΅ Π΄Π°Π»ΡΡΠ΅. ΠΡ ΡΠ·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π½ΠΎ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠ΅Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²Π°Ρ ΠΈΠ· ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ, Π±ΡΠ΄Π΅Ρ ΡΡΡΡΠ°Π½Π΅Π½Π°, ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° debug4.c.
(gdb) <b>run</b>Starting program: /home/neil/BLP4e/chapter10/debug3Program received signal SIGSEGV, Segmentation fault.Β 0x0804846f in sort (a=0x804a040, n=5) at debug3.c:2323 /* 23 */Β if(a[j].key > a[j+1].key) {(gdb)ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠ΅ΠΆΠ΄Π΅, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π΅Π²Π΅ΡΠ½ΠΎ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π°Π΅Ρ ΡΠ±ΠΎΠΉ, gdb ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΈ ΠΌΠ΅ΡΡΠΎΠ½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅. Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΡΠ½ΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΄ΡΠ° Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π²Π΅ΡΡΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π‘ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² ΡΡΡΠΎΠΊΠ΅ 25, ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, Π° Π½Π΅ Π² ΡΡΡΠΎΠΊΠ΅ 23, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΠ»Ρ
keyProgram received signal SIGSEGV, Segmentation fault.0x8000613 in sort (a=0x8001764, n=5) at debug3.c:2525Β /* 25 */Β a[j] = a[j+1];ΠΡ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠ΅Π°Π½ΡΠ° ΡΠ°Π±ΠΎΡΡ gdb, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π΄Π°Π»Π΅Π΅.
Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅ΠΊΠ°
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ»Π° ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ
sortcc -g