Основы программирования в Linux
Шрифт:
$
Тем не менее, если вы возьмете ту же самую программу и скомпонуйте ее с библиотекой ElectricFence (libefence.a), то получите немедленный отклик:
$ cc -о efence efence.с -lefence
$ ./efence
Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens <bruce@perens.com>
Segmentation fault
$
Выполнение под контролем отладчика позволяет получить подробное описание проблемы;
$ cc -g -о efence efence.с -lefence
$ gdb efence
(gdb) run
Starting program: /home/neil/BLP4e/chapter10/efence
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens bruce@perens.com
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (LWP 1869)]
0x08048512 in main at efence.c:10
10 ptr[1024] = 0;
(gdb)
Как это работает
Библиотека ElectricFence заменяет функцию
malloc
и связанные с ней функции версиями, применяющими аппаратные средства виртуальной памяти для защиты от несанкционированного доступа к памяти. При возникновении подобного обращения к памяти порождается сигнал нарушения сегментации и программа останавливается. valgrind
Средство
valgrind
способно обнаруживать многие из обсуждавшихся нами проблем (упражнение 10.4). Прежде всего, оно умеет находить ошибки доступа, к массиву и утечки памяти. Это средство, возможно, не включено в ваш дистрибутив Linux, но его можно найти на Web-сайте http://valgrind.org. Для применения
valgrind
даже не требуется перекомпиляции программы, и вы можете находить ошибки доступа к памяти в выполняющейся программе. Данное средство заслуживает внимания; оно применяется в основных разработках, включая среду KDE версии 3. Упражнение 10.4. Средство
valgrind
Далее приведена программа checker.c, которая выделяет некоторый объем памяти, читает область памяти и записывает данные за пределами выделенного участка, а затем делает выделенный участок недоступным.
#include <stdio.h>
#include <stdlib.h>
int main {
char *ptr = (char *)malloc(1024);
char ch;
/* Неинициализированное чтение */
ch = ptr[1024];
/* Запись за пределами блока */
ptr[1024] = 0;
/* Потеря блока */
ptr = 0;
exit(0);
}
Для применения
valgrind
вы просто выполняете команду valgrind
, передав ей опции, задающие нужные виды проверок, и далее указав программу для выполнения с ее аргументами (если таковые есть). При выполнении программы с
valgrind
вы увидите множество обнаруженных проблем:
$ valgrind --leak-check=yes -v ./checker
==4780== Memcheck, a memory error detector.
==4780== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==4780== Using LibVEX rev 1732, a library for dynamic binary translation.
==4780== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==4780== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==4780== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==4780==
– -4780-- Command line
– -4780-- ./checker
– -4780-- Startup, with flags:
– -4780-- --leak-check=yes
– -4780-- -v
– -4780-- Contents of /рroc/version:
– -4780-- Linux version 2-6.20.2-2-default (geeko@buildhost) (gcc version 4.1.3 20070218 (prerelease) (SUSE Linux)) #1 SMP Fri Mar 9 21:54:10 UTC 2007
– -4780-- Arch and hwcaps: X86, x86-sse1-sse2
– -4780-- Page sizes: currently 4096, max supported 4096
– -4780-- Valgrind library directory: /usr/lib/valgrind
– -4780-- Reading syms from /lib/ld-2.5.so (0x4000000)
– -4780-- Reading syms from /home/neil/BLP4e/chapter10/checker (0x8048000)
– -4780-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck (0x38000000)
– -4780-- object doesn't have a symbol table
– -4780-- object doesn't have a dynamic symbol table
– -4780-- Reading suppressions file: /usr/lib/valgrind/default.supp
– -4780-- REDIR: 0x40158B0 (index) redirected to 0x38027EDB (???)
– -4780-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x401E000)
Поделиться:
Популярные книги
Эпоха Опустошителя. Том VII
7. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Лейб-хирург
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Газлайтер. Том 21
21. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Московское золото или нежная попа комсомолки. Часть Вторая
2. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Родословная. Том 2
2. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Наследие Маозари 6
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Родословная. Том 3
3. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Ну привет, заучка...
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Телохранитель Генсека. Том 3
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Паладин
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
История московских кладбищ. Под кровом вечной тишины
Научно-образовательная:
история
культурология
5.75
рейтинг книги
Я уже царь. Книга XXIX
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 2
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00