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

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

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

ΠœΡ‹ нашли, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°

dbug
являСтся ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ внСшним ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ GDB; ΠΎΠ½Π° обСспСчиваСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ способ примСнСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊ ΠΊΠΎΠ΄Ρƒ Π‘. Она Ρ‚Π°ΠΊΠΆΠ΅ довольно элСгантно сочСтаСт ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π°Π½Π΅Π΅ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΎΡ‡Π΅Ρ€Ρ‚ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. ОсобСнно ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ динамичСской трассировки Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ ΠΎΠ½Π° Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ свою Π±Π΅ΡΡ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² качСствС ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ссли Π²Ρ‹ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π½Π΅ΠΉ.

15.5.2. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ выдСлСния памяти

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠ°ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, для любого ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠ³ΠΎ практичСского прилоТСния СдинствСнной слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ программиста Π½Π° Π‘ являСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (посрСдством

malloc()
,
realloc()
ΠΈ
free()
).

Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ большим количСством инструмСнтов, доступных для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ динамичСской памяти. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. НапримСр:

β€’Β ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая выдСляСтся, Π° Π·Π°Ρ‚Π΅ΠΌ становится нСдоступной.

β€’Β ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ освобоТдаСмой памяти: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая выдСляСтся, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ освобоТдаСтся. НС освобоТдаСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ всСгда являСтся ошибкой, Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… случаСв Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ всС Π² порядкС.

β€’Β ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… освобоТдСний: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая освобоТдаСтся Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

free()
ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
malloc()
.

β€’Β ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ использования ΡƒΠΆΠ΅ освобоТдСнной памяти: ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая освобоТдСна, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· висячий ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

β€’Β ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΈΠ»ΠΈ сохранСниС Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹.

β€’Β ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ± использовании Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ памяти. (МногиС компиляторы ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ прСдупрСТдСния.)

‒ ДинамичСская трассировка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: ΠΊΠΎΠ³Π΄Π° появляСтся ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ доступ ΠΊ памяти, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ трассировку ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°.

β€’Β Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ инструмСнтами посрСдством использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния.

β€’Β Π€Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² для Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΠΏΠΎΠ·ΠΆΠ΅ для создания ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ².

НСкоторыС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ просто Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ эти события. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‚ ΠΆΡƒΡ‚ΠΊΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ прилоТСния (посрСдством

SIGSEGV
), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° ΠΊΠΎΠ΄-Π½Π°Ρ€ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ спроСктированы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ вмСстС с GDB.

НСкоторыС инструмСнты Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ измСнСния исходного ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ использованиС особого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…

#define
ΠΈ статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ посрСдством использования ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΎΠ±Ρ‰Π΅Π³ΠΎ пользования Linux/Unix для ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΉ установки сСбя Π² качСствС замСститСля стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… вСрсий
malloc()
ΠΈ
free()
.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Ρ‚Ρ€ΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° динамичСской памяти, Π° Π·Π°Ρ‚Π΅ΠΌ прСдоставим ссылки Π½Π° нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ….

15.5.2.1. GNU/Linux

mtrace

БистСмы GNU/Linux, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ GLIBC, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ трассировки памяти Π²ΠΎ врСмя исполнСния.

#include <mcheck.h> /* GLIBC */

void mtrace(void);

void muntrace(void);

Когда вызываСтся

mtrace()
, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° провСряСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния
MALLOC_TRACE
. ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° записываСмый Ρ„Π°ΠΉΠ» (ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚). Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ свСдСния ΠΎ выдСлСниях ΠΈ освобоТдСниях памяти (Если Ρ„Π°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚, запись Π½Π΅ производится. Π€Π°ΠΉΠ» урСзаСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.) Когда вызываСтся
muntrace()
, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ большС Π½Π΅ рСгистрируСт выдСлСния ΠΈ освобоТдСния.

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

Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ

mtrace
для Π°Π½Π°Π»ΠΈΠ·Π° Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π°. (Π€Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ASCII, Π½ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСпосрСдствСнно.) НапримСр,
gawk
Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ трассировку, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°
TIDYMEM
:

$ <b>export TIDYMEM=1 MALLOC_TRACE=trace.out</b> /* Π­ΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния */

$ <b>./gawk 'BEGIN { print &quot;hello, world&quot; }'</b> /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

hello, world

$ <b>mtrace ./gawk mtrace.out</b> /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚ */

Memory not freed:

-----------------

Address Size Caller

0x08085858 0x20Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/main.c:1102

0x08085880 0xc80 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:398

0x08086508 0x2Β Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337

0x08086518 0x6Β Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337

0x08086528 0x10Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/eval.c:2082

0x08086550 0x3   at /home/arnold/Gnu/gawk/gawk-3.1.3/node.с:337

0x08086560 0x3Β  Β at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337

0x080865e0 0x4Β Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/field.c:76

0x08086670 0x78Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1369

0x08086700 0xeΒ Β  at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337

0x08086718 0x1fΒ  at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1259

Π’Ρ‹Π²ΠΎΠ΄ прСдставляСт собой список мСст, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…

gawk
выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π² дальнСйшСм Π½Π΅ освобоТдаСтся. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ постоянноС подвСшиваниС ΠΊ динамичСской памяти являСтся Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ссли это сдСлано Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ. ВсС ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ здСсь случаи ΡΠ²Π»ΡΡŽΡ‚ΡΡ выдСлСниями Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π°.

15.5.2.2. Electric Fence

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.1 «АдрСсноС пространство Linux/UnixΒ» ΠΌΡ‹ описали, ΠΊΠ°ΠΊ динамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ выдСляСтся ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ расти ΠΈ ΡΠΎΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

brk()
ΠΈΠ»ΠΈ
sbrk()
, описанных Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.2.3 «БистСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹:
brk()
ΠΈ
sbrk()
Β»).

Ну, ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ‚Π°ΠΌ прСдставили, являСтся ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π‘ΠΎΠ»Π΅Π΅ Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ (Π½Π΅ рассматриваСмыС Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² адрСсноС пространство процСсса Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ смСТныС сСгмСнты памяти. МногиС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ

malloc()
Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с использованиСм этих систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² для добавлСния Π½ΠΎΠ²Ρ‹Ρ… областСй адрСсного пространства ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ этой схСмы являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ опСрационная систСма ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ обСспСчСниС Π·Π°Ρ‰ΠΈΡ‚Ρ‹ памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ для обСспСчСния Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ доступа ΠΊ памяти Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ этих ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сСгмСнтов, гСнСрируя сигнал
SIGSEGV
. Π­Ρ‚Π° схСма ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рис. 15.1.