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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 64

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

А.2.1. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для тСстирования динамичСской памяти

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° malloc-use, привСдСнная Π² листингС А.2, позволяСт Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ выдСлСния, освобоТдСния ΠΈ обращСния ΠΊ памяти. ЕдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π·Π°Π΄Π°Π΅Ρ‚ максимальноС число выдСляСмых Π±ΡƒΡ„Π΅Ρ€ΠΎΠ². НапримСр, ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ malloc-use 12 Π±ΡƒΠ΄Π΅Ρ‚ создан массив А ΠΈΠ· Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΠΈ пустых ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄.

β–  Π•сли ввСсти a i b, для элСмСнта массива А[i] Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ b Π±Π°ΠΉΡ‚ΠΎΠ². ИндСкс i Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ числом, мСньшим, Ρ‡Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Число Π±Π°ΠΉΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

β–  Π•сли ввСсти d i, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ Π±ΡƒΡ„Π΅Ρ€ A[i].

β–  Π•сли ввСсти r i p, ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° A[i] Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ p-ΠΉ символ (A[i][p]). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ p Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌ.

β–  Π•сли ввСсти w i p, Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ p Π±ΡƒΡ„Π΅Ρ€Π° A[i] Π±ΡƒΠ΄Π΅Ρ‚ записан символ.

β–  Π”ля Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ q.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ привСсти исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, опишСм, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΉ.

А.2.2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc()

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ выдСлСния ΠΈ освобоТдСния памяти, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² GNU-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка Π‘, способны ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ записи Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹. Если Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды MALLOC_CHECK_ Ρ€Π°Π²Π½ΠΎΠΉ 2, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° malloc-use Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² случаС выявлСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ошибки. ПодобноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ повСдСния Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пСрСкомпиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ символ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ массива;

% export MALLOC_CHECK_=2

% ./malloc-use 12

Please enter a command: a 0 10

Please enter a command: w 0 -1

Please enter a command: d 0

Aborted (core dumped)

Команда export Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc(), Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2 заставило ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ сразу послС обнаруТСния ошибки.

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

А.2.3. Поиск потСрянных Π±Π»ΠΎΠΊΠΎΠ² памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ mtrace

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° mtrace позволяСт Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ: нСсоотвСтствиС числа ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выдСлСния ΠΈ освобоТдСния памяти. Алгоритм примСнСния ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠ².

1. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ„Π°ΠΉΠ» <mcheck.h> ΠΈ размСститС Π² самом Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mtrace(). Π­Ρ‚Π° функция Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ трассировку ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выдСлСния ΠΈ освобоТдСния памяти.

2. Π—Π°Π΄Π°ΠΉΡ‚Π΅ имя Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ трассировочная информация. Π­Ρ‚ΠΎ дСлаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

% export MALLOC_TRACE=memory.log

3. Π—апуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ выдСлСния ΠΈ освобоТдСния памяти Π±ΡƒΠ΄ΡƒΡ‚ зарСгистрированы Π² ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

4. Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ mtrace, которая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚, совпадаСт Π»ΠΈ число Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² памяти с числом освобоТдСнных Π±Π»ΠΎΠΊΠΎΠ².

% mtrace my_program $MALLOC_TRACE

БообщСния, Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ mtrace, достаточно понятны. НапримСр, Π² случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ malloc-use Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° такая информация:

- 0000000000 Free 3 was never alloc'd malloc-use.с:39


Memory not freed:

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

Address    Size    Caller

0x08049d48  0xc at malloc-use.с:30

Π­Ρ‚ΠΈ сообщСния говорят ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² строкС 39 Ρ„Π°ΠΉΠ»Π° malloc-use.c дСлаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°, Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная Π² строкС 30, Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π±Ρ‹Π»Π° освобоТдСна.

Ѐункция malloc() заставляСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ выдСлСния ΠΈ освобоТдСния памяти Π² Ρ„Π°ΠΉΠ»Π΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды MALLOC_TRACE. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ записаны Π² Ρ„Π°ΠΉΠ», ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° mtrace Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ этот Ρ„Π°ΠΉΠ» ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π½Π΅ΠΌ Π½Π΅ΠΏΠ°Ρ€Π½Ρ‹Π΅ записи.

А.2.4. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ccmalloc

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ccmalloc Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc() ΠΈ free() ΠΊΠΎΠ΄ΠΎΠΌ трассировки. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, создаСтся ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ потСрянных Π±Π»ΠΎΠΊΠ°Ρ… памяти ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ccmalloc написал Армин Π‘ΠΈΡ€ (Armin Biere).

Код Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ трСбуСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ½ΡΡ‚Π°Π»Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Дистрибутив ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://www.inf.ethz.ch/personal/biere/projects/ccmalloc. РаспакуйтС дистрибутив ΠΈ запуститС сцСнарий configure. Π”Π°Π»Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make ΠΈ make install, скопируйтС Ρ„Π°ΠΉΠ» ccmalloc.cfg Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ провСряСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠΉΡ‚Π΅ копию Π² .ccmalloc.

К ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ccmalloc ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ динамичСской ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это дСлаСтся:

% gcc -g -Wall -pedantic malloc-use.o -ΠΎ ccmalloc-use -lccmalloc -ldl

ЗапуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚. НапримСр, Ссли ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ malloc-use Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π·Π°Π±Ρ‹Ρ‚ΡŒ Π΅Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ, Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

% ./ccmalloc-use 12

file-name=a.out does not contain valid symbols

trying to find executable in current directory ...

using symbols from 'ccmalloc-use'

(to speed up this search specify 'file ccmalloc-use'

in the startup file '.ccmalloc')

Please enter a command: a 0 12

Please enter a command: q

.-----------------.

| ccmalloc report |

=====================================================

|  total # of | allocated | deallocated |    garbage |

+-------------+-----------+-------------+------------+

|       bytes |        60 |          48 |         12 |

+-------------+-----------+-------------+------------+

| allocations |         2 |           1 |          1 |

+----------------------------------------------------+

| number of checks: 1                                |

| number of counts: 3                                |

| retrieving function names for addresses ... done.  |

| reading file info from gdb ... done.               |

| sorting by number of not reclaimed bytes ... done. |

| number of call chains: 1                           |

| number of ignored call chains: 0                   |

| number of reported call chains: 1                  |

| number of internal call chains: 1                  |

| number of library call chains: 0                   |

=====================================================

|

*100.0% = 12 Bytes of garbage allocated in 1 allocation

|       |

|       |      0x400389cb in <???>

|       |

|       |      0x08045198 in <main>

|       |                 at malloc-use.с:89

|       |

|       |      0x06048fdc in <allocate>

|       |                 at malloc-use.c:30

|       |

|       '-----> 0x08049647 in <malloc>

|                          at src/wrapper.c:284

'------------------------------------------------------

Π’ послСдних Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строках ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°, Π½ΠΎ Π½Π΅ освобоТдСна ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ccmalloc отслСТивала ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ записи Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Π½Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области, придСтся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» .ccmalloc. располоТСнный Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» провСряСтся ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

А.2.5. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Electric Fence

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Electric Fence, написанная Π‘Ρ€ΡŽΡΠΎΠΌ ΠŸΠ΅Ρ€Π΅Π½Π·ΠΎΠΌ (Bruce Perens), останавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ‚ΠΎΠΉ строкС, Π³Π΄Π΅ происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ памяти Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области. Π­Ρ‚ΠΎ СдинствСнноС срСдство, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ дистрибутивов Linux, Π° Π΅Π΅ исходныС ΠΊΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://www.perens.com/FreeSoftware.

Как ΠΈ Π² случаС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ccmalloc, ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Electric Fence:

% gcc -g -Wall -pedantic malloc-use.o -o emalloc-use -lefence

ПослС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° провСряСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти. Π’ случаС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка сСгмСнтации:

% ./emalloc-use 12

Electric Fence 2.0.5 Copyright (C) 1987-1998 Bruce Perens.

Please enter a command a 0 12