В.В.Галактионов, Т.М.Голоскокова, Н.И.Громова, А.В.Гусев, В.В.Мицын, Ж.Ж.Мусульманбеков, И.К.Некрасова, В.Д.Позе, А.В.Сергеев, Е.А.Тихоненко
РУКОВОДСТВО ДЛЯ ПОЛЬЗОВАТЕЛЕЙ LINUX КЛАСТЕРА ЛИТ ОИЯИ
Дубна 2004
От редактора
1 Структура Linux кластера и базовое программное обеспечение
1.1 Интерактивный кластер
1.2 Вычислительные фермы
1.3 Серверы дискового пространства
1.4 Вспомогательные серверы
1.5 Базовое программное обеспечение

2 Начальные рекомендации пользователям
2.1 Как стать пользователем
2.2 Ваша "учетная запись" (account) и пароль
2.3 Безопасность
2.4 Пакетная обработка счетных задач
2.5 Дисковое пространство для пользователей
2.6 AFS и пользовательские файлы и каталоги
2.7 Электронная почта
2.8 Русификация

3 Файловая система AFS

4 Рекомендации для пользователей параллельного вычислительного кластера
4.1 Использование команды qsub
4.2 Описание параметров
4.3 Контроль над исполнением задачи
4.4 Результаты выполнения задачи в пакетной обработке

5 Перечень и краткое описание основных команд при работе в операционной системе Linux
5.1 Простейшие действия
5.2 Стандартные команды. Информация по системе команд
5.3 Работа с сетью
5.4 Некоторые команды администрирования
5.5 Контроль процессов
5.6 Встроенные в Linux программные утилиты и языки

6 Midnight Commander

7 Рекомендуемые редакторы
7.1 Текстовый редактор pico
7.2 Краткое описание редактора vi/vim

8 Некоторые средства разработки программ
8.1 Текущие версии компиляторов C и g77
8.2 Редактор связей ld
8.3 Команды ar, ranlib, nm, ldd, strings
8.4 Утилита gprof
8.5 Отладчики GDB, DDD

9 Графические пакеты на Linux кластере
9.1 ImageMagick. Просмотр и обработка изображений
9.2 Chimera
9.3 Системы визуализации массивов числовой информации (научных данных)
Grace
IRIS Explorer
OpenDX (Data Explorer)

10 СУБД MySQL
10.1 Регистрация пользователей и создание базы данных
10.2 Соединение с сервером MySQL
10.3 Примеры работы с MySQL
10.4 Основные команды
10.5 Подключение к базе данных MySQL с использованием PHP

11 Изменения в работе с PHP-программами

12 Сведения об информационном сервере linux4u

13 Литература о Linux на русском языке

14 Сравнительное сопоставление прикладных пакетов в Windows и Linux

файлы для печати:
(.doc) (.zip)


На главную

November 23, 06:53:39

 

chapter_8

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