8 Некоторые средства разработки программ
B распоряжении пользователей на Linux ферме ЛИТ имеется необходимый набор
средств разработки программ.
8.1 Текущие версии компиляторов
Для RedHat7.3 по умолчанию вызывается 2.96 20000731 версия компилятора Си.
В командной строке:
cc или gcc
Расположение:
/usr/bin/cc --> /usr/bin/gcc
/usr/bin/c++ = usr/bin/g++
/usr/bin/f77 --> /usr/bin/g77
Соответствующий редактор связей (версия 2.11.93.0.2 20020207):
/usr/bin/ld
Поддерживается эмуляция:
elf_i386
i386linux
elf_i386_glibc21
Имеются также версии компилятора 2.95.2 и 3.2.3.
Расположение:
/usr/local/gcc-alt-2.95.2/bin/gcc
/usr/local/gcc-alt-2.95.2/bin/c++=/usr/local/gcc-alt-2.95.2/bin/g++
/usr/local/gcc-alt-2.95.2/bin/g77
Соответствующий загрузчик:
/usr/local/gcc-alt-2.95.2/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/ld
Расположение:
/usr/local/gcc-alt-3.2.3/bin/c++=/usr/local/gcc-alt-3.2.3/bin/g++
/usr/local/gcc-alt-3.2.3/bin/g77
/usr/local/gcc-alt-3.2.3/bin/gcc
Примечание:
Для программ, скомпилированных компиляторами 2.95.2 и 3.2.3 версий,
обычно перед выполнением программы необходимо определить переменную
окружения:
LD_LIBRARY_PATH=/usr/local/gcc-<версия>/l.b
Компилятор С
- программа, выполняющая препроцессирование, компиляцию, ассемблирование
и создание исполняемого кода. Работает с исходными файлами на языках C и
C++, имеющими суффиксы:
.c | для исходного кода на языке C
| .C | для исходного кода на языке C++
| .cc | для исходного кода на языке C++
| .cxx | для исходного кода на языке C++
| .i | для препроцессорного файла
| .h | для препроцессорного файла
| .o | для объектного файла
| .a | для архивного файла
|
Обращение к программам:
gcc [ option | filename ]...
++ [ option | filename ]...
Значение некоторых опций:
-c | создать только объектный файл (source.o)
| -o file | создать загрузочный
(выполняемый) файл с именем file, (по умолчанию создается файл
с именем a.out)
| -llibrary | при редактировании
связей использовать библиотеку liblibrary.a
| -shared
| создать share-объект (разделяемый), который можно
использовать для сборки с другими объектами и формирования
исполняемого кода
| -Wl,option | передать опции
option редактору связей
| -Idir |
добавить каталог dir в список поиска каталогов, содержащих
include_файлы (*.h)
| -Ldir |
добавить каталог dir с библиотеками в список поиска
библиотек через опцию -l
| -Dmacro[=defn] |
передать препроцессору значение macro[=defn] | -g
| создать информацию для отладки, в
native-форматах: stabs, COFF, XCOFF, или DWARF,
которую можно использовать при работе с gdb, GNU
Debugger. Рекомендуемые форматы: gstabs+',
`-gstabs', ` -gxcoff+', `-gxcoff', `-gdwarf+', или `-gdwarf'
| -pg | генерация дополнительного кода (по
умолчанию записывается в файл gmon.out) для
анализа создаваемой программы с помощью gprof |
Компилятор g77
- программа компиляции с языка Fortran77.
Исходные файлы:
source.f,source.for, source.FOR
Компиляторы С и g77 интегрированы.
g77 - программа, вызывающая gcc с опциями, позволяющими распознавать код
Fortran (ANSI FORTRAN 77, F77)
Обращение:
g77 [option | filename]...
Значение некоторых опций:
-c | создать только объектный файл
(source.o) из исходного ( source.f, .source.for, source.FOR )
| -o file | создать загрузочный файл с
именем file (по умолчанию создается файл с именем a.out)
| -llibrary | использовать библиотеку
liblibrary.a при редактировании связей
| -Idir | добавить
каталог dir в список поиска каталогов, содержащих include-
файлы (*.h)
| -Ldir | добавить директорию dir в список
поиска библиотек по ключу -l
| -O | включить
оптимизацию
| -g | создать отладочную информацию
для работы с отладчиком |
8.2 Редактор связей ld
Программа создания исполняемых модулей из объектных модулей, библиотек,
перемещаемых данных, динамических библиотек:
/usr/bin/ld
Обращение:
ld [options] objfile...
Значение некоторых опций:
-o output | определяет имя исполняемого файла (по
умолчанию используется a.out )
| -Lsearchdir | добавляет путь searchdir
поиска библиотек
| -Olevel | задает уровень level
оптимизации выходного файл, где level есть число,
соответствующее выбранному уровню оптимизации
| -lname | -
добавляет библиотеку libname.a (необходимую для создания
исполняемого модуля )
| -r | для создания
перемещаемого модуля | -shared | создать
shared-библиотеку
|
Пример:
ld -o output /lib/crt0.o hello.o -lc
В результате загрузчик создает выполнимый файл output, для создания
которого подключаются библиотека libc.a и объектные модули
/lib/crt0.o hello.o
8.3 Команды ar, ranlib, nm, ldd, strings
Команда архивации ar
- создание, модификация, извлечение данных архива, в том числе и библиотек.
Расположение: /usr/bin/ar
Обращение:
ar [-X32_64] [-]options[mod [relpos] [count]] archive [member...]
Значение некоторых опций:
c - создать архив
a - добавить новые файлы после существующих
b - добавить новые файлы перед существующими
d - стереть модуль в архиве
q - добавить новые файлы в конец архива
r - вставить новый файл с замещением существующего
t - вывести таблицу содержимого архива
x - извлечь файл из архива
Команда ranlib
- генерация индексов содержимого архива.
Расположение: /usr/bin/ranlib
Созданный список индексов хранится в этом же архиве.
Обращение:
ranlib [-v|-V] archive
Команда nm
-получение списка символов в архиве объектных файлов.
Расположение: /usr/bin/nm
Обращение:
nm [options] [objfile...]
Пример:
nm -n libtiff.a | less
получить список файлов библиотеки, отсортированных по адресам.
Команда ldd
- просмотр списка разделяемых библиотек, используемых программой.
Команда strings
- вывод на экран дисплея печатаемых (printable) строк исполняемого файла:
strings [option(s)] [file(s)]
7.4 Утилита gprof
Профилирование программ предоставляет простой и удобный механизм
исследования выполнения программы с целью ее оптимизации. В ОС Linux для
этих целей используется Unix утилита gprof - построение графа выполнения
программы.
Для каждой функции граф вызовов показывает: какие функции ее вызывали,
какие функции вызывала она сама и сколько раз; а также, - сколько времени было
затрачено на выполнение подпрограмм в каждой функции. Программа должна
компилироваться с опцией -pg.
Для построения профиля:
Откомпилировать программу в режиме профилирования
cc -pg -o prog prog.c
f77 -pg -o prog prog.f
Запустить программу на исполнение.
После окончания выполнения программы будет создан файл gmon.out.
Запустить команду gprof для генерации отчета
gprof prog
Более подробная информация:
gprof --help
man gprof
8.5 Отладчики
GDB символьный отладчик GNU
Отладчик GDB, или GNU Debugger, ориентирован на языки программирования C
и C++, поддерживает Java, Chill, ассемблер, Модула-2, Фортран, может работать
с Паскалем.
Большую помощь отладчик может оказать в тех случаях, когда происходит
прерывание программы по неизвестной причине с диагностикой - Abort (core
dumped).
Cхема процесса отладки программы:
Компиляция программы с созданием отладочной информации
>gcc -g -o имя_файла имя_файла.c
>g77 -g -o имя_файла имя_файла.f
Вызов отладчика
>gdb [опции] [имя_файла | ID процесса]
Размещение точки прерывания ( в среде gdb подсказка: (gdb) )
(gdb)break
Запуск задачи в среде отладчика
(gdb)run
Вывод значений переменных на экран
(gdb)print var
Печать массивов на экране (с диапазоном элементов)
(gdb)print vec(5:13)
Выход из программы gdb
(gdb)quit
При компиляции программы для отладки с ключом -g в объектном файле
генерируется отладочная информация. Можно при компиляции добавлять и ключ
-O, но нежелательно, поскольку оптимизация перестраивает исходный код и
нумерация строк изменится.
Вывод на экран списка опций:
>gdb -help
Можно запустить gdb без вывода пугающего начального сообщения,
предупреждающего об отсутствии гарантии на него, указав опцию -silent:
>gdb -silent
Подробная справочная информация находится во внутреннем help файле
программы:
(gdb) help | короткий список
именованных классов команд
| (gdb) help команда | справка по
указанной команде
| (gdb) show | описание
состояния самого gdb; можно изменить почти
все, что показывает show, используя соответствующую
команду set.
| (gdb) help info | справка о выводе
информации о состоянии процессов,
памяти, регистров результате выполнения команд
| (gdb) apropos
арг | команда apropos производит поиск по регулярному
выражению, заданному в арг, во всех командах gdb и их
документации.
| (gdb) complete арг | команда complete
перечисляет все возможные завершения
для начала команды; арг - задание начала
команды
|
Названия команд могут быть сокращены. Введение пустой строки с Enter
означает повтор команды. Нажатие клавиши TAB позволяет дополнить
оставшуюся часть слова команды.
Если при запуске gdb имя исполняемого файла не было указано, то указать его
можно командой file в среде отладчика:
(gdb)file имя_файла
Команда list пролистает на экране 10 строк исходного кода:
(gdb)list
Если никаких точек останова не определено, то программа выполнится с
сообщением отладчика:
(gdb) run
Starting program: test
Program exited normally
(gdb)
Остановка программы до ее завершения для выяснения причины нарушений в ее
работе производится на размещенных в программе точках прерывания.
Разрешается устанавливать любое число точек прерывания в одном и том же
месте программы.
Имеется три типа точек останова:
Breakpoints | остановка происходит, когда выполнение доходит
до определенной строки, адреса или
процедуры/функции
| Watchpoints | точки просмотра. Срабатывает, если программа
обратилась к определенной переменной - либо считала
ее значение, либо изменила его.
| Catchpoints | точки перехвата. Приостановка происходит при определенном
событии (например, получение сигнала).
|
(gdb) break - установить точку останова на текущей строке
(gdb) break function - точка останова на входе в функцию function
(gdb) b номер_строки - краткий вариант команды; остановка на строке
(gdb) b *адрес - полезно для тех частей программы, которые не имеют
отладочной информации - указывается адрес точки
останова
(gdb) b [arg] if условие - arg может быть и номер_строки, и *адрес, и именем
функции и т.д. Останов произойдет
при выполнении условия
(true)
Можно оперировать также и следующими контрольными точками:
-наблюдения - rwatch, awatch
-наблюдения - rwatch, awatch
rwatch - выполнение приостанавливается каждый раз, когда программа
считывает значение указанной переменной
awatch - выполнение приостанавливается каждый раз, когда программа
обращается к указанной переменной, как для считывания, так и для записи
- перехвата - catch, tcatch
Справка по команде break (и аналогично для всех типов прерываний):
(gdb) help break
Информация об установленных точках:
(gdb) info breakpoints
(gdb) info break
(gdb) info watchpoints
(gdb) maint info breakpoints - для отображения точек,
которые gdb сам иногда устанавливает в программе для специальных целей,
таких, как правильная обработка longjmp (в программах на Си). Этим внутренним
точкам останова присваиваются отрицательные номера, начиная с -1;
info breakpoints не отображает их.
Предусмотрены операции с установленными точками:
clear, delete | без аргументов и с аргументами
| disable, enable | отключить/включить точку
| condition | задание условия останова
| ignore | устанавливает счетчик игнорирования точки останова
|
После размещения точек останова, программа запускается командой:
(gdb) run - запуск программы в среде отладчика (сокращенно - r)
(gdb) run > output_file - запуск с перенаправлением
Далее выполнение программы приостанавливается на отмеченной точкой
прерывания строке с сообщениями:
- причина прерывания
- номер строки, где это произошло
- текст этой строки
Есть возможность подать любой точке останова (наблюдения или перехвата)
набор команд, которые будут выполняться при остановке программы. Команды
заключаются в скобки операторов commands и end:
(gdb) break foo if x>0
(gdb) commands
(gdb) silent
(gdb) printf "x is %d\n",x
(gdb) cont
(gdb) end
| вывод величины x на входе в foo,
когда x положительна; без вывода сообщения
об остановке на точке.
|
После принудительного останова программы применяется пошаговое
выполнение с помощью команд:
(gdb) step - шаг по инструкциям с заходом внутрь функций.
(gdb) next - шаг по инструкциям, но вызовы функций, которые появляются
внутри строки кода, выполняются без остановки.
Команды продолжения:
continue - до следующей точки останова
finish - до момента выхода из текущей процедуры
until - пока не будет достигнута строка с определенным номером
stepi - выполняется только одна инструкция в строке
nexti - аналогична stepi, но вызовы процедур трактуются как одна
инструкция
Команды проверки состояния процессов, переменных, памяти и т.д:
- Информация о состоянии программы: выполняется она или нет, каким
процессом она является и почему остановлена:
(gdb) info program
- Исследование стека; арг может быть либо адресом, либо номером:
(gdb) frame арг
- Получение информации:
(gdb) info frame
- вывод текущего значения переменной (выражения).
(gdb) print выражение
Вместо многократного ввода команды print полезно
использовать команду display.
- аргумент (переменная или выражение) станет выводиться при каждой
остановке программы (при попадании на точку останова, при пошаговом
выполнении командами step и next):
(gdb) display аргумент
Выход из программы:
(gdb) quit или Ctrl+c
Замечания
Для Паскаля
В командах gdb имена функций и переменных указываются в верхнем регистре.
Для Фортрана
Чтобы увидеть исходный код на экране, предлагается:
-
- перед компиляцией назвать головную процедуру именем MAIN__
- - компиляцию проводить с той же опцией -g
- - находясь в среде отладчика, первую точку прерывания поставить на первую
строку:
- (gdb)break MAIN__
- - язык программирования опознается автоматически, о чем будет выдано
сообщение.
Не рекомендуется принудительно выставлять рабочий язык для отладчика, хотя
для этого и существует команда
- (gdb)set language
Отладчик с визуальным отображением данных DDD
DDD, или Data Display Debugger - графический интерфейс для работы
с целым набором консольных отладчиков (gdb, dbx, ladebug, xdb, jdb,
perl и т.д). Для его работы необходима среда X-window и компиляция программы
с такой же опцией -g для создания отладочной информации.
По умолчанию настроен на gdb, что можно изменять в настройках программы.
Запуск командой:
ddd [your_program][&]
Отладчик начинает работать с открытия основного окна, в которое загружается
код программы.
Если при работе с фортран-программами в основном окне не появится текст
головной программы, в верхнем окне следует исправить имя головной функции
на MAIN__.
DDD - это и традиционные функции отладки, имеющиеся в подчиненных
отладчиках, и некоторые дополнительные возможности: графическое
отображение структур данных, автоматическое переключение между многими
файлами с исходным кодом и удобный просмотр всего кода программы. DDD
позволяет с помощью мыши расставлять точки останова и просматривать
значения переменных наведением на них указателя мыши. В нижнем окне
остается доступным командный режим работы с отладчиком.
DDD обрабатывает данные в массиве, обращается к Gnuplot и добавляет к окну
графика Gnuplot свою полоску меню, которая позволяет изменять внешний вид
картинки. Вместе с Gnuplot DDD строит графики двух типов числовых значений:
одномерные массивы изображаются в двумерном пространстве; двумерные
массивы изображаются в трехмерном пространстве.
|