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

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

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

Если Π²Ρ‹ Π·Π°Π±Ρ‹Π»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², для сообщСния GDB ΠΈΠΌΠ΅Π½ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 'file исполняСмый-Ρ„Π°ΠΉΠ»', Π° для ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° Π΄Π°ΠΌΠΏΠ° β€” 'core-file имя-Ρ„Π°ΠΉΠ»Π°-Π΄Π°ΠΌΠΏΠ°'.

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π΄Π°ΠΌΠΏΠ° ядра GDB ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ мСсто Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ch15-abort.c, Π΄Π΅Π»Π°Π΅Ρ‚ нСсколько Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ посрСдством abort(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ ядра:

/* ch15-abort.c --- создаСт Π΄Π°ΠΌΠΏ ядра */

#include <stdio.h>

#include <stdlib.h>


/* recurse --- созданиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ */

void recurse(void)

{

 static int i;

 if (++i == 3)

  abort();

 else

  recurse();

}


int main(int argc, char **argv)

{

 recurse();

}

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

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

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

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

$ gdb ch15-abort core.4124 /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ для Π½Π΅Π΅ 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 "show copying" to see the conditions.

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

This GDB was configured as "i686-pc-linux-gnu"...

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) where /* ВывСсти трассировку стСка */

#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

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

#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) frame 3 /* ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² Ρ„Ρ€Π΅ΠΉΠΌ 3 */

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

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

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

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) quit /* Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° (ΠΏΠΎΠΊΠ°) */

Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ENTER повторяСт послСднюю ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС list, для отобраТСния строк исходного ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ простой способ прохоТдСния исходного ΠΊΠΎΠ΄Π°.

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

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

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

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

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

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

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

GNU gdb 5.3

...

(gdb) break do_print /* ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π² do_print */

Breakpoint 1 at 0x805a36a: file builtin.c, line 1504.

(gdb) run 'BEGIN { print "hello, world" }' /* Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

Starting program: /home/arnold/Gnu/gawk/gawk-3.1.3/gawk 'BEGIN { print "hello, world" }'

Breakpoint 1, do_print (tree=0x8095290) at builtin.c:1504

1504 struct redirect *rp = NULL; /* ИсполнСниС достигаСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ */

(gdb) list /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ */

1499

1500 void

1501 do_print(register NODE *tree)

1502 {

1503  register NODE **t;

1504  struct redirect *rp = NULL;

1505  register FILE *fp;

1506  int numnodes, i;

1507  NODE *save;

1508  NODE *tval;

По достиТСнии ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² пошаговом Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ GDB Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ лишь ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ исходного ΠΊΠΎΠ΄Π° Π·Π° Ρ€Π°Π·. GDB Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ строку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ собираСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° next:

(gdb) next /* Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (строка 1504 Π²Ρ‹ΡˆΠ΅) */

1510 fp = redirect_to_fp(tree->rnode, &rp); /* GDB Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ */

(gdb) /* НаТмитС ENTER для Π΅Π³ΠΎ выполнСния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ */

1511 if (fp == NULL)

(gdb) /* снова ENTER */

1519 save = tree = tree->lnode; (gdb) /* И снова */

1520 for (numnodes = 0; tree != NULL; tree = tree->rnode)

Команда step являСтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ для пошагового исполнСния. ΠœΠ΅ΠΆΠ΄Ρƒ next ΠΈ step Π΅ΡΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅, next выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€. Если этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ содСрТит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, эта функция вызываСтся ΠΈ возвращаСтся Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ GDB Π²Π΅Ρ€Π½Π΅Ρ‚ сСбС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ с содСрТащим Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ step, GDB Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, позволяя Π²Π°ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ пошаговоС исполнСниС (ΠΈΠ»ΠΈ трассировку) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ содСрТит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, step Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° next.

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. Π›Π΅Π³ΠΊΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ, какая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Ρ‹Π»Π° использована, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ ENTER для выполнСния ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ step, Π²Ρ‹ случайно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΠΉΡ‚ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ strlen() ΠΈΠ»ΠΈ printf(), с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ finish, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ исполнСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ВывСсти содСрТимоС памяти ΠΌΠΎΠΆΠ½ΠΎ с использованиСм ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ print. GDB распознаСт синтаксис Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π‘, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ СстСствСнным ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ структур, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ:

(gdb) print *save /* ВывСсти структуру, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ save */

$1 = {sub = {nodep = {l = {lptr = 0x8095250, param_name = 0x8095250 "pR\t\b",

 l1 = 134828624}, r = {rptr = 0x0, pptr = 0, preg = 0x0,

 hd = 0x0, av = 0x0, r_ent =0}, x = {extra = 0x0, x1 = 0,

 param_list = 0x0},

 name = 0x0, number = 1, reflags = 0}, val = {