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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 221

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

Β recurse();

}

Π’ΠΎΡ‚ нСбольшой сСанс GDB с этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ:

$ <b>gcc -g ch15-abort.c -o ch15-abort</b> /* ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· -O */

$ <b>ch15-abort</b> /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

Aborted (core dumped) /* Она ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ */

$ <b>gdb ch15-abort core.4124</b> /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ для Π½Π΅Π΅ GDB */

GNU gdb 5.3

Copyright 2002 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;i686-pc-linux-gnu&quot;...

Core was generated by 'ch15-abort'.

Program terminated with signal 6, Aborted.

Reading symbols from /lib/i686/libc.so.6...done.

Loaded symbols for /lib/i686/libc.so.6

Reading symbols from /lib/ld-linux.so.2...done.

Loaded symbols for /lib/ld-linux.so.2

#0 0x42028ccl in kill() from /lib/i686/libc.so.6

(gdb) <b>where</b> /* ВывСсти трассировку стСка */

#0 0x42028cc1 in kill() from /lib/i686/libc.so.6

#1 0x42028ac8 in raise() from /lib/i686/libc.so.6

#2 0x4202a019 in abort() from /lib/1686/libc.so.6

#3 0x08048342 in recurse() at ch15-abort.c:13

Β /* &lt;-- Нам Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ здСсь */

#4 0x08048347 in recurse() at ch15-abort.с:15

#5 0x08048347 in recurse() at ch15-abort.c:15

#6 0x0804835f in main (argc=1, argv=0xbffff8f4) at ch15-abort.c:20

#7 0x420158d4 in __libc_start_main() from /lib/i686/libc.so.6

Команда

where
Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ трассировку стСка, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ список всСх Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, начиная с самых Π½Π΅Π΄Π°Π²Π½ΠΈΡ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ имССтся Ρ‚Ρ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
recurse()
. Команда
bt
, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π°Ρ 'back trace' (обратная трассировка), являСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ для
where
; Π΅Π΅ Π»Π΅Π³Ρ‡Π΅ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ.

Π’Ρ‹Π·ΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² стСкС называСтся Ρ„Ρ€Π΅ΠΉΠΌΠΎΠΌ. Π­Ρ‚ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΏΡ€ΠΈΡˆΠ΅Π» ΠΈΠ· области компиляторов, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ адрСса Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, сгруппированныС Π² стСкС, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠΌ стСка. Команда

frame
GDB Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ„Ρ€Π΅ΠΉΠΌ 3. Π­Ρ‚ΠΎ послСдний Π²Ρ‹Π·ΠΎΠ²
recurse()
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π»
abort()
:

(gdb) <b>frame 3</b> /* ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² Ρ„Ρ€Π΅ΠΉΠΌ 3 */

#3 0x08048342 in recurse() at ch15-abort.с:13

13 abort(); /* GDB Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² Ρ„Ρ€Π΅ΠΉΠΌΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² исходном ΠΊΠΎΠ΄Π΅ */

(gdb) <b>list</b> /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько строк исходного ΠΊΠΎΠ΄Π° */

8 Β void recurse(void)

9Β  {

10Β  static int i;

11

12Β  if (++i == 3)

13Β Β  abort();

14Β  else

15Β Β  recurse();

16 }

17

(gdb) /* НаТатиС ENTER повторяСт послСднюю ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ */

18 int main(int argc, char **argv)

19 {

20Β  recurse();

21 }

(gdb) <b>quit</b> /* Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° (ΠΏΠΎΠΊΠ°) */

Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ENTER повторяСт послСднюю ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС

list
, для отобраТСния строк исходного ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ простой способ прохоТдСния исходного ΠΊΠΎΠ΄Π°.

Для рСдактирования ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки GDB ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ

readline
, поэтому для повторСния ΠΈ рСдактирования Ρ€Π°Π½Π΅Π΅ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Emacs ΠΈΠ»ΠΈ
vi
. ΠžΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Bash ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, поэтому Ссли Π²Π°ΠΌ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΠΊΠΎΠΌΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π² ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, GDB Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.

15.3.2. Установка ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ, пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ отслСТиваСмыС Ρ‚ΠΎΡ‡ΠΊΠΈ

Часто ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ создаСтся Π΄Π°ΠΌΠΏ ядра. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом являСтся использованиС GDB с Ρ„Π°ΠΉΠ»ΠΎΠΌ core для опрСдСлСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π΅ Π±Ρ‹Π» ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ (Ρ‚.Π΅. Π±Π΅Π·

-g
), всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ GDB, это имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ большС Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° всС Π΅Ρ‰Π΅ содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ², Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° (breakpoint) являСтся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ исполнСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒΡΡ, ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎΠΌΠ΅Ρ€Ρƒ строки исходного Ρ„Π°ΠΉΠ»Π°, Ρ„Π°ΠΉΠ»Ρƒ исходного Ρ„Π°ΠΉΠ»Π° совмСстно с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами.

ПослС установки ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запускаСтся с использованиСм ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

run
, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. (GDB ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π·Π° вас Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹; Ссли Π½ΡƒΠΆΠ½ΠΎ снова Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Π½Π°Ρ‡Π°Π»Π°, всС Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ β€” это Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ лишь саму ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
run
, ΠΈ GDB запустит Π½ΠΎΠ²ΡƒΡŽ копию с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½Π΅Π΅). Π’ΠΎΡ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ сСанс с использованиСм
gawk
:

$ <b>gdb gawk</b> /* Запуск GDB для gawk */