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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 16

Автор Майкл ДТонсон

#1 0x0072c969 in raise() from /lib/tls/libc.so.6

#2 0x0072e322 in abort() from /lib/tls/libc.so.6

#3 0x007792c4 in freehook() from /lib/tls/libc.so.6

#4 0x00774fa5 in free() from /lib/tls/libc.so.6

#5 0x0804842b in broken() at broken.c:17

#6 0x08048520 in main() at broken.с:47

Π’Π°ΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ этого ΠΊΠΎΠ΄Π° являСтся обнаруТСнная ошибка Π² строкС 17 Ρ„Π°ΠΉΠ»Π° broken.с. Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ошибка Π±Ρ‹Π»Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° Π²ΠΎ врСмя ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° free(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Π» Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² области памяти dyn. (freehook() прСдставляСт собой Π»ΠΎΠ²ΡƒΡˆΠΊΡƒ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ mcheck выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.)

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° mcheck Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ пСрСполнСния ΠΈΠ»ΠΈ Π½Π΅Π΄ΠΎΠ³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΡƒΡ„Π΅Ρ€Π° Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² областях памяти, распрСдСлСнных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc().

7.2.2. ИспользованиС mtrace() для отслСТивания распрСдСлСний памяти

Один ΠΈΠ· простых способов нахоТдСния всСх ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ прСдусматриваСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² malloc() ΠΈ free(). По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ, распрСдСлСнныС Ρ‡Π΅Ρ€Π΅Π· malloc(), с Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ освобоТдСны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ free() ΠΈΠ»ΠΈ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± ошибкС, Ссли для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π±Π»ΠΎΠΊΠ° free() Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ mcheck(), Π² mtrace() Π½Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ трассировку ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π² gdb. Однако для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ трассировки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ mtrace() Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ установлСна пСрСмСнная окруТСния MALLOC_TRACE Π² допустимоС имя Ρ„Π°ΠΉΠ»Π°; это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ имя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ вСсти запись, Π»ΠΈΠ±ΠΎ имя Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ процСсс создаст ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π² Π½Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ.

$ MALLOC_TRACE=mtrace.log gdb broken

...

(gdb) breakmain

Breakpoint 1 at 0x80483f4: filebroken.c, line 14.

(gdb) command 1

Type commands for when Breakpoint 1 is hit, one per line.

End with a line saying just "end".

>call mtrace()

>continue

>end

(gdb) run

Starting program: /usr/src/lad/code/broken

Breakpoint 1, main() at broken.с:47

47 return broken();

$1 = 0

1: 12345

2: 12345678

3: 12345678

4: 12345

5: 12345

6: 12345

7: 12345

Program exited normally.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

 (gdb) quit

$ ls -l mtrace.log

-rw-rw-r-- 1 ewt ewt 220 Dec 27 23:41 mtrace.log

$ mtrace ./broken mtrace.log

Memory not freed:

He освобоТдСна ΠΏΠ°ΠΌΡΡ‚ΡŒ:

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

   Address   Size Caller

     АдрСс Π Π°Π·ΠΌΠ΅Ρ€ ΠœΠ΅ΡΡ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°

0x09211378    0x5 at /usr/src/lad/code/broken.с:20

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mtrace Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΊΡ‚ освобоТдСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ free() памяти, которая Ρ€Π°Π½Π΅Π΅ Π½Π΅ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΠ»Π°ΡΡŒ, Ссли этот Ρ„Π°ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ зафиксирован Π² ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‚Π°ΠΊ Π½Π΅ происходит, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этом случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

7.3. Поиск ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ mpr

ВозмоТности mtrace() Π² glibc достаточно Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠ΅, Π½ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ распрСдСлСния памяти mpr (http://www3.telus.net/taj_khattra/mpr.html) Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… аспСктах Π±ΠΎΠ»Π΅Π΅ прост Π² использовании ΠΈ содСрТит Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ сцСнарии для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ mpr (послС сборки ΠΊΠΎΠ΄Π° с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ[10]) состоит Π² установкС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния MPRFI, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ mpr, с ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» (Ссли пСрСмСнная Π½Π΅ установлСна, ΠΆΡƒΡ€Π½Π°Π» Π½Π΅ гСнСрируСтся). Для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ MPRFI устанавливаСтся ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ cat >mpr.log. Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎΠΊΡ€ΡƒΠΏΠ½Π΅Π΅ MPRFI ΠΌΠΎΠΆΠ½ΠΎ сущСствСнно ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ пространство Π·Π° счСт сТатия ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π²ΠΎ врСмя Π΅Π³ΠΎ записи, установив MPRFI Π² gzip -1 >mpr.log.gz.

Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π³ΠΊΠΈΠΉ способ β€” Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сцСнариСм mpr для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; Ссли MPRFI Π΅Ρ‰Π΅ Π½Π΅ установлСна, ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ gzip -1 >log.%p.gz, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ созданию ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ процСсса ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ mpr. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сборка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ понадобится. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° для исправлСнной вСрсии нашСй тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

$ MPRFI="cat >mpr.log" mpr ./broken

1: 12345

2: 12345678

3: 12345678

4: 12345

5: 12345

6: 12345

7: 12345

$ ls -l mpr.log

-rw-rw-r-- 1 ewt ewt 142 May 17 16:22 mpr.log

ПослС создания ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° доступны ΠΌΠ½ΠΎΠ³ΠΈΠ΅ срСдства для Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. ВсС эти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» mpr Π² качСствС стандартного Π²Π²ΠΎΠ΄Π°. Если Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ· этих срСдств содСрТит числа Π² Ρ‚Π΅Ρ… мСстах, Π³Π΄Π΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€ΠΎΠ΄Π΅ "cannot map pc to name" ("Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ счСтчик Π½Π° имя")), ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связана с вСрсиСй ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ awk, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ mpr. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ mpr для достиТСния Π»ΡƒΡ‡ΡˆΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² рСкомСндуСтся ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния MPRAWK для Π²Ρ‹Π±ΠΎΡ€Π° mawk Π² качСствС вСрсии awk: export MPRAWK='mawk -W sprintf=4096'. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΡΠ±ΠΈΡ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ mpr ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ ΠΈ рандомизация стСка, которая обСспСчиваСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ядра "Exec-shield"; ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π° счСт использования ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ setarch, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Exec-shield Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ исслСдуСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² mpr: setarch i386 mpr ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈ setarch i386 mprmap ...

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… стСковых Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² mpr ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π½Π°ΠΉΡ‚ΠΈ символичСскоС имя; Π² этом случаС просто ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ….

mprmap ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ адрСса ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ mpr Π² ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ мСстополоТСния Π² исходном ΠΊΠΎΠ΄Π΅. Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ указываСтся имя исполняСмого Ρ„Π°ΠΉΠ»Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΆΡƒΡ€Π½Π°Π». Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС распрСдСлСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ вмСстС с Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ осущСствили эти распрСдСлСния, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ mprmap ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° < mpr.log. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Ρ„Π»Π°ΠΆΠΊΠ° -f ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², Π° ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ -l β€” Π΅Ρ‰Π΅ ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° строк Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². Π€Π»Π°ΠΆΠΎΠΊ -l ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ -f. Π’Ρ‹Π²ΠΎΠ΄ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся допустимым ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ mpr, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан ΠΊΠ°Π½Π°Π»ΠΎΠΌ с любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ mpr. mprchain ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΆΡƒΡ€Π½Π°Π» Π² Π²Ρ‹Π²ΠΎΠ΄, сгруппированный ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” это список всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. НапримСр, Ссли main() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ getargs(), которая впослСдствии Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ parsearg(), активная Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ parsearg() отобраТаСтся ΠΊΠ°ΠΊ main:getargs:parsearg. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΠ»Π°ΡΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, mprchain ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ количСство распрСдСлСний ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ количСство распрСдСлСнных Π±Π°ΠΉΡ‚. mprleak Π­Ρ‚ΠΎΡ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ просматриваСт ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ наличия всСх нСосвобоТдСнных Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² памяти. Π’ качСствС стандартного Π²Ρ‹Π²ΠΎΠ΄Π° гСнСрируСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», содСрТащий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ распрСдСлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти. Π’Ρ‹Π²ΠΎΠ΄ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся допустимым ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ mpr, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан ΠΊΠ°Π½Π°Π»ΠΎΠΌ с любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ mpr. mprsize Π­Ρ‚ΠΎΡ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ сортируСт распрСдСлСния памяти ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ mprleak Π½Π° Π²Ρ…ΠΎΠ΄ mprsize. mprhisto ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ гистограмму распрСдСлСний памяти.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° извСстно ΠΎΠ± Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‡Π΅Π½ΡŒ просто Π½Π°ΠΉΡ‚ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти Π² нашСй тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Для этого достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ mprleak mpr.log | mprmap -l ./broken (Ρ‡Ρ‚ΠΎ эквивалСнтно mprmap -l ./broken mpr.log | mprleak) ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти Π² строкС 20.

$ mprleak mpr.log | mpr map -l ./broken

m:broken(broken.c,20): main(broken.c,47):5:134518624

7.4. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ошибок памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Valgrind

Valgrind (http://valgrind.kde.org/) прСдставляСт собой спСцифичСский для Intel Ρ…86 инструмСнт, ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ процСссор класса Ρ…86 для нСпосрСдствСнного наблюдСния Π½Π°Π΄ всСми обращСниями ΠΊ памяти ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… (ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ чтСния Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ памяти, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ пСрСнос содСрТимого Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ячСйки Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ячСйку, которая Π½ΠΈΠΊΠΎΠ³Π΄Π° для читаСтся, ΠΊΠ°ΠΊ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΠ½ Π½Π΅ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΠ΅Ρ‚). Valgrind ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ мноТСством Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностСй, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ просмотр использования кэша ΠΈ поиск состязаний Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π² Valgrind имССтся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство для добавлСния большСго количСства возмоТностСй, основанных Π½Π° Π΅Π³ΠΎ эмуляторС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора. Однако для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ ΠΌΡ‹ лишь ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ агрСссивного поиска ошибок памяти, Ρ‡Ρ‚ΠΎ прСдставляСт Π΅Π³ΠΎ стандартноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.