Обнаружение ошибок памяти с помощью Valgrind Valgrind

Обнаружение ошибок памяти с помощью Valgrind Valgrind (http: //valgrind. kde. org/) представляет собой специфический для Intel х86 инструмент, эмулирующий центральный процессор класса х86 для непосредственного наблюдения над всеми обращениями к памяти и анализа потока данных (он может, например, выявлять чтения неинициализированной памяти, тем не менее перенос содержимого неинициализированной ячейки в другую ячейку, которая никогда для читается, как неинициализированное чтение он не трактует). Valgrind обладает множеством других возможностей, включая просмотр использования кэша и поиск состязаний в многопоточных программах. В действительности, в Valgrind имеется универсальное средство для добавления большего количества возможностей, основанных на его эмуляторе центрального процессора. Однако для наших целей мы лишь кратко рассмотрим выполнение с его помощью агрессивного поиска ошибок памяти, что представляет его стандартное поведение.

Valgrind не требует повторной компиляции программы, хотя, как и все средства отладки, он имеет возможность компилировать программы с отладочной информацией.

$ valgrind./broken 30882 Memcheck, a. k. a. Valgrind, a Memory ERROR detector for x86linux. 30882 Copyright (C) 20022003, and GNU GPL'd, by Julian Seward. 30882 Using valgrind2.0.0, a program super vision framewok for x86linux. 30882 Copyright (C) 20002003, and GNU GPL'd, by Julian Seward. 30882 Estimated CPU clock rate is 1547 MHz 30882 For more details, rerun with: v 30882 30882 Invalid write of size 1 —30882 Недопустимая запись размером 1 30882 at 0xC030DB: strcpy (mac_replace_strmem. с:174)

30882 by 0x8048409: broken (broken. с:15)

30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 Address 0x650F029 is 0 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. с:153) 30882 by 0x80483F3: broken (broken. с:14) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Conditional jump or move depends on uninitialised value(s) 30882 Условный переход или перемещение зависит от неинициализироваиного значения(й) 30882 at 0x863D8E: GI_strlen (in /lib/libc2.3.2. so) 30882 by 0x83BC31: _IO_printf (in /lib/libc2.3.2. so) 30882 by 0x804841C: broken (broken. с:16)

Мини-картинка

30882 by 0x804851F: main (broken. с:47)

1 12345

30882

30882 Invalid write of size 1 30882 at 0xC030D0: strcpy (mac_replace_. с: 173) 30882 by 0x804844D: broken (broken. с:21) 30882 by 0x804851F: main (broken. с:47)

30882 by 0х802ВАЕ: libc_start_main (in /lib/libc2.3.2. so) 30882 Address 0x650F061 is 0 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_ malloc. с:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid write of size 1 30882 at 0xC030DB: strcpy (mac_replace_strmem. с:174) 30882 by 0x804844D: broken (broken. с:21) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 Address 0x650F064 is 3 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. с:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid read of size 4 30882 Недопустимое чтение размером 4 30882 at 0x863D50: GI_strlen (in /lib/libc2.3.2. so) 30882 by 0x83BC31: _IO_printf (in /lib/libc2.3.2. so) 30882 by 0x8048460: broken (broken. с:22) 30882 by 0x804851F: main (broken. с:47)

30882 Address 0x650F064 is 3 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. с:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid read of size 1 30882 at 0x857A21: _IO_file_xsputnGLIBC_2.1 (in /lib/libc2.3.2. so) 30882 by 0x835309: _IO_vfprintf_internal (in /lib/libc2.3.2. so) 30882 by 0x83BC31: _IO_printfJin /lib/libc2.3.2. so) 30882 by 0x8048460: broken (broken. с:22)

30882 Address 0x650F063 is 2 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. с:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. c:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid read of size 1 30882 at 0x857910: _IO_file_xsputnGLIBC_2.1 (in /lib/libc2.3.2. so) 30882 by 0x835309: _IO_vfprintf_internal (in /lib/libc2.3.2. so) 30882 by 0x83BC31: _IO_printf (in /lib/libc2.3.2. so) 30882 by 0x8048460: broken (broken. с:22)

30882 Address 0x650F061 is 0 bytes after a block of size 5'alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. с:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 2 12345678 30882 30882 Invalid write of size 1 30882 at 0x8048468: broken (broken. с:25) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 by 0x8048354: (within /usr/src/d/lad2/code/broken) 30882 Address 0x650F05B is 1 bytes beFore a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. c:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid read of size 4 30882 at 0x863D50: GI_strlen (in /lib/libc2.3.2. so) 30882 by 0x83BC31s _IO_printf (in /lib/libc2.3.2. so) 30882 by 0x804847A: broken (broken. c:2 6) 30882 by 0x804851F: main (broken. c:47)

30882s Address 0x650F064 is 3 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replacejnalloc. c:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. c:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid read of size 1 30882 at 0x857A21: JTO_file_xsputnGLIBC_2.1 (in /lib/libc2.3.2. so) 30882 by 0x835309: _IO__vfprintf_internal (in /lib/libc2.3.2. so) 30882 by 0x83BC31: _IO_printf (in /lib/libc2.3.2. so) 30882 by 0x804847A: broken (broken. c:2 6)

30882 Address 0x650F063 is 2 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. c:153) ' 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 30882 Invalid read of size 1 30882 at 0x857910: _IO_file_xsputnGLIBC_2.1 (in /lib/libc2.3.2. so) 30882 by 0x835309: _IO_vfprintf_internal (in /lib/libc2.3.2. so) 30882 by 0x83BC31: _IO_printf (in /lib/libc2.3.2. so) 30882 by 0x804847 A: broken (broken. c:2 6)

30882 Address 0x650F061 is 0 bytes after a block of size 5 alloc'd 30882 at 0xC0C28B: malloc (vg_replace_malloc. с:153) 30882 by 0x8048437: broken (broken. с:20) 30882 by 0x80485'lF: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 3 12345678 4 12345 30882 30882 Invalid write of size 1 30882 at 0x80484A6; broken (broken. c:3 2) 30882 by 0x804851F: main (broken. с:47)

30882 by 0x802BAE: libc_start_main (in /lib/libc2.3.2. so) 30882 by 0x8048354: (within /usr/src/d/lad2/code/broken) 30882 Address 0xBFF2D0 FF is just below % esp. Possibly a bug in GCC/G ++ 30882 v 2.96 or 3. O. X. To suppress, use:— workaroundgcc 296bugs yes 5 12345 б: 12345 7: 12345 30882

30882 ERROR SUMMARY: 22 ERRORS from 12 contexts (suppressed: 0 from 0) 30882 malloc/free: in use at exit: 5 bytes in 1 blocks. 30882 malloc/free: 2 allocs, 1 frees, 10 bytes allocated. 30882 For a detailed leak analysis, rerun with: —leakcheckyes 30882 For counts1of detected ERRORS, rerun with: v 30882 ИТОГИ ПО ОШИБКАМ: 22 ошибки в 12 контекстах (подавлено: 0 из 0) 30882 malloc/free: используются после завершения: 5 байт в 1 блоке. 30882 malloc/free: 2 распределения, 1 освобождение, 10 байт распределено. 30882 Для детального анализа утечек памяти запустите с: —leakcheckyes 30882 Для подсчета обнаруженных ошибок запустите с: v Обратите внимание, что Valgrind нашел все, кроме глобального переполнения и недогрузки, и указал на ошибки более точно, нежели любое другое ранее описанное средство.

Мини-картинка
Ведете ли вы блог?

Да
Нет
Планирую


Результаты опроса

Новостной блок