В начало!  
Сделай закладку этой страницы в Digg Сделай закладку этой страницы в Del.icoi.us Сделай закладку этой страницы в Slashdot Сделай закладку этой страницы в Technorati



Поиск ошибок доступа к памяти с использованием Sun Memory Error Discovery Tool
Автор Дэррил Гоув   
12.11.2007 г.

Sun Memory Error Discovery Tool способен обнаруживать и сообщать о таких распространенных ошибках доступа к памяти, как обращение к неинициализированной памяти, запись за пределы массива или обращение к уже освобожденной памяти. Эта статья представляет собой краткое руководство по использованию Discovery Tool.

Содержание

Введение

Ошибки доступа к памяти являются одними из наиболее сложно обнаруживаемых. Причина этого в том, что симптомы ошибки проявляются сколь угодно далеко от точки возникновения самой ошибки. Sun Memory Error Discovery Tool (или, для краткости, Discovery Tool) предназначен для обнаружения и составления отчета о распространенных ошибках доступа к памяти, таких как обращение к неинициализированной памяти, запись за пределы массива или обращение к уже освобожденной памяти. Первая версия этого инструмента поддерживает только однопоточные приложения.

Discovery Tool влючен в набор CMT Developer Tools. Эти инструменты работают с Sun Studio 12 и они доступны для скачивания бесплатно. Подробная информация есть в инструкции по установке (англ). Как пользоваться Discovery Tool

Как пользоваться Discovery Tool

Анализируемое приложение должно быть скомпилировано с помощью Sun Studio 12 с указанием опции компилятора -xbinopt=prepare, уровенем оптимизации -xO1 или выше, а также опцией -g для получения от инструмента более полной отладочной информации. Следующий пример кода содержит ошибку -- читается неинициализированный элемент массива a[1].


#include <stdlib.h>
#include <stdio.h> void main()
{
   int * a = malloc(100*sizeof(int));
   a[1]++;
   free(a);
}

Ниже приведены шаги, необходимые для компиляции, инструментирования и запуска этого кода:
$ cc -g -O -xbinopt=prepare -o mem mem.c
$ discover mem
$ ./mem

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

ERROR (UMR): accessing uninitialized data
from address 0x5000c (4 bytes) at:
main() + 0x54 [/tmp/mem:0x30054]
<mem.c:7>:
4: void main()
5: {
6: int * a=malloc(100*sizeof(int));
7:=> a[1]++;
8: free(a);
9: }

Пример вывода Sun Discovery Tool Отчет может содержать и другие секции, указывающие точку выделения памяти и, если необходимо, точку программы, в которой память была освобождена. Также можно получить отчет в формате HTML, установив переменную окружения DISCOVER_HTML в 1.

Приведенный ниже код иллюстрирует чтение памяти за пределами массива. Для той же строки выводится еще одно сообщение, так как 101-й элемент массива используется одновременно и для чтения, и для записи.

ERROR (ABR): reading memory beyond array bounds
at address 0x50198 (4 bytes) at:
main() + 0x54 [/tmp/mem:0x30054]
<mem.c:7>:
4: void main()
5: {
6: int * a=malloc(100*sizeof(int));
7:=> a[100]++;
8: free(a);
9: }

Заключение

Несмотря на то, что ошибки доступа к памяти сложно обнаружить, Sun Memory Error Discovery Tool способен значительно упростить процесс поиска, уменьшая тем самым время разработки и делая финальный продукт более надежным. Дополнительная информация о Discovery Tool, включая ссылки на инструкции по установки, man-страницы и подробное руководство пользователя доступны на странице проекта.

Об авторе

Дэррил Гоув - ведущий специалист в группе оптимизации производительности компилятора компании Sun Microsystems Inc. Он занимается анализом и оптимизацией производительности приложений на существующих и разрабатываемых UltraSPARC-системах. Дэррил имеет степени магистра и доктора наук в области исследования операций Университета Саутгэмптона в Великобритании. Перед тем, как начать работу в Sun, Дэррил занимался различными работами в области проектирования и разработки ПО в Великобритании. См. также блог Дэррила: http://blogs.sun.com/d/

Перевод: Максим Карташев, 2007г. 

Оригинал статьи: http://developers.sun.com/solaris/articles/discovery_tool.html

 

Добавить комментарий


Защитный код
Обновить