Разработка приложений в среде Linux - [24]

Шрифт
Интервал

. Если >cb равен >NULL, выполняется выход. Запуск программы, связанной с >mcheck(), в gdb может показать, какие именно области памяти были повреждены, если только они явно освобождаются с помощью >free(). Однако метод >mcheck() не может точно определить место ошибки; лишь программист может вычислить это, основываясь на понимании логики работы программы.

Компоновка нашей тестовой программы с >mcheck дает следующие результаты:

>$ gcc -ggdb -о broken broken.с -lmcheck

>$ ./broken

>1: 12345

>memory clobbered past end of allocated block

>память разрушена после конца распределенного блока

Вследствие того, что >mcheck всего лишь выдает сообщения об ошибках и завершает работу, найти ошибку невозможно. Для точного обнаружения ошибки потребуется запустить программу внутри >gdb и заставить >mcheck вызывать >abort() при обнаружении ошибки. Можно просто вызвать >mcheck() внутри >gdb или поместить >mcheck(1) в первой строке вашей программы (веред вызовом >malloc()). (Следует отметить, что >mcheck() можно вызвать в >gdb без необходимости компоновки программы с библиотекой >mcheck.)

>$ rm -f broken; make broken

>$ gdb broken

>...

>(gdb) break main

>Breakpoint 1 at 0x80483f4: file broken.c, line 14.

>Точка прерывания 1 по адресу 0x80483f4: файл broken, с, строка 14.

>(gdb) command 1

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

>End with a line saying just "end".

>Наберите команды, которые выполнятся при достижении точки прерывания 1, по одной в строке.

>Завершите строкой, содержащей только "end".

>> call mcheck(&abort)

>> continue

>> end (gdb) run

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

>Запуск программы: /usr/src/lad/code/broken

>Breakpoint 1, main () at broken.с: 14

>47 return broken();

>$1 = 0

>1: 12345

>Program received signal SIGABRT, Aborted.

>Программа получила сигнал SIGABRT, прервана.

>0x00e12c32 in _dl_sysinfo_int80() from /lib/ld-linux.so.2

>(gdb) where

>#00x00el2c32 in _dl_sysinfo_int80() from /lib/ld-linux.so.2

>#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, с какой командой связывать журнал (если переменная не установлена, журнал не генерируется). Для небольших программ


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Windows Vista. Мультимедийный курс

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


FAQ по смартфону Qtek 8300/8310

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


Домашние и офисные сети под Vista и XP

Количество персональных компьютеров в нашей стране растет год от года. Сегодня во многих семьях имеется два или даже три компьютера.Чтобы воспользоваться всеми преимуществами такой ситуации, компьютеры в вашей квартире стоит объединить сетью. Это позволит вам играть по сети в компьютерные игры, совместно использовать дисковое пространство, принтеры, модемы и другие устройства, всю сеть можно соединить с Интернетом. А в офисах сеть между компьютерами просто необходима.Открывающиеся перспективы выглядят очень заманчиво.


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)