Показаны сообщения с ярлыком Отладка. Показать все сообщения
Показаны сообщения с ярлыком Отладка. Показать все сообщения

3/16/2009

Поиск утечек памяти штатными средствами.

Если спросить у кого-нибудь, как обнаружить в программе утечки памяти, то этот кто-нибудь скорее всего вас отправить на сайт www.valgrind.org. Конечно valgrind очень мощная и удобная утилита, но что делать, когда нет возможности использовать valgrind? Скажем нехватка памяти, или не поддерживаемая им архитектура?
На помощь нам приходит glibc и функции mtrace и muntrace. Функция mtrace устанавливает обработчики для malloc, realloc, и free. А функция muntrace убирает установленные обработчики.
Для того чтобы установить обработчики, нужно вызвать mtrace скажем в начале программы. Затем нужно определить переменную окружения MALLOC_TRACE в которой нужно определить путь к текстовому файлу, где mtrace сохранит результаты работы.
Рассмотрим пример:

1 #include <mcheck.h>
2 #include <stdlib.h>
3
4 int main (int argc, char *argv[])
5 {
6 int *i = NULL;
7
8 mtrace ();
9 i = (int*)malloc (sizeof (int));
10
11 return 0;
12 }

В функции утечка памяти: в строке 9 она выделяется, но далее нигде не освобождается.
Компилируем программу с отладочной инорфмацией, если мы хотим увидеть не только адрес функции, но еще и номер строки:
gcc -ggdb3 -o main main.c

Устанавливаем в переменной окружения
MALLOC_TRACE путь к выходному файлу:
export MALLOC_TRACE=/tmp/out.txt

Запускаем программу:
./main

После запуска можно посмотреть на созданный файл:
cat /tmp/out.txt

Содержимое его будет примерно таким:

= Start
@ ./main:[0x40057e] + 0x602460 0x4

Не очень понятно, что тут и зачем =).
Однако вместе с libc ставится и скрипт на языке perl, который выводит информацию об утечке памяти в более человеческом виде. Запускаем в консоли:
mtrace ./main /tmp/out.txt
И получаем вывод:

Memory not freed:
-----------------
Address Size Caller
0x0000000000602460 0x4 at /tmp/main.c:9

P.S. Не забываете очищать выделенную память, а если вы не забываете ее очищать, то и не забывайте ее ранее выделять ;-)

12/07/2008

Удобство отладки.

Не секрет, что очень много времени программист использует для отладки своих программ.
В Линукс, для отладки приложений пользовательского уровня используется интерактивный отладчик GDB. По умолчанию, GDB предполагает использование интерфейса командной строки, что для некоторых представляется очень и очень неудобным, и вообще...
И вообще такие люди говорят:" Вот бы нам такой отладчик. как в Visual Studio!".
На самом деле для GDB очень давно существует подобный интерфейс.
И, как вы уже наверное догадались, для этого нам понадобится "текстовый редактор" Emacs.
Итак начинаем отладку.
Запустим Emacs в каталоге с программой, которую собираетесь отлаживать. Так же было бы неплохо, чтобы в этом же каталоге лежали еще и исходные тексты.
Для активизации режима отладки, нужно в минибуфере набрать gdb.
На что вы получите примерно следующее приглашение:
Run gdb (like this): gdb --annotate=3 main.
В большинстве случаев этого достаточно.
Жмем Enter, и после этого опять же в минибуфере, активируем много-оконный режим:
M-x gdb-many-windows
после активации получится примерно следующее:

В центре исходник вашей программы.Слева вверху - консоль GDB. Справа, рядом с ней список отображающий значения регистров или переменных. Внизу слева - Стек. Справа - список точек останова программы.
Итак, поехали. Для запуска программы пожно либо написать в консоли gdb start, либо воспользоваться соответствуюим пунктом из меню GUD.
Точки останова можно ставить как с помощью консоли, так и с помощью мыши, просто кликнув на серой полоске (не знаю как она называется по научному) около понравившейся строки:
Все понятно и наглядно представлено. Более того, если устновить курсор на какую-нибудь переменную, и нажать на кнопку P на панели инструментов, то распечатается значение этой переменной. Точно таким же образом можно наблюдать за состоянием переменной, установив Watchpoint. С помощью той же панели инструментов можно побродить вверх и вниз по стеку. Можно с помощью удобных кнопочек осуществлять пошаговую отладку.
В общем весьма удобно и по функционалу ничем не хуже, чем Visual Studio.
З.Ы. Кому интересно, предлагайте, допишу что нибудь еще.