ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ gdb ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. ΠžΡ‚Π»Π°Π΄ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GDB. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² GDB

ЦСль ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ - устранСниС ошибок Π² Π΅Ρ‘ ΠΊΠΎΠ΄Π΅. Для этого Π²Π°ΠΌ, скорСС всСго, придётся ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ состояниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²ΠΎ врСмя выполнСния , Ρ€Π°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ сам процСсс выполнСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ условныС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹). Π’ΡƒΡ‚ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ - наш ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π² Π‘ΠΈ достаточно ΠΌΠ½ΠΎΠ³ΠΎ возмоТностСй ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π±Π΅Π· нСпосрСдствСнной остановки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: ΠΎΡ‚ простогоprintf(3) Π΄ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… систСм вСдСния Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎ сСти ΠΈ syslog . Π’ ассСмблСрС Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹, Π½ΠΎ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ наблюдСниС Π·Π° состояниСм рСгистров, ΠΎΠ±Ρ€Π°Π· ( dump ) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ссли Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π° ассСмблСрС, Ρ‚ΠΎ Π±Π΅Π· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π²Ρ‹ вряд Π»ΠΈ ΠΎΠ±ΠΎΠΉΠ΄Ρ‘Ρ‚Π΅ΡΡŒ.

ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ с опрСдСлСния Ρ‚ΠΎΡ‡ΠΊΠΈ останова ( breakpoint ), Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊΠΎΠΉ участок ΠΊΠΎΠ΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ способ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π°Ρ‰Π΅ всСго: ставим Ρ‚ΠΎΡ‡ΠΊΡƒ останова, запускам ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ Π΅Ρ‘ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ шагам, ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ наблюдая Π·Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ рСгистрами. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠ·-Π·Π° segmentation fault, - Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, какая инструкция пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ памяти, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΊ ошибкС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄ Π΅Ρ‰Ρ‘ Ρ€Π°Π·, ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π΅Π³ΠΎ ΠΏΠΎ шагам, поставив Ρ‚ΠΎΡ‡ΠΊΡƒ останова Ρ‡ΡƒΡ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° сбоя.

Начнём с простого. Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Hello world ΠΈ скомпилируСм Π΅Ρ‘ с ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ»ΡŽΡ‡Π° компилятора -g :

$ gcc -g hello.s -o hello $

ЗапускаСм gdb:

$ gdb ./hello GNU gdb 6.4.90-debian 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 "i486-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb)

GDB запустился, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ» ΠΈΡΡΠ»Π΅Π΄ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹Π²Π΅Π» Π½Π° экран ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ (gdb) ΠΈ ΠΆΠ΄Ρ‘Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ "ΠΏΠΎ шагам" ( single-step mode ). Для этого Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ - Ρ‚ΠΎΠ³Π΄Π° остановка Π±ΡƒΠ΄Π΅Ρ‚ осущСствлСна ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ исполнСния инструкций этой ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π•Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ строки.

(gdb) b main Breakpoint 1 at 0x8048324: file hello.s, line 17. (gdb)

b - сокращСниС ΠΎΡ‚ break . ВсС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² GDB ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒ, Ссли это Π½Π΅ создаёт двусмыслСнных Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΊ. ЗапускаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ run . Π­Ρ‚Π° ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для пСрСзапуска Ρ€Π°Π½Π΅Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

(gdb) r Starting program: /tmp/hello Breakpoint 1, main () at hello.s:17 17 movl $4, %eax /* ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ систСмного Π²Ρ‹Π·ΠΎΠ²Π° write = 4 Current language: auto; currently asm (gdb)

GDB остановил ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΆΠ΄Ρ‘Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄. Π’Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ, имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ , которая сСйчас исполняСтся, имя Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ строки. Для пошагового исполнСния Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: step (сокращённо s ) ΠΈ next (сокращённо n ). Команда step ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π·Π°Ρ…ΠΎΠ΄ΠΎΠΌ Π² Ρ‚Π΅Π»Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Команда next выполняСт пошагово Ρ‚ΠΎΠ»ΡŒΠΊΠΎ инструкции Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

(gdb) n 20 movl $1, %ebx /* ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - Π² рСгистр %ebx */ (gdb)

Π˜Ρ‚Π°ΠΊ, инструкция Π½Π° строкС 17 Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°, ΠΈ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² рСгистрС %eax находится число 4. Для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° print (сокращённо p ). Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ ассСмблСра, GDB Π² записи рСгистров ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°ΠΊ $ вмСсто % . ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² рСгистрС %eax :

(gdb) p $eax $1 = 4 (gdb)

Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 4! GDB Π½ΡƒΠΌΠ΅Ρ€ΡƒΠ΅Ρ‚ всС Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ выраТСния. БСйчас ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ($1 ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π²Π½ΠΎ 4. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊ этому Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ простыС вычислСния:

(gdb) p $1 $2 = 4 (gdb) p $1 + 10 $3 = 14 (gdb) p 0x10 + 0x1f $4 = 47 (gdb)

Пока ΠΌΡ‹ ΠΈΠ³Ρ€Π°Π»ΠΈ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ print , ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π°Π±Ρ‹Π»ΠΈ, какая инструкция исполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ. Команда info line Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ строкС ΠΊΠΎΠ΄Π°. Π‘Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строкС.

(gdb) info line Line 20 of "hello.s" starts at address 0x8048329 and ends at 0x804832e . (gdb)

Команда list (сокращённо l ) Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран исходный ΠΊΠΎΠ΄ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ:

  • Π½ΠΎΠΌΠ΅Ρ€_строки - Π½ΠΎΠΌΠ΅Ρ€ строки Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅;
  • Ρ„Π°ΠΉΠ»:Π½ΠΎΠΌΠ΅Ρ€_строки - Π½ΠΎΠΌΠ΅Ρ€ строки Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅;
  • имя_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли Π½Π΅Ρ‚ нСоднозначности;
  • Ρ„Π°ΠΉΠ»:имя_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅;
  • *адрСс - адрСс Π² памяти, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ располоТСна нСобходимая инструкция.

Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ , ΠΊΠΎΠΌΠ°Π½Π΄Π° list Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 10 строк исходного ΠΊΠΎΠ΄Π° Π²ΠΎΠΊΡ€ΡƒΠ³ этого мСста. ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ строку Π½Π°Ρ‡Π°Π»Π° ΠΈ строку ΠΊΠΎΠ½Ρ†Π° листинга.

(gdb) l main 12 Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ этого Ρ„Π°ΠΉΠ»Π° */ 13 .type main, @function /* main - функция (Π° Π½Π΅ Π΄Π°Π½Π½Ρ‹Π΅) */ 14 15 16 main: 17 movl $4, %eax /* ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ систСмного Π²Ρ‹Π·ΠΎΠ²Π° 18 write = 4 Π² рСгистр %eax */ 19 20 movl $1, %ebx /* ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² рСгистр 21 %ebx; Π½ΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора 22 stdout = 1 */ (gdb) l *$eip 0x8048329 is at hello.s:20. 15 16 main: 17 movl $4, %eax /* ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ систСмного Π²Ρ‹Π·ΠΎΠ²Π° 18 write = 4 Π² рСгистр %eax */ 19 20 movl $1, %ebx /* ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² рСгистр 21 %ebx; Π½ΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора 22 stdout = 1 */ 23 movl $hello_str, %ecx /* Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² 24 рСгистр %ecx; ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку */ (gdb) l 20, 25 20 movl $1, %ebx /* ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² рСгистр 21 %ebx; Π½ΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора 22 stdout = 1 */ 23 movl $hello_str, %ecx /* Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² 24 рСгистр %ecx; ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку */ 25 (gdb)

Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: list *$eip . Π‘ Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Π²ΠΎΠΊΡ€ΡƒΠ³ инструкции, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ВыполняСм Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ дальшС:

(gdb) n 23 movl $hello_str, %ecx /* Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² рСгистр %ecx (gdb) n 26 movl $hello_str_length, %edx /* Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² рСгистр %edx (gdb)

НС ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ, ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ n ? Если просто Π½Π°ΠΆΠ°Ρ‚ΡŒ Enter , GDB ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ послСднюю ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

(gdb) 29 int $0x80 /* Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ 0x80 */ (gdb) Hello, world! 31 movl $1, %eax /* Π½ΠΎΠΌΠ΅Ρ€ систСмного Π²Ρ‹Π·ΠΎΠ²Π° exit = 1 */ (gdb)

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° удобная ΠΊΠΎΠΌΠ°Π½Π΄Π° , ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стоит Π·Π½Π°Ρ‚ΡŒ - info registers . ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄ΠΎ i r . Π•ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - список рСгистров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ. НапримСр, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ происходит Π² Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½Π°ΠΌ вряд Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ интСрСсны значСния сСгмСнтных рСгистров.

(gdb) info registers eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xbfabb5a8 esi 0x0 0 edi 0xb7f6bcc0 -1208566592 eip 0x804833a 0x804833a eflags 0x246 [ PF ZF IF ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) info registers eax ecx edx ebx esp ebp esi edi eip eflags eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xbfabb5a8 esi 0x0 0 edi 0xb7f6bcc0 -1208566592 eip 0x804833a 0x804833a eflags 0x246 [ PF ZF IF ] (gdb)

Π’Π°ΠΊ, Π° ΠΊΡ€ΠΎΠΌΠ΅ рСгистров Ρƒ нас вСдь Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΈ

GNU Debugger – пСрСносимый ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… систСмах ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… языков программирования, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π‘ΠΈ, C++, Ada ΠΈ Π€ΠΎΡ€Ρ‚Ρ€Π°Π½. GNU Debugger – свободноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, распространяСмоС ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU General Public License.

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ GNU Debugger написан Π ΠΈΡ‡Π°Ρ€Π΄ΠΎΠΌ Π‘Ρ‚ΠΎΠ»Π»ΠΌΠ°Π½ΠΎΠΌ Π² 1988 Π³ΠΎΠ΄Ρƒ. Π—Π° основу Π±Ρ‹Π» взят ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ DBX, ΠΏΠΎΡΡ‚Π°Π²Π»ΡΠ²ΡˆΠΈΠΉΡΡ с дистрибутивом BSD. Π‘ 1990 Π΄ΠΎ 1993 Π³Π³. ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ поддСрТивался Π”ΠΆΠΎΠ½ΠΎΠΌ Π”ΠΆΠΈΠ»ΠΌΠΎΡ€ΠΎΠΌ, Π²ΠΎ врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Cygnus Solutions. Π’ настоящСС врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° координируСтся Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ΠΎΠΌ GDB (GDB Steering Committee), Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ Free Software Foundation.

ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ GNU Debugger

  • ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ

GNU Debugger ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹Π΅ срСдства для слСТСния ΠΈ контроля Π·Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π΄Π°ΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ нСзависимо ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. GNU Debugger ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ a.out, COFF (Π² Ρ‚ΠΎΠΌ числС исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Windows), ECOFF, XCOFF, ELF, SOM, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… stabs, COFF, ECOFF, DWARF, DWARF2. НаибольшиС возмоТности ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ прСдоставляСт Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DWARF2.

GNU Debugger Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ развиваСтся. НапримСр, Π² вСрсии 7.0 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Β«ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈΒ», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΎΡ‚ΠΌΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π·Π°Π΄ процСсс выполнСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ. Π’Π°ΠΊΠΆΠ΅ Π² вСрсии 7.0 Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° скриптинга Π½Π° .

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с GNU Debugger Π±Ρ‹Π»ΠΈ созданы ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти.

  • ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° встроСнных систСм

GNU Debugger ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ скомпилирован для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π²ΠΎ врСмя ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ сСссии. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Ρ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ GNU Debugger (2003): Alpha, ARM, H8/300, System/370, System/390, x86 ΠΈ x86-64, IA-64 (Itanium), Motorola 68000, MIPS, PA-RISC, PowerPC, SuperH, SPARC, VAX, A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, Intel i960, M32R, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K, Stormy16, V850 ΠΈ Z8000. (Π‘ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Π΅ выпуски Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚, вСроятно, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π½ΠΈΡ….) Π¦Π΅Π»Π΅Π²Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… GNU Debugger Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½, Π² частности, встроСнныС систСмы, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнного симулятора (процСссоры ARM, AVR), Π»ΠΈΠ±ΠΎ прилоТСния для Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ скомпилированы со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ GNU Debugger, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π’Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π° Ρ„Π°ΠΉΠ» Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ELF, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ впослСдствии с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ извлСкаСтся Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ.

  • Удалённая ΠΎΡ‚Π»Π°Π΄ΠΊΠ°

ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ GNU Debugger запускаСтся Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС, Π° отлаТиваСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запускаСтся Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Бвязь осущСствляСтся ΠΏΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ ΠΈΠ»ΠΈ TCP/IP. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» взаимодСйствия с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ спСцифичСн для GNU Debugger, Π½ΠΎ исходныС ΠΊΠΎΠ΄Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π°Ρ€Ρ…ΠΈΠ² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. Как Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°, Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° gdbserver ΠΈΠ· состава ΠΏΠ°ΠΊΠ΅Ρ‚Π° GNU Debugger, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ установки Ρ‚ΠΎΡ‡Π΅ΠΊ останова ΠΈ доступа ΠΊ рСгистрам ΠΈ памяти.

Π­Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅ΠΆΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для взаимодСйствия со встроСнным ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ ядра Linux KGDB. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ ядро ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ: ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова, Π΄Π΅Π»Π°Ρ‚ΡŒ пошаговоС исполнСниС ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. ВстроСнный ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Π΄Π²ΡƒΡ… машин, соСдинСнных Ρ‡Π΅Ρ€Π΅Π· Ethernet ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ кабСль, Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°ΠΏΡƒΡ‰Π΅Π½ GNU Debugger, Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ – ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ядро.

  • ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс

Π’ соотвСтствии с ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Free Software Foundation, GNU Debugger вмСсто собствСнного графичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ внСшним IDE, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ графичСским ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартный ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ тСкстовый интСрфСйс. Для сопряТСния с внСшними ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ язык тСкстовой строки (ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ сдСлано Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… вСрсиях ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ DDD), тСкстовый язык управлСния gdb/mi, Π»ΠΈΠ±ΠΎ интСрфСйс для языка .

Π‘Ρ‹Π»ΠΈ созданы Ρ‚Π°ΠΊΠΈΠ΅ интСрфСйсы ΠΊΠ°ΠΊ DDD, cgdb, GDBtk/Insight ΠΈ Β«GUD modeΒ» Π² . Π‘ GNU Debugger ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ IDE, ΠΊΠ°ΠΊ

Для эффСктивной ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈ компиляции Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π­Ρ‚Π° отладочная информация сохраняСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅; ΠΎΠ½Π° описываСт Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ строк исходного тСкста ΠΈ адрСсами Π² выполняСмом ΠΊΠΎΠ΄Π΅.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ `-g" ΠΏΡ€ΠΈ запускС компилятора.

МногиС компиляторы Π‘ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ `-g" ΠΈ `-O" вмСстС. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΊΠΈΠ΅ компиляторы, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ выполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, содСрТащиС ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

GCC, GNU компилятор Π‘ΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ `-g" с ΠΈΠ»ΠΈ Π±Π΅Π· `-O" , дСлая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ всСгда использовали `-g" ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ, Π½ΠΎ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Ρ‡Ρƒ.

Если Π²Ρ‹ запускаСтС Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² срСдС выполнСния, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ процСссы, run создаСт ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹ΠΉ процСсс, ΠΈ этот процСсс выполняСт Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. (Π’ срСдах, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… процСссы, run выполняСт ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.)

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ зависит ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π΅Π΅ процСсса. GDB прСдоставляСт способы Π·Π°Π΄Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. (Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ послС старта, Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ измСнСния Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π° Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запускС.) Π­Ρ‚Π° информация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ: ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π—Π°Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ run . Если Π½Π° вашСй систСмС доступна ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΡ… описании Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ соглашСния (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ раскрываниС шаблонов ΠΈΠ»ΠΈ подстановка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…). Π’ систСмах Unix, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, какая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды SHELL . Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» 4.3 АргумСнты вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ . Π‘Ρ€Π΅Π΄Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° наслСдуСт свою срСду ΠΎΡ‚ GDB, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ GDB set environment ΠΈ unset environment , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ настроСк срСды, Π²Π»ΠΈΡΡŽΡ‰ΠΈΡ… Π½Π° Π½Π΅Π΅. Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» 4.4 Рабочая срСда вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ . Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π’Π°ΡˆΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° наслСдуСт свой Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΎΡ‚ GDB. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ GDB ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ cd . Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» 4.5 Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ . Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ устройства для стандартного Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ ΠΈ GDB. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π² строкС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ run , ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ tty , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ устройство для вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» 4.6 Π’Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ . ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π₯отя ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π»Ρ‹ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅; Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, скорСС всСго GDB ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Когда Π²Ρ‹ ΠΏΠΎΠ΄Π°Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ run , ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» 5. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ исполнСния , для обсуТдСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»Π°ΡΡŒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ print ΠΈΠ»ΠΈ call . Π‘ΠΌ. Ρ€Π°Π·Π΄Π΅Π» 8. ИсслСдованиС Π΄Π°Π½Π½Ρ‹Ρ… .

Если врСмя ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ вашСго символьного Ρ„Π°ΠΉΠ»Π° измСнилось с Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° GDB послСдний Ρ€Π°Π· считывал символы, ΠΎΠ½ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ свою ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ считываСт Π΅Π΅ Π·Π°Π½ΠΎΠ²ΠΎ. ΠŸΡ€ΠΈ этом GDB стараСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ваши Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ останова.

4.3 АргумСнты вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ GDB Π΄Π΅Π»Π°Π΅Ρ‚ послС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ процСсса--останавливаСт Π΅Π³ΠΎ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ присоСдинСнный процСсс всСми ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ GDB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ доступны, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ запускаСтС процСссы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ run . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова; Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ пошагово Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π΅Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ области Π΄Π°Π½Π½Ρ‹Ρ…. Если Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса послС присоСдинСния ΠΊ Π½Π΅ΠΌΡƒ GDB, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ continue . detach Когда Π²Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ присоСдинСнный процСсс, для Π΅Π³ΠΎ освобоТдСния ΠΈΠ· ΠΏΠΎΠ΄ управлСния GDB Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ detach . ΠžΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ процСсса ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ПослС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ detach , этот процСсс ΠΈ GDB снова становятся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ нСзависимыми, ΠΈ Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ run Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс. detach Π½Π΅ повторяСтся, Ссли Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ RET Π΅Ρ‰Π΅ Ρ€Π°Π· послС выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Если Π²Ρ‹ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚Π΅ ΠΈΠ· GDB ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ run , ΠΏΠΎΠΊΠ° Ρƒ вас Π΅ΡΡ‚ΡŒ присоСдинСнный процСсс, Π²Ρ‹ ΡƒΠ±ΡŒΠ΅Ρ‚Π΅ этот процСсс. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, GDB Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· этих Π²Π΅Ρ‰Π΅ΠΉ; Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π²Π°ΠΌ это ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set confirm (см. Ρ€Π°Π·Π΄Π΅Π» 15.6 ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдупрСТдСния ΠΈ сообщСния).

4.8 Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса

kill Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ GDB.

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½Π°, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΏ памяти, Π° Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ процСсс. GDB ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°ΠΌΠΏΡ‹ памяти, ΠΏΠΎΠΊΠ° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π²Π½Π΅ GDB, ΠΏΠΎΠΊΠ° Ρƒ вас Π΅ΡΡ‚ΡŒ Π² Π½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ останова, установлСнныС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ. Π’ этой ситуации Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ kill , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π½Π΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°.

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

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Аллана Πžβ€™Π”ΠΎΠ½Π½Π΅Π»Π»Π° Learning C with GDB .

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· особСнностСй Ρ‚Π°ΠΊΠΈΡ… высокоуровнСвых языков, ΠΊΠ°ΠΊ Ruby, Scheme ΠΈΠ»ΠΈ Haskell, ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ C ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Π’ ΠΏΡ€ΠΈΠ΄Π°Ρ‡Ρƒ ΠΊ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π½ΠΈΡŽ Ρ‚Π°ΠΊΠΈΡ… Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… особСнностСй C, ΠΊΠ°ΠΊ Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π²Ρ‹ Π΅Ρ‰Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π±Π΅Π· REPL . Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π’Ρ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½Π΅Ρ‚Π΅ ΠΊ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π² REPL, ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с Ρ†ΠΈΠΊΠ»ΠΎΠΌ написал-скомпилировал-запустил Π±ΡƒΠ΄Π΅Ρ‚ для Вас нСбольшим Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

НСдавно ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ, Ρ‡Ρ‚ΠΎ я ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GDB ΠΊΠ°ΠΊ псСвдо-REPL для C. Π― поэкспСримСнтировал, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ GDB ΠΊΠ°ΠΊ инструмСнт для изучСния языка, Π° Π½Π΅ просто для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΈ оказалось, Ρ‡Ρ‚ΠΎ это ΠΎΡ‡Π΅Π½ΡŒ вСсСло.

ЦСль этого поста – ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π’Π°ΠΌ, Ρ‡Ρ‚ΠΎ GDB являСтся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ инструмСнтом для изучСния Π‘. Π― познакомлю Вас с нСсколькими ΠΌΠΎΠΈΠΌΠΈ самыми Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΈΠ· GDB, ΠΈ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GDB, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· слоТных частСй языка Π‘: Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ массивами ΠΈ указатСлями.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² GDB

НачнСм с создания ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ нСбольшой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘ – minimal.c :

Int main() { int i = 1337; return 0; }
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ printf . Π’Π΅ΠΏΠ΅Ρ€ΡŒ окунСмся Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠΈΡ€ изучСния Π‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ GBD.

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Ρ„Π»Π°Π³ΠΎΠΌ -g для гСнСрирования ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ GDB, ΠΈ ΠΏΠΎΠ΄ΠΊΠΈΠ½Π΅ΠΌ Π΅ΠΌΡƒ эту ΡΠ°ΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ:

$ gcc -g minimal.c -o minimal $ gdb minimal
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ молниСносно ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС GDB. Π― ΠΎΠ±Π΅Ρ‰Π°Π» Π²Π°ΠΌ REPL, Ρ‚Π°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅:

(gdb) print 1 + 2 $1 = 3
Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ! print – это встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° GDB, которая вычисляСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π‘-Π½ΠΎΠ³ΠΎ выраТСния. Если Π’Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ какая-Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° GDB, просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ – Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ help name-of-the-command Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС GDB.

Π’ΠΎΡ‚ Π’Π°ΠΌ Π±ΠΎΠ»Π΅Π΅ интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

(gbd) print (int) 2147483648 $2 = -2147483648
Π― ΡƒΠΏΡƒΡ‰Ρƒ Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ 2147483648 == -2147483648 . Главная ΡΡƒΡ‚ΡŒ здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ коварная Π² Π‘, Π° GDB ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ Π‘.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ поставим Ρ‚ΠΎΡ‡ΠΊΡƒ останова Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΈ запустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

(gdb) break main (gdb) run
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»Π°ΡΡŒ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строчкС, ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΌ, Π³Π΄Π΅ инициализируСтся пСрСмСнная i . Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ хотя пСрСмСнная ΠΏΠΎΠΊΠ° ΠΈ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, Π½ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ сСйчас ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ print :

(gdb) print i $3 = 32767
Π’ Π‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ локальной Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, поэтому ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π’Π°ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π°, воспользовавшись ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ next :

(gdb) next (gdb) print i $4 = 1337

Π˜ΡΡΠ»Π΅Π΄ΡƒΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ X

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π‘ – это Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ памяти. ΠŸΡ€ΠΈ этом Π±Π»ΠΎΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ характСризуСтся двумя числами:

1. Числовой адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° Π² Π±Π»ΠΎΠΊΠ΅.
2. Π Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° Π² Π±Π°ΠΉΡ‚Π°Ρ…. Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Одна ΠΈΠ· ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… особСнностСй языка Π‘ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Вас Π΅ΡΡ‚ΡŒ прямой доступ ΠΊ Π±Π»ΠΎΠΊΡƒ памяти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² памяти, Π° sizeof вычисляСт Ρ€Π°Π·ΠΌΠ΅Ρ€, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ памяти.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с ΠΎΠ±Π΅ΠΈΠΌΠΈ возмоТностями Π² GDB:

(gdb) print &i $5 = (int *) 0x7fff5fbff584 (gdb) print sizeof(i) $6 = 4
Говоря Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ языком, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ пСрСмСнная i размСщаСтся ΠΏΠΎ адрСсу 0x7fff5fbff5b4 ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² памяти 4 Π±Π°ΠΉΡ‚Π°.

Π― ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Π²Ρ‹ΡˆΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² памяти зависит ΠΎΡ‚ Π΅Π΅ Ρ‚ΠΈΠΏΠ°, Π΄Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ sizeof ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ самими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…:

(gdb) print sizeof(int) $7 = 4 (gdb) print sizeof(double) $8 = 8
Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ Π½Π° ΠΌΠΎΠ΅ΠΉ машинС, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° int Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π°, Π° Ρ‚ΠΈΠΏΠ° double – восСмь Π±Π°ΠΉΡ‚.

Π’ GDB Π΅ΡΡ‚ΡŒ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для нСпосрСдствСнного исслСдования памяти – ΠΊΠΎΠΌΠ°Π½Π΄Π° x . Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° провСряСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, начиная с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ адрСса. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ряд ΠΊΠΎΠΌΠ°Π½Π΄ форматирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ количСством Π±Π°ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π’Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΈ Π½Π°Π΄ Ρ‚Π΅ΠΌ, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ Π’Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ вывСсти ΠΈΡ… Π½Π° экран. Π’ случаС ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ трудностСй, Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ help x Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС GDB.

Как Π’Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & вычисляСт адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ x Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ &i ΠΈ Ρ‚Π΅ΠΌ самым ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π·Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i :

(gdb) x/4xb &i 0x7fff5fbff584: 0x39 0x05 0x00 0x00
Π€Π»Π°Π³ΠΈ форматирования ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ (4 ) значСния, Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ (hex ) Π²ΠΈΠ΄Π΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ (b yte). Π― ΡƒΠΊΠ°Π·Π°Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π±Π°ΠΉΡ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² памяти пСрСмСнная i . Π’Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ΅ прСдставлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² памяти.

Но с ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ связана ΠΎΠ΄Π½Π° Ρ‚ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ постоянно Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ – Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Intel Π±Π°ΠΉΡ‚Ρ‹ хранятся Π² порядкС β€œΠΎΡ‚ младшСго ΠΊ ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΌΡƒ ” (справа Π½Π°Π»Π΅Π²ΠΎ), Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΉ для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° записи, Π³Π΄Π΅ младший Π±Π°ΠΉΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ (слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ).

Один ΠΈΠ· способов ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ этот вопрос – это ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i Π±ΠΎΠ»Π΅Π΅ интСрСсноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ этот участок памяти:

(gdb) set var i = 0x12345678 (gdb) x/4xb &i 0x7fff5fbff584: 0x78 0x56 0x34 0x12

Π˜ΡΡΠ»Π΅Π΄ΡƒΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ptype

Команда ptype Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΌΠΎΠΈΡ… самых Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ…. Она ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Π‘-Π³ΠΎ выраТСния:

(gdb) ptype i type = int (gdb) ptype &i type = int * (gdb) ptype main type = int (void)
Π’ΠΈΠΏΡ‹ Π² Π‘ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ слоТными , Π½ΠΎ ptype позволяСт ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ массивы

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ½ΠΊΠΈΠΌ понятиСм Π² Π‘. Π‘ΡƒΡ‚ΡŒ этого ΠΏΡƒΠ½ΠΊΡ‚Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³ΠΎΠ½ΡΡ‚ΡŒ Π΅Π΅ Ρ‡Π΅Ρ€Π΅Π· GDB, ΠΏΠΎΠΊΠ° массивы Π½Π΅ ΠΎΠ±Ρ€Π΅Ρ‚ΡƒΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ смысл.

Π˜Ρ‚Π°ΠΊ, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с массивом array.c :

Int main() { int a = {1, 2, 3}; return 0; }
Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π΅ с Ρ„Π»Π°Π³ΠΎΠΌ -g , запуститС Π² GDB, ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒ next ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² строку ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

$ gcc -g arrays.c -o arrays $ gdb arrays (gdb) break main (gdb) run (gdb) next
На этом этапС Π’Ρ‹ смоТСтС вывСсти содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Π΅Π΅ Ρ‚ΠΈΠΏ:

(gdb) print a $1 = {1, 2, 3} (gdb) ptype a type = int
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ настроСна Π² GDB, ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ стоит ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ – это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ x для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ выглядит пСрСмСнная a β€œΠΏΠΎΠ΄ капотом”:

(gdb) x/12xb &a 0x7fff5fbff56c: 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x7fff5fbff574: 0x03 0x00 0x00 0x00
Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ участок памяти для массива a начинаСтся ΠΏΠΎ адрСсу 0x7fff5fbff56c . ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π° содСрТат a , ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ – a , ΠΈ послСдниС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ хранят a . Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈ убСдится, Ρ‡Ρ‚ΠΎ sizeof Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ a Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² памяти Ρ€ΠΎΠ²Π½ΠΎ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚:

(gdb) print sizeof(a) $2 = 12
Π”ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° массивы выглядят Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ. Π£ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ массивам Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΎΠ½ΠΈ хранят всС значСния Π² смСТных участках памяти. Однако, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ситуациях, массивы Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΎΡ‡Π΅Π½ΡŒ схоТС с указатСлями! К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ a :

(gdb) print a + 1 $3 = (int *) 0x7fff5fbff570
ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ словами, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ a + 1 – это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° int , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ адрСс 0x7fff5fbff570 . К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΆΠ΅ Ρ€Π΅Ρ„Π»Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ x , ΠΈΡ‚Π°ΠΊ посмотрим, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

(gdb) x/4xb a + 1 0x7fff5fbff570: 0x02 0x00 0x00 0x00

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ адрСс 0x7fff5fbff570 Ρ€ΠΎΠ²Π½ΠΎ Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ большС, Ρ‡Π΅ΠΌ 0x7fff5fbff56c , Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° массива a . Учитывая, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ int Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² памяти Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ a + 1 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° a .

На самом Π΄Π΅Π»Π΅, индСксация массивов Π² Π‘ являСтся синтаксичСским сахаром для Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ: a[i] эквивалСнтно *(a + i) . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это Π² GDB:

(gdb) print a $4 = 1 (gdb) print *(a + 0) $5 = 1 (gdb) print a $6 = 2 (gdb) print *(a + 1) $7 = 2 (gdb) print a $8 = 3 (gdb) print *(a + 2) $9 = 3
Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях a Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ массив, Π° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… – ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт. Π§Ρ‚ΠΎ ΠΆΠ΅ происходит?

ΠžΡ‚Π²Π΅Ρ‚ состоит Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° имя массива ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π² Π‘, Ρ‚ΠΎ ΠΎΠ½ΠΎ β€œΡ€Π°ΡΠΏΠ°Π΄Π°Π΅Ρ‚ΡΡ (decay)” Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт. Π•ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· этого ΠΏΡ€Π°Π²ΠΈΠ»Π°: ΠΊΠΎΠ³Π΄Π° имя массива пСрСдаСтся Π² sizeof ΠΈ ΠΊΠΎΠ³Π΄Π° имя массива ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ взятия адрСса & .

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ имя a Π½Π΅ распадаСтся Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° & , ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ интСрСсный вопрос: Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ распадаСтся a ΠΈ &a ?

ЧислСнно ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс:

(gdb) x/4xb a 0x7fff5fbff56c: 0x01 0x00 0x00 0x00 (gdb) x/4xb &a 0x7fff5fbff56c: 0x01 0x00 0x00 0x00
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‚ΠΈΠΏΡ‹ ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹. Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, имя массива распадаСтся Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ int * . Π§Ρ‚ΠΎ ΠΆΠ΅ касаСтся Ρ‚ΠΈΠΏΠ° &a , Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΠ± этом GDB:

(gdb) ptype &a type = int (*)
Говоря ΠΏΡ€ΠΎΡ‰Π΅, &a – это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл: a Π½Π΅ распадаСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ & ΠΈ a ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int .

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ распадаСтся a ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ &a Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ:

(gdb) print a + 1 $10 = (int *) 0x7fff5fbff570 (gdb) print &a + 1 $11 = (int (*)) 0x7fff5fbff578
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ 1 ΠΊ a ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ адрСс Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ 1 ΠΊ &a добавляСт ΠΊ адрСсу Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ распадаСтся a ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ &a :

(gdb) print &a $11 = (int *) 0x7fff5fbff56c

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

НадСюсь, я ΡƒΠ±Π΅Π΄ΠΈΠ» Вас, Ρ‡Ρ‚ΠΎ GDB – это изящная ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ срСда для изучСния Π‘. Она позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ print , ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ x ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ptype .

1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ GDB для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ The Ksplice Pointer Challenge .
2. Π Π°Π·Π±Π΅Ρ€ΠΈΡ‚Π΅ΡΡŒ, ΠΊΠ°ΠΊ структуры хранятся Π² памяти. Как ΠΎΠ½ΠΈ соотносятся с массивами?
3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ дизассСмблСрныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ GDB, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° ассСмблСрС. ОсобСнно вСсСло ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ стСк Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
4. Π—Π°Ρ†Π΅Π½ΠΈΡ‚Π΅ β€œTUI” Ρ€Π΅ΠΆΠΈΠΌ GDB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ncurses надстройку Π½Π°Π΄ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌ GDB. На OS X, Π’Π°ΠΌ вСроятно придСтся ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ GDB ΠΈΠ· исходников.

ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ для указания ошибок Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Π›Π‘. Π‘ΡƒΠ΄Ρƒ Ρ€Π°Π΄ конструктивной ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ΅.

БСгодня Ρ‚Ρ‹ сдСлаСшь Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ шаг Π² Π΄Π΅Π»Π΅
изучСния Linux систСм. Π― расскаТу ΠΎΠ± основных
ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ… ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с gdb. ОвладСв ΠΈΠΌΠΈ Ρ‚Ρ‹ смоТСшь ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ любая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΏΠΈΡΠ°Ρ‚ΡŒ свои эксплоиты.

Π’Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, всС ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΏΡ€ΠΎ Ρ‚Π°ΠΊΡƒΡŽ Π²Π΅Ρ‰ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, gdb – это ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ. GDB – GNU
Debugger. Π­Ρ‚ΠΎ Π½Π΅ΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ SoftICE для Windows (для Ρ‚Π΅Ρ… ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ – самый популярный ΠΈ, Π½Π° ΠΌΠΎΠΉ взгляд, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ), Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄
Linux систСмы. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² сСти Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ этой Π²Π΅Ρ‰ΠΈ ΠΈ Π² своС врСмя я Π΅Π³ΠΎ осваивал сам. Π˜Ρ‚Π°ΠΊ,
Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ Π±ΡƒΠ΄ΡƒΡ‚ описаны Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ gdb. ВсС это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. А Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° я Ρ€Π΅ΡˆΠΈΠ» Π²Π·ΡΡ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρƒ yes. Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ – это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ символ β€˜y’ Π΄ΠΎ бСсконСчности, для Π½Π°Ρ‡Π°Π»Π° я Ρ€Π΅ΡˆΠΈΠ» Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ этот символ, Π° строку β€˜XAKEP’, Ρ…ΠΎΡ‚ΡŒ вСсСлСС Π±ΡƒΠ΄Π΅Ρ‚.

Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всС ΠΏΠΎ порядку. Π‘Π°ΠΌ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ запускаСтся Ρ‚Π°ΠΊ:

Но ΠΌΠΎΠΆΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρƒ нас это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΊ исслСдуСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅:

# gdb /usr/bin/yes

МоТно ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ core Ρ„Π°ΠΉΠ»Ρ‹, для этого Π½ΡƒΠΆΠ½ΠΎ ввСсти слСдуСт ввСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

# gdb /usr/bin/yes core

Π•Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ понадобится ΠΊΠΎΠΌΠ°Π½Π΄Π° для просмотра содСрТимого рСгистров:

(gdb) info registers

Π»ΠΈΠ±ΠΎ Ρ‚Π°ΠΊ (сокращСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚
Ρ‚ΠΎΡ‡ΠΊΠΈ останова, Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ наблюдСния. Π‘ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ я Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… останова. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π°:

(gdb) break function - ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ…ΠΎΠ΄ΠΎΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
(gdb) break *adress - ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ инструкции ΠΏΠΎ адрСсу.

ПослС установок ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС Ρ‚ΠΎΡ‡ΠΊΠΈ для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

(gdb) info break

А ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ эти Ρ‚ΠΎΡ‡ΠΊΠΈ:

(gdb) clear breakpoint - Π³Π΄Π΅ break это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ останова
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, функция ΠΈΠ»ΠΈ адрСс)

ΠžΡ‡Π΅Π½ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π²Π΅Ρ‰ΡŒΡŽ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ автоматичСского отобраТСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Для этого сущСствуСт ΠΊΠΎΠΌΠ°Π½Π΄Π° display:

(gdb) display/format value , Π³Π΄Π΅ format – это Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ отобраТСния, Π° value – само Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π²Π΅Π΄Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

(gdb) info display - Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ„Ρƒ ΠΎΠ± отобраТСниях
(gdb) delete num - Π³Π΄Π΅ num – ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнты с индСксом
num

Π­Ρ‚ΠΎ Π±Ρ‹Π» нСбольшой справочник ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ идСю.
Π”Π°Π»Π΅Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это ΠΈ Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. И ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ – здСсь я Π΄Π°Π» лишь ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ всСх возмоТностСй gdb, Π½Π° самом Π΄Π΅Π»Π΅ Ρƒ Π½Π΅Π³ΠΎ ΠΈΡ… Π² сотни Ρ€Π°Π· большС, поэтому Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈ ΡƒΡ‡ΠΈΡ‚Π΅.
Как я ΠΈ ΠΎΠ±Π΅Ρ‰Π°Π», Π±Π΅Ρ€Π΅ΠΌ Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρƒ yes. ΠŸΡƒΡ‚ΡŒ Π½Π° вашСй машинС ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΌΠΎΠΈΠΌ, всС зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ, Ссли Ρ‡Ρ‚ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ поиском (ΠΊΠΎΠΌΠ°Π½Π΄Π°
find).

# gdb /usr/bin/yes

ПослС запуска ΠΎΠ½ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ привСтствСнноС сообщСниС.

GNU gdb 19991004




There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(no debugging symbols found)...

Π’Π°ΠΊ ΠΊΠ°ΠΊ yes Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ бСсконСчноС число символов, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π±Ρ‹ ΠΈΡ… Π½Π°ΠΌ Π½Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅, Π° Π²Ρ‹Π²ΠΎΠ΄
ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ консоль. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ who is i ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ имя консоли. Π”ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ
Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ просто привязываСм ΠΊ Π½Π΅ΠΉ.

(gdb) tty /dev/pts/1

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ставим Ρ‚ΠΎΡ‡ΠΊΡƒ останова Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ puts(), Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ понятнСй Π²ΠΎΡ‚ Π²Π°ΠΌ man-справка ΠΎΠ± Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΊΠΎΠΌΠ°Π½Π΄Π° man
puts)

#include
int puts(const char *s);
puts() writes the string s and a trailing newline to stdΒ­
out.

Как Π²ΠΈΠ΄Π½ΠΎ, функция посылаСм строку s Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ΠΎΡ‚ ΠΎΠ½Π° Ρ‚ΠΎ Π½Π°ΠΌ ΠΈ Π½ΡƒΠΆΠ½Π°. На Π½Π΅ΠΉ Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ° ΠΈ остановимся.

(gdb) break puts
Breakpoint 1 at 0x8048698

И запускаСм саму ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠΊΠ° gdb Π½Π΅ остановит Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

(gdb) r
Starting program: /usr/bin/yes
Breakpoint 1 at 0x4006d585: file ioputs.c, line 32.

Breakpoint 1, 0x4006d585 in _IO_puts (str=0x8048e59 "y") at ioputs.c:32
32 ioputs.c: No such file or directory.
1: x/i $eip 0x4006d585 <_IO_puts+21>: mov 0x8(%ebp),%esi

О, Π²ΠΎΡ‚ ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Ρ‡ΡƒΠ΄ΠΎ, сработал breakpoint. Π§Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ – Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΌΡ‹ Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΡ‡Π½Π΅Π΅ адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ Π»Π΅ΠΆΠΈΡ‚. Π§Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ
ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ этому адрСсу. ΠŸΡ€ΠΈ этом ΠΌΡ‹ Π·Π°Ρ‚Ρ€Π΅ΠΌ Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Ρƒ символов своими.

(gdb) set {char}0x8048e59="X"
(gdb) set {char}0x8048e5a="A"
(gdb) set {char}0x8048e5b="K"
(gdb) set {char}0x8048e5c="E"
(gdb) set {char}0x8048e5d="P"

Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° нашС Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎ Ρ‚Π°ΠΌ Π»Π΅ΠΆΠΈΡ‚ Π² памяти:

(gdb) x/3sw 0x8048e59
0x8048e59 <_IO_stdin_used+437>: "XAKEP\004\b"
0x8048e61 <_IO_stdin_used+445>: ""
0x8048e62 <_IO_stdin_used+446>: ""

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠ΄Π°Π»ΠΈΠΌ наш брякпоинт:

(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x4006d585 in _IO_puts at ioputs.c:32
breakpoint already hit 1 time
(gdb) clear puts
Deleted breakpoint 1

И ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ насладится Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ:

Π’ΠΎΡ‚ ΠΈ всС. Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ.

(gdb) q
The program is running. Exit anyway? (y or n) y

На этом ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° заканчиваСтся, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΡƒΡ‡Π°ΠΉΡ‚Π΅ сами ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π² этой ΠΆΠΈΠ·Π½ΠΈ – это УЧЕНЬЕ.
Π’ΠΎΡ‚ Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ процСссу:

// launch gdb
hack@exploit:~ > gdb
GNU gdb 4.18
Copyright 1998 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 "i386-suse-linux".
(gdb) attach "pid"
(gdb) attach 1127 // example

Поиск Π² памяти:

(gdb) x/d or x "address" show decimal
(gdb) x/100s "address" show next 100 decimals
(gdb) x 0x0804846c show decimal at 0x0804846c
(gdb) x/s "address" show strings at address
(gdb) x/105 0x0804846c show 105 strings at 0x0804846c
(gdb) x/x "address" show hexadecimal address
(gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c
(gdb) x/b 0x0804846c show byte at 0x0804846c
(gdb) x/10b 0x0804846c-10 show byte at 0x0804846c-10
(gdb) x/10b 0x0804846c+20 show byte at 0x0804846c+20
(gdb) x/20i 0x0804846c show 20 assembler instructions at address

Бписок всСх сСкций Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅:

(gdb) maintenance info sections // or
(gdb) mai i s

Executable file:
`/home/hack/homepage/challenge/buf/basic", file type
elf32-i386.
0x080480f4->0x08048107 at 0x000000f4: .interp ALLOC

0x08048108->0x08048128 at 0x00000108: .note.ABI-tag
ALLOC LOAD READONLY DATA HAS_CONTENTS
0x08048128->0x08048158 at 0x00000128: .hash ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048158->0x080481c8 at 0x00000158: .dynsym ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x080481c8->0x08048242 at 0x000001c8: .dynstr ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048242->0x08048250 at 0x00000242: .gnu.version
ALLOC LOAD READONLY DATA
HAS_CONTENTS

Бряк Π½Π° адрСс:

(gdb) disassemble main
Dump of assembler code for function main:
0x8048400

: push %ebp
0x8048401 : mov %esp,%ebp
0x8048403 : sub $0x408,%esp
0x8048409 : add $0xfffffff8,%esp
0x804840c : mov 0xc(%ebp),%eax
0x804840f : add $0x4,%eax
0x8048412 : mov (%eax),%edx
0x8048414 : push %edx
0x8048415 : lea 0xfffffc00(%ebp),%eax
...

(gdb) break *0x8048414 // example
Breakpoint 1 at 0x8048414
(gdb) break main // example
Breakpoint 2 at 0x8048409
(gdb)