Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Если вы установили переменную окружения

MALLOC_CHECK_
, выбирается другой, несколько более медленный набор функций управления памятью. Этот набор более устойчив к ошибкам и может обнаруживать ситуации, когда
free
вызывается более одного раза для одного и того же указателя, а также когда происходят однобайтные переполнения буфера. Если
MALLOC_CHECK_
установлена в
0
, функции управления памятью просто более устойчивы к ошибкам, но не выдают никаких предупреждений. Если
MALLOC_CHECK_
установлена в
1
, функции управления памятью выводят предупреждения о стандартных ошибках при замеченной проблеме. Если
MALLOC_CHECK_
установлена в
2
, функции управления памятью вызывают
abort
, когда замечают проблемы.

Установка

MALLOC_CHECK_
в
0
может оказаться полезной, если вам мешает найти ошибку в памяти другая ошибка, которую в этот момент исправить нет возможности; эта установка позволяет работать с другими средствами отслеживания ошибок памяти.

Установка

MALLOC_CHECK_
в
1
полезна в случае, когда никаких проблем не видно, поэтому определенные уведомления могут помочь.

Установка

MALLOC_CHECK_
в
2
наиболее полезна при работе в отладчике, поскольку при возникновении ошибки он позволяет выполнить обратную трассировку вплоть до функций управления памятью. В результате вы максимально приблизитесь к месту возникновения ошибки.

$ MALLOC_CHECK_=1 ./broken

malloc: using debugging hooks

malloc: используются отладочные функции

1: 12345

free: invalid pointer 0x80ac008!

free: недопустимый указатель 0x80ac008!

2: 12345678

3: 12345678

4: 12345

5: 12345

6: 12345

7: 12345

$ MALLOC_CHECK_=2 gdb ./broken

...

(gdb) run

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

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

1: 12345

Program received signal SIGABRT, Aborted.

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

0x00 с 64 с 32 in _dl_sysinfo_int80 from/lib/ld-linux.so.2

(gdb) where

#0 0x00c64c32 in _dl_sysinfo_int80 from /lib/ld-linux.so.2

#1 0x00322969 in raise from /lib/tls/libc.so.6

#2 0x00324322 in abort from /lib/tls/libc.so.6

#3 0x0036d9af in free_check from /lib/tls/libc.so.6

#4 0x0036afa5 in free from /lib/tls/libc.so.6

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

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

Другой способ заставить

glibc
проверить кучу на непротиворечивость — воспользоваться функцией
mcheck
:

typedef void(*mcheck Callback)(enummcheck_status status);

void mcheck(mcheck Callback cb) ;

В случае вызова функции

mcheck
, функция
malloc
размещает известные последовательности байтов перед и после возвращенной области памяти, чтобы можно было обнаружить переполнение или недогрузку буфера,
free
ищет эти сигнатуры и, если они были повреждены, вызывает функцию, указанную аргументом
cb
. Если
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

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит