|
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: }
Отчет может содержать и другие секции, указывающие точку выделения памяти и, если необходимо, точку программы, в которой память была освобождена. Также можно получить отчет в формате 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 |