Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #72, ДЕКАБРЬ 2004 г.

Операционные инструменты *nix-кодера

Иван Скляров

Хакер, номер #072, стр. 072-104-2


Тэги тэгам рознь

Если программа состоит из множества модулей, которые, в свою очередь, разбросаны по множеству исходных файлов, то становится сложно отыскать определение нужной функции. Именно для быстрого поиска функций и предназначена ctags. Достаточно ей скормить исходные файлы твоей проги, как она сформирует особый информационный файл (tags) из трех колонок, где в первой колонке будут названия всех функций, во второй - имена исходных файлов, в которых расположены эти функции, а в третьей - готовый шаблон для поиска функций по файловой системе с помощью таких утилит, как find. Пример:

main /usr/src/program.c /^main()$/

func1 /usr/src/program.c /^func1(arg1,arg2)$/

func2 /usr/src/program.c /^func2(arg1,arg2)$/

Пример использования утилиты ctags:

$ ctags *.c

Отслеживаем системные вызовы

Утилита strace отслеживает все запрашиваемые вызовы и получаемые системные сигналы твоей программы. Используется просто:

$ strace ./program

Каждая строка выводимой информации будет соответствовать одному системному вызову. Сначала будет указано имя системного вызова со списком аргументов (с сокращениями), а после знака равно - возвращаемое значение (см. скриншот).

В выражении вида

execve("./program", ["./program"], [/*27 vars */]) = 0

[/* 27 vars */] означает, что здесь идет список переменных среды (27 штук), которые опущены strace для краткости.

Трассируем в стиле BSD

В *BSD существует команда ktrace, которая аналогична команде strace. Пример использования:

$ ktrace ./program

В текущей директории образуется файл ktrace.out, куда скидываются результаты работы ktrace. Чтобы просмотреть эту информацию, нужно просто запустить утилиту kdump:

$ kdump | less

Во многих *nix-системах присутствует еще одна похожая утилита — truss. По функциям она проще, чем ktrace, но зато сразу отображает все результаты в консоли. Пример:

$ truss ./program

Боремся с утечками памяти

Если твоя прога использует динамическую память, то крайне желательно протестировать ее с помощью утилиты mtrace. Mtrace отслеживает соответствие числа операций выделения и освобождения памяти, т.е. вылавливает утечки памяти. Утечки памяти ведут к постепенному сокращению ресурсов системы, до полного их исчерпания. Чтобы выловить все возможные утечки памяти в твоей программе, придется проделать несколько неприятных шагов. Во-первых, нужно включить в программу файл <mcheck.h> и разместить в самом начале программы вызов функции mtrace(). Затем нужно указать имя файла, в котором будет сохраняться информация о проверке. Делается это через экспортирование переменной окружения MALLOC_TRACE, например:

$ export MALLOC_TRACE=mem.log

Теперь запусти программу. Все операции выделения и освобождения памяти будут регистрироваться в mem.log. Последним этапом вызывается утилита mtrace в следующем виде:

$ mtrace program $MALLOC_TRACE.

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

Размер имеет значение

Чтобы узнать размеры секций программы - секции команд (text), данных (data) и неинициализированных данных (bss), нужно использовать утилиту size. Она также показывает общую сумму всех секций в десятичном и шестнадцатеричном формате. Пример работы утилиты показан на скриншоте.

Назад на стр. 072-104-1  Содержание  Вперед на стр. 072-104-3