Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Компоновка нашей тестовой программы с

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

  • Читать дальше
  • 1
  • ...
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: