ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Раздел 2. Отладка компьютерных программ Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем Юрьевич 1 © Кафедра.

Презентация:



Advertisements
Похожие презентации
Практическое занятие Вводное занятие Преподаватели: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Advertisements

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Работа с ОС GNU/Linux в терминальных классах Кафедры ВС Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем.
Об отладке программ МО ВВС ИВМ и МГ СО РАН Городничев Максим Александрович.
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Лекция 7. Структура языка С/С++. Операторы ветвления: условный оператор if. Полное ветвление. Неполное ветвление. Оператор множественного выбора switch.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.

Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Отладка программы. Классификация ошибок 1.синтаксические; 2. ошибки времени выполнения; 3.алгоритмические. Синтаксические ошибки, обнаруживает компилятор,
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 1 Процедурный подход к разработке программ (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем,
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
ПРАКТИКУМ по предмету: Информатика Алгоритмический язык Турбо-Паскаль.
Процедурный подход к программированию Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Урок-обобщение (7 класс – алгебра) МОУ "СОШ 45 г. Чебоксары" Кабуркина М. Н.1.
Лекция 1 Раздел 1 Windows Phone Темы раздела 3 Windows Phone Устройство на платформе Windows Phone 4.
Знакомство с IDE Pascal. Этапы решения задачи на компьютере : 1. Постановка реальной задачи и ее содержательный анализ 2. Создание модели ( формализация.
Программирование на Pascal. Темы Повторение. Составные логические условия Повторение. Составные логические условия Повторение. Составные логические условия.
1. Определить последовательность проезда перекрестка
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Практическое занятие Ввод-вывод информации Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Транксрипт:

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Раздел 2. Отладка компьютерных программ Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем Юрьевич 1 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем – Жизненный цикл программного обеспечения – Отладка программ Инструменты отладки программ – утилиты сравнения исходного кода (diff) и системы управления версиями – сообщения компилятора – утилиты расширенной проверки синтаксиса и логики (lint) – программные отладчики – профилировщики 2 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Жизненный цикл программного обеспечения Стандарты жизненного цикла ПО: ГОСТ , ISO/IEC 12207:1995 Формирование требований к АС Разработка концепции АС Техническое задание Эскизный проект Технический проект Рабочая документация Ввод в действие Сопровождение АС. 3 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» (отладка)

Отладка программ Макконнел, С. Совершенный код (Code complete) «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете» "Отладка это процесс определения и устранения причин ошибок. Этим она отличается от тестирования, направленного на их обнаружение..." "В некоторых проектах отладка занимает до 50% общего времени разработки…" "Большинство дефектов " – это "недосмотры и опечатки" В каждой группе есть … программист, бесконечно сражающийся с демоническими компьютерами, таинственными дефектами компилятора, скрытыми дефектами языка…" и "…заколдованным текстовым редактором…" "... Отладка включает в себя поиск дефекта и его исправление. Поиск и понимание дефекта обычно составляют 90% работы..." 4 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Научный метод отладки Сбор данных при помощи повторяющихся экспериментов. Формулирование гипотезы, объясняющей релевантные данные. Разработка эксперимента, призванного подтвердить или опровергнуть гипотезу. Подтверждение или опровержение гипотезы. Повторение процесса в случае надобности. 5 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Метод поиска дефекта, основанный на научном методе 1.Стабилизация ошибки. 2.Определение источника ошибки. a.Сбор данных, приводящих к дефекту. b.Анализ собранных данных и формулирование гипотезы, объясняющей дефект. c.Определение способа подтверждения или опровержения гипотезы, основанного или на тестировании программы или на изучении кода. d.Подтверждение или опровержение гипотезы при помощи процедуры, определенной в п. 2 (с) 3.Исправление дефекта 4.Тестирование исправления Поиск похожих ошибок 6 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Инструменты отладки программ утилиты сравнения исходного кода (diff) системы управления версиями сообщения компилятора утилиты расширенной проверки синтаксиса и логики (lint) программные отладчики профилировщики 7 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Утилиты сравнения исходного кода (diff) В вычислительной технике diff утилита сравнения файлов, выводящая разницу между двумя файлами. Эта программа выводит построчно изменения, сделанные в файле (для текстовых файлов). Современные реализации поддерживают также двоичные файлы. Вывод утилиты называется «diff», или, что более распространено, патч, так как он может быть применён с программой patch. Вывод похожих утилит сравнения файлов также часто называется «diff». 8 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Утилиты сравнения исходного кода (diff) (пример) 9 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int x, y; if(y == 0) x = 10; } scanf("%d",&x); if( x > 5 ) x = 5; printf("x = %d", x); } #include int main() { int x, y; if(y == 0){ x = 10; } scanf("%d",&x); if( x > 5 ) x = 5; printf("x = %d", x); } bad.c good.c

Утилиты сравнения исходного кода (diff) (пример) $ diff –Naur bad.c good.c > good.patch 10 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» --- bad.c :36: good.c :10: ,7 +4,7 { int x, y; - if(y == 0) + if(y == 0){ x = 10; } scanf("%d",&x);

Системы управления версиями Система управления версиями (от англ. Version Control System, VCS или Revision Control System) программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости, возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение и многое другое. Такие системы наиболее широко применяются при разработке программного обеспечения, для хранения исходных кодов разрабатываемой программы. 11 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Типичный порядок работы с системой управления версиями Начало работы с проектом: извлечение рабочей копии проекта или той его части, с которой предстоит работать. Ежедневный цикл работы – Обновление рабочей копии: по мере внесения изменений в проект другими разработчиками рабочая копия на компьютере разработчика стареет, расхождение её с основной версией проекта увеличивается. Обновление позволяет синхронизировать рабочую копию и текущую версию проекта. – Модификация проекта: разработчик модифицирует проект, изменяя входящие в него файлы в рабочей копии в соответствии с проектным заданием. Эта работа производится локально и не требует обращений к серверу VCS. – Фиксация изменений: Завершив очередной этап работы над заданием, разработчик фиксирует (commit) свои изменения, передавая их на сервер. Фиксации присваивается номер, по которому внесенные изменения будут доступны в дальнейшем. 12 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Существующие системы управлениями версиями CVS (Concurrent Versions System, "Система Одновременных Версий") - одна из первых широко распространенных свободных централизованных систем управления версиями. Subversion (также известная как "SVN") - свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet Inc. Subversion реализует все основные функции CVS и свободна от ряда недостатков последней. Используется многими сообществами разработчиков открытого программного обеспечения, в их числе: Apache, GCC, Python, Ruby, Mono, FreeBSD. Git - свободная распределённая система управления версиями файлов. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux. Проекты, использующие Git: ядро и некот. дистрибутивы Linux, Drupal, GNU Core Utilities, Wine, Chromium, jQuery. 13 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Хостинг систем управления версиями SourceForge (Subversion, Git, Mercurial, Bazaar, CVS) Google Code (Subversion, Git и Mercurial) GitHub (Git) Codebase Tigris.org 14 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Компилятор – Программа, переводящая текст программы на языке высокого уровня в эквивалентную программу на машинном языке. Компиляция – трансляция программы на язык, близкий к машинному, и последующая её компоновка. – трансляция программы, составленной на исходном языке, в объектный модуль (осуществляется компилятором) и последующая её компоновка в готовый к использованию программный модуль. 15 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Процесс преобразования исходных кодов в машинные кода из исходного 16 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» prog1.o компиляция и компоновка … …… program (исполняемый (бинарный) файл) Редактирова ние связей (linking) prog1.cprog1.i препроцессорная обработка progN.oprogN.cprogN.i

Советы по устранению синтаксических ошибок Внимательно читайте сообщения, выводимые компилятором! 17 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Советы по устранению синтаксических ошибок 18 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #iclude int main() { int x;... $ gcc -o error1 error1.c error1.c:1: error: invalid preprocessing directive #iclude error1.c: In function main: error1.c:6: warning: incompatible implicit declaration of built-in function scanf error1.c:10: warning: incompatible implicit declaration of built-in function printf

Советы по устранению синтаксических ошибок Не полагайтесь на номера строк в сообщениях компилятора. компилятор Си является однопроходным. Он читает программу сверху вниз и никогда не возвращается назад. Поэтому иногда он обнаруживает ошибку в строке, располагающейся после той, что действительно содержит ошибку. Если компилятор сообщил о загадочной синтаксической ошибке, изучите фрагменты, расположенные прямо перед ошибкой. Обнаружив истинный дефект попробуйте определить почему компилятор указал не на ту команду. Понимание особенностей компилятора поможет находить дефекты в будущем. 19 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Советы по устранению синтаксических ошибок Не полагайтесь на номера строк в сообщениях компилятора. 20 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int x; scanf("%d",&x); if( x > 5 ) { x = 5; printf("x = %d", x); } $ gcc -o error1 error1_1.c error2.c: In function main: error2.c:11: error: expected declaration or statement at end of input

Советы по устранению синтаксических ошибок Не доверяйте второму сообщению об ошибке Некоторые компиляторы обнаружив множественную ошибку выводят десятки бессмысленных сообщений о других ошибках 21 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Советы по устранению синтаксических ошибок Не доверяйте второму сообщению об ошибке 22 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int x, y; if(y == 0) x = 10; } scanf("%d",&x); if( x > 5 ) x = 5; printf("x = %d", x); }

Советы по устранению синтаксических ошибок Не доверяйте второму сообщению об ошибке 23 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» $ gcc -o error2 error2.c error2.c:10: error: expected declaration specifiers or... before string constant error2.c:10: error: expected declaration specifiers or... before & token error2.c:10: warning: data definition has no type or storage class error2.c:10: error: conflicting types for scanf error2.c:10: note: a parameter list with an ellipsis cant match an empty parameter name list declaration error2.c:11: error: expected identifier or ( before if error2.c:15: error: expected declaration specifiers or... before string constant error2.c:15: error: expected declaration specifiers or... before x error2.c:15: warning: data definition has no type or storage class error2.c:15: error: conflicting types for printf error2.c:15: note: a parameter list with an ellipsis cant match an empty parameter name list declaration error2.c:16: error: expected identifier or ( before } token

Советы по устранению синтаксических ошибок Разделение программы на части особенно эффективно при поиске синтаксических ошибок. Если вы столкнулись с неуловимой синтаксической ошибкой закомментируйте часть кода и перекомпилируйте программу. Если ошибка исчезнет ее нужно искать в этой части кода 24 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int x, y; //if(y == 0) // x = 10; // } scanf("%d",&x); if( x > 5 ) x = 5; printf("x = %d", x); }

Отладка с помощью отладочных сообщений Отладка программы требует полного понимания процессов, происходящих в процессе ее выполнения. Одним из простейших в вместе с тем эффективных инструментов, которые позволяют отследить и лучше понять работу программы является журналирование программы. Журналирование предполагает вывод на экран (или в файл) информации о событиях, возникающих в программе, и промежуточном состоянии программы, например: факт вызова функции и данные о ее аргументах, содержимое переменных и т.п. 25 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Использование отладочных сообщений Отладочные сообщения должны находиться в ключевых узлах программы и позволять отследить ход ее выполнения. В случае поиска дефекта необходимо размещение дополнительных выводов, позволяющих детализировать информацию о потенциально дефектных фрагментах кода. Необходимо соблюдать баланс между количеством выводимой информации и ее качеством, так как при визуальном осмотре важная информация может "утонуть" в потоке ненужных сообщений. 26 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Технические аспекты, связанные с отладочными сообщениями Отладочные сообщения могут сами по себе содержать ошибки. Вывод на экран буферизируется построчно, т.е. сообщения лежат в буферах до тех пор, пока не обнаружен символ '\n' (Enter – перевод каретки). В случае фатальной ошибки, приводящей к аварийному завершению программы (наиболее распространена ошибка сегментации (Segmentation Fault) отладочные сообщения, находящиеся в буферах, не будут выведены. Часто бывает удобно иметь возможность оперативно отключать и включать отладочные выводы. 27 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Эффективная реализация журналирования #ifndef DEBUG_H #define DEBUG_H #include #define PDEBUG(lev,fmt,args...) #ifdef DEBUG #undef PDEBUG #define PDEBUG(lev,fmt,args...) \ if( lev

Применение журналирования #include #define DEBUG 100 #include "debug.h" int main() { int i = 0; while( i < 5 ){ PDEBUG(1, "i = %d", i); i++; } 29 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» $./debug main: 11: i = 0 main: 11: i = 1 main: 11: i = 2 main: 11: i = 3 main: 11: i = 4

Применение журналирования #include #define DEBUG 0 #include "debug.h" int main() { int i = 0; while( i < 5 ){ PDEBUG(1, "i = %d", i); i++; } 30 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» $./debug

Пример отладки #include int main() { int i, x, sum; scanf("%d",&x); while( i

Журналирование. Шаг 1. #include #define DEBUG 100 #include "debug.h" int main() { int i, x, sum; printf("Enter x: "); scanf("%d",&x); PDEBUG(1,"sum = %d\n",sum); while( i

Журналирование. Шаг 1. (результаты) Enter x: 10 main: 9: sum = main: 11: sum = main: 11: sum = main: 11: sum = main: 11: sum = main: 11: sum = main: 11: sum = main: 11: sum = main: 11: sum = Ctrl + C – принудительное завершение программы Вывод: необходима инициализация sum 33 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Журналирование. Шаг 2. #include #define DEBUG 100 #include "debug.h" int main() { int i, x, sum = 0; printf("Enter x: "); scanf("%d",&x); PDEBUG(1,"sum = %d\n",sum); while( i

Журналирование. Шаг 2. (результаты) $./sum_ex_dbg_1 Enter x: 10 main: 9: sum = 0 main: 11: sum = 0 main: 11: sum = main: 11: sum = main: 11: sum = main: 11: sum = Ctrl + C – принудительное завершение программы Вывод: необходимо добавить проверку счетчика i 35 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Журналирование. Шаг 3. #include #define DEBUG 100 #include "debug.h" int main() { int i, x, sum = 0; printf("Enter x: "); scanf("%d",&x); PDEBUG(1,"sum = %d, i=%d\n",sum,i); while( i

Журналирование. Шаг 3. (результаты) $./sum_ex_dbg_2 Enter x: 10 main: 9: sum = 0 main: 11: sum = 0, i = main: 11: sum = , i = main: 11: sum = , i = main: 11: sum = , i = main: 11: sum = , i = main: 11: sum = , i = Ctrl + C – принудительное завершение программы Вывод: необходима инициализация счетчика i 37 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Журналирование. Шаг 4. #include #define DEBUG 100 #include "debug.h" int main() { int i = 0, x, sum = 0; printf("Enter x: "); scanf("%d",&x); PDEBUG(1,"sum = %d, i=%d\n",sum,i); while( i

Журналирование. Шаг 4. (результаты) $./sum_ex_dbg_3 Enter x: 10 sum = 0 sum = 0, i = 0... Ctrl + C – принудительное завершение программы Вывод: счетчик не изменяется. Добавить инкремент. 39 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Журналирование. Шаг 5. #include #define DEBUG 100 #include "debug.h" int main() { int i = 0, x, sum = 0; printf("Enter x: "); scanf("%d",&x); PDEBUG(1,"sum = %d, i=%d\n",sum,i); while( i

Журналирование. Шаг 5. (результаты) $./sum_ex_dbg_4 Enter x: 10 sum = 0 sum = 0, i = 0 sum = 0, i = 1 sum = 1, i = 2 sum = 3, i = 3 sum = 6, i = 4 sum = 10, i = 5 sum = 15, i = 6 sum = 21, i = 7 sum = 28, i = 8 sum = 36, i = 9 sum=45 41 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Журналирование. Шаг 6. (отключение отладки) #include #define DEBUG 0 #include "debug.h" int main() { int i = 0, x, sum = 0; printf("Enter x: "); scanf("%d",&x); PDEBUG(1,"sum = %d, i=%d\n",sum,i); while( i

Журналирование. Шаг 6. (результаты) 43 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» $./sum_ex_fix1 Enter x: 10 sum=45

Программные отладчики Современные отладчики непрерывно совершенствуются. Они позволяют: прерывать выполнение программы на некоторой строке или при достижении конкретной строки n раз, а также при изменении некоторой переменной или присвоении ей конкретного значения; возобновлять выполнение программы; производить трассировку программы, т.е. выполнять ее пошагово; 44 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Программные отладчики (2) выполнять исследование данных, в частности анализировать значения переменных в любой момент выполнения программы; изменять данные, в частности значения переменных; отображать ход выполнения программы с привязкой к исходным кодам; просматривать цепочку вызовов функций, т.е. содержимое стека вызовов; подключаться к выполняющейся программе; 45 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Пример отладки #include int main() { int i, x, sum; scanf("%d",&x); while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Компиляция с флагом "-g" $ gcc -o sum_ex sum_ex.c –g Запуск отладчика $ gdb sum_ex GNU gdb (GDB) 7.2-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see:... Reading symbols from sum_ex...done. (gdb)

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Пробный запуск программы (команда " r "): (gdb) r Starting program: sum_ex Enter x: Ctrl + C – принудительное завершение программы Program received signal SIGINT, Interrupt. main () at sum_ex.c:10 10 while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Проверка значений x и i while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Просмотр исходного кода программы в отладчике... (gdb) l main 1#include 2 3int main() 4{ 5 int i, x, sum; 6 7 printf("Enter x: "); 8 scanf("%d",&x); 9 10 while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Установка точки останова на функции main для пошаговой отладки (gdb) b main Breakpoint 1 at 0x804841d: file sum_ex.c, line 7. Перезапуск программы заново (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: sum_ex Breakpoint 1, main () at sum_ex.c:7 7 printf("Enter x: ");

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Инициализация переменной i (gdb) inspect i $3 = (gdb) set var i = 0 (gdb) inspect i $4 = 0 Продолжение работы программы: (gdb) c Continuing. Enter x: 10 …

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Ctrl + C – принудительное завершение программы Program received signal SIGINT, Interrupt. main () at sum_ex.c:10 10 while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Проверка есть ли инкремент i в цикле (gdb) l main 1#include 2 3int main() while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Инкремент отсутствует. Требуется модифицировать программу, добавив в нее инициализацию i и ее инкремент в теле цикла. Для этого необходимо завершить отладочную сессию (gdb) q A debugging session is active. Inferior 1 [process 15015] will be killed. Quit anyway? (y or n) y

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Измененная программа #include int main() { int i = 0, x, sum; printf("Enter x: "); scanf("%d",&x); while( i

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Компиляция программы и ее запуск gcc -o sum_ex_gdb1 sum_ex_gdb1.c -g $./sum_ex_gdb1 Enter x: 10 sum= ВЫВОД: Программа больше не зацикливается, однако результат очевидно неправильный. Требуется продолжить отладку.

Применение отладчика. Шаг © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Запуск отладчика $ gdb sum_ex_gdb1... (gdb) b main Breakpoint 1 at 0x804841d: file sum_ex_gdb1.c, line 5. (gdb) r Starting program: sum_ex_gdb1 Breakpoint 1, main () at sum_ex_gdb1.c:5 5 int i = 0, x, sum; (gdb) n 7 printf("Enter x: "); (gdb) n 8scanf("%d",&x);

Применение отладчика. Шаг 12. (продолжение) 59 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»... 7 printf("Enter x: "); (gdb) n 8 scanf("%d",&x); (gdb) n Enter x: 5 10 while( i

Критика программных отладчиков "Интерактивный отладчик великолепный пример инструмента, который не нужен: он поощряет хакерство методом проб и ошибок, а не систематичное проектирование и позволяет непрофессионалам скрыть свою некомпетентность." Харлан Миллз, IBM research fellow and chief programmer «... I don't like debuggers. Never have, probably never will. I use gdb all the time, but I tend to use it not as a debugger, but as a disassembler on steroids that you can program... I happen to believe that not having a kernel debugger forces people to think about their problem on a different level than with a debugger... Without a debugger, you tend to think about problems another way...» Линус Торвальдс, создатель ядра Linux 60 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Критика программных отладчиков (2) " … Наш личный выбор стараться не использовать отладчики, кроме как для просмотра стека вызовов или же значений пары переменных …. очень легко потеряться в деталях сложных структур данных и путей исполнения программы; мы считаем пошаговый проход по программе менее продуктивным, чем усиленные размышления и код, проверяющий сам себя в критических точках… Слепое блуждание в отладчике, скорее всего, непродуктивно. Полезнее использовать отладчик, чтобы выяснить состояние программы, в котором она совершает ошибку, а затем подумать о том, как такая ошибка могла возникнуть...." Керниган, Б., Пайк Р. Практика программирования 61 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

В защиту программных отладчиков "… Любой эффективный инструмент можно использовать правильно и неправильно. Отладчик не исключение... Отладчик не заменит грамотного рассуждения. Но иногда никакие мысли не заменят хороший отладчик. Наиболее эффективная комбинация ясный ум и хороший отладчик..." Макконнел, С. Совершенный код. 62 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Стандарт оформления кода (Code convention) Стандарт оформления кода (стандарт кодирования, стиль программирования) (англ. coding standards, coding convention или programming style) – набор правил и соглашений, используемых при написании исходного кода на некотором языке программирования. Наличие общего стиля программирования: позволяет избежать синтаксических и смысловых ошибок; упрощает поиск синтаксических ошибок; облегчает понимание и поддержание исходного кода, написанного больше чем одним программистом. 63 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Существующие стандарты оформления кода на языке Си C Programming language (K&R) [5] Linux Kernel Coding Style [6] GNU Coding Standards [7] Ganssle Group's Firmware Development Standard Netrino Embedded C Coding Standard Micrium C Coding Standard … 64 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Соглашение об оформлении кода на языке Си, разрабатываемого в рамках курсов "Программирование" и "Языки программирования" Отступы Расположение фигурных скобок Имена переменных Комментарии 65 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Отступы ( используются для форматирования исходного кода программы применяются для улучшения читабельности. предназначены только для программистов компилятор языка Си игнорирует такие разделители, как пробел (Space), табуляция (Tab) и перевод на новую строку (Enter). 66 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Отступы (правила использования) Для формирования отступов используется табуляция (клавиша Tab) Каждый новый блок операторов {…} увеличивает количество отступов на один: for ( i=0 ; i < 10; i++ ){ x = i*i; if( x > 10 ){ z = z + 1;... } y = x – 1; } 67 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Отступы (пример) int main() {... while (x < y) { x *= 2; f = func(x); if (f > 0){ count++; printf("f(%d) = %f\n", x, f); } else count--; } printf("count=%d\n", count);... } 68 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Расположение фигурных скобок ( Открывающаяся фигурная скобка располагается на одной строке с циклическим оператором или оператором ветвления. Закрывающаяся – на новой строке: for ( i=0 ; i < 10; i++ ){... } 69 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Расположение фигурных скобок (Исключение 1) Для функций открывающаяся фигурная скобка располагается на новой строке: int main() {... } 70 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Расположение фигурных скобок (Исключение 2) Для циклов с постусловием и для конструкции ветвления с оператором else закрывающаяся фигурная скобка располагается не в новой строке: if( условие ){... } else do {... } while( условие ); 71 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Имена переменных Имена переменных должны отражать их предназначение Длина имени переменной должна быть не более символов для сохранения читабельности кода. Для переменных со сложным именем предпочтительным является вариант first_left_counter, а не FirstLeftCounter. Для счетчиков в циклах допускается применять простые имена, например i, j. 72 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Комментарии Комментарии являются признаком хорошего тона при написании программ. Однако существует опасность создания слишком подробных комментариев. Поэтому желательно придерживаться следующих правил: – не следует объяснять КАК работает код, необходимо пояснить ЧТО (какую функцию) он должен делать; – аккуратно написанный код говорит сам за себя, с другой стороны не стоит тратить время на то чтобы объяснить плохо написанный код; 73 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

ИТОГ Описан жизненный цикл программы и место отладки в нем. Рассмотрено применение существующих инструментов отладки программ, в частности: – утилиты сравнения исходного кода diff; – систем управления версиями; – сообщений компилятора GCC; – программного отладчика GDB. Представлено соглашение об оформлении кода на языке Си, разрабатываемого в рамках курсов "Программирование" и "Языки программирования". 74 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Литература 1)Керниган, Б., Пайк Р. Практика программирования, Вильямс, 2004, 288 с. 2)Макконнел, С. Совершенный код. Мастер класс / Пер. с англ. – М.:Издательско-торговый дом "Русская редакция"; СПб.:Питер, – 896 с.: ил. ISBN , ) 4) 5)Kernigan, B.W., Ritchie D.M. The C programming Language // Prentice-Hall, – ISBN )Torvalds L. Linux Kernel Coding Style // 7)GNU Coding Standards // /standards/standards.html#Syntactic-Conventionshttp:// /standards/standards.html#Syntactic-Conventions 75 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»