В документации Valgrind объясняется, что копирование неинициализированных данных не выдает сообщений об ошибках. Оболочка memcheck отмечает состояние данных (неинициализированные) и отслеживает его при перемещениях данных. Таким образом, a_var
b_var, которая была неинициализированной.memcheck
_IO_vfprintf_internal()), которая должна преобразовать значение в строку, для этого, она проводит с этим значением вычисления.К сожалению, хотя Valgrind может обнаружить использование неинициализированной памяти вплоть до уровня битов, он не может осуществлять проверки границ массивов для локальных и глобальных переменных. (Valgrind может осуществлять проверку границ для динамической памяти, поскольку он сам обрабатывает такую память, поэтому знает о начале и конце каждой области.)
В заключение, Valgrind является мощным инструментом отладки памяти. Он использовался в таких крупномасштабных, многопоточных производственных программах, как KDE 3, OpenOffice и веб-браузер Konqueror. Он конкурирует с несколькими коммерческими предложениями, а другая его версия была даже использована (совместно с эмулятором WINE[182]
) для отладки программ, написанных для Microsoft Windows с использованием Visual С++! Вы можете получить Valgrind с его веб-сайта[183].15.5.2.5. Другие отладчики malloc
Две статьи Cal Ericson в Linux Journal описывают mtrace
dmalloc, а также большинство других перечисленных ниже инструментов. Эти статьи Другие инструменты сходны по природе с описанными ранее.
ccmalloc
Замещающая malloc()
http://www.inf.ethz.ch/personal/biere/projects/ccmalloc. malloc
Старинная, но полнофункциональная библиотека замещения malloc()
ftp://ftp.cs.toronto.edu/pub/moraes/malloc-1.18.tar.gz.mpatrol
Пакет с большими возможностями настройки для отладки памяти и тестирования. См http://www.cbmamiga.demon.со.uk/mpatrol
memwatch
Пакет, требующий использования специального заголовочного файла и опций времени компилирования. См. http://www.linkdata.se/sourcecode.html
njamd
«Не просто еще один отладчик malloc» (Not Just Another Malloc Debugger). Эта библиотека не требует специальной компоновки с приложением; вместо этого она использует LD_PRELOAD
http://sourceforge.net/projects/njamd.yamd
Похож на Electric Fence, но со многими дополнительными опциями. См. http://www3.hmc.edu/~neldredge/yamd
Почти все из этих пакетов используют для точной настройки своего поведения переменные окружения. В таблице 15.1 на основе статей из
Таблица 15.1
. Сводка особенностей инструментов памяти| Инструмент | ОС | Заголовочный файл | Модуль/ программа | Многопоточность |
|---|---|---|---|---|
ccmalloc | Многотипная | Нет | Программа | Нет |
dmalloc | Многотипная | Необязательно | Программа | Да |
efence | Многотипная | Нет | Программа | Нет |
memwatch | Многотипная | Да | Программа | Нет |
Moraes | Многотипная | Необязательно | Программа | Нет |
mpatrol | Многотипная | Нет | Программа | Да |
mtrace | Linux (GLIBC) | Да | Модуль | Нет |
njamd | Многотипная | Нет | Программа | Нет |
valgrind | Linux (GLIBC) | Нет | Программа | Да |
yamd | Linux, DJGPP | Нет | Программа | Нет |
Как видно, для отладки проблем динамической памяти доступен ряд выборов. На системах GNU/Linux и BSD один или более из этих инструментов, возможно, уже установлены, что избавляет вас от хлопот по их загрузке и построению.
Полезно также использовать для своей программы несколько инструментов подряд. Например, mtrace
15.5.3. Современная lint