Процесс поиска и исправления ошибок в программе это

Как называется процесс исправления ошибок в программе, при этом цель исправить все ошибки не ставится? — ответ на тест

·    0

Вопрос: Как называется процесс исправления ошибок в программе, при этом цель исправить все ошибки не ставится? Ответ: отладка.

Ответы на тесты

Информатика — ответы на вопросы тестаКак называется процесс исправления ошибок в программе, при этом цель исправить все ошибки не ставится? — ответ на тест

про­цесс по­ис­ка, ло­ка­ли­за­ции и ис­прав­ле­ния оши­бок в ком­пь­ю­тер­ной про­грам­ме. На всех эта­пах раз­ра­бот­ки про­грамм­но­го обес­пе­че­ния О. п. тес­но свя­за­на с тес­ти­ро­ва­ни­ем про­грамм. В про­цес­се тес­ти­ро­ва­ния (напр., с ис­поль­зо­ва­ни­ем спец. по­доб­ран­ных на­бо­ров ис­ход­ных дан­ных) мо­гут дос­ти­гать­ся та­кие со­стоя­ния про­грам­мы, в ко­то­рых фик­си­ру­ют­ся рас­хо­ж­де­ния с за­дан­ны­ми спе­ци­фи­ка­ция­ми. О. п. обес­пе­чи­ва­ет по­иск при­чин этих рас­хо­ж­де­ний (ло­ка­ли­за­цию оши­бок) и со­от­вет­ст­вую­щую кор­рек­ти­ров­ку про­грам­мы. В про­цес­се транс­ля­ции (см. ) и вы­пол­не­ния про­грам­мы (ко­то­рая реа­ли­зу­ет не­ко­то­рую функ­цию) ком­пь­ю­тер, ис­поль­зуя свои ап­па­рат­но-про­грамм­ные ре­сур­сы, до­оп­ре­де­ля­ет (напр., вы­зы­ва­ет из биб­лио­те­ки стан­дарт­ные под­про­грам­мы) час­тич­но оп­ре­де­лён­ную про­грам­мой функ­цию до т. н. то­таль­но оп­ре­де­лён­ной. Т. о. су­дить о пра­виль­но­сти или не­пра­виль­но­сти ре­зуль­та­тов вы­пол­не­ния про­грам­мы мож­но толь­ко срав­ни­вая за­дан­ную спе­ци­фи­ка­цию функ­ции с ре­зуль­та­та­ми её вы­чис­ле­ний, что и осу­ще­ст­в­ля­ет­ся в про­цес­сах тес­ти­ро­ва­ния и от­лад­ки.

Методы отладки программного обеспечения

Отладка программы в любом случае предполагает обдумывание и логическое осмысление всей имеющейся информации об ошибке. Большинство ошибок можно обнаружить по косвенным признакам посредством тщательного анализа текстов программ и результатов тестирования без получения дополнительной информации. При этом используют различные методы:

Метод ручного тестирования. Это — самый простой и естественный способ данной группы. При обнаружении ошибки необходимо выполнить тестируемую программу вручную, используя тестовый набор, при работе с которым была обнаружена ошибка.

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

Данный метод часто используют как составную часть других методов отладки.

Метод основан на тщательном анализе симптомов ошибки, которые могут проявляться как неверные результаты вычислений или как сообщение об ошибке. Если компьютер просто «зависает», то фрагмент проявления ошибки вычисляют, исходя из последних полученных результатов и действий пользователя. Полученную таким образом информацию организуют и тщательно изучают, просматривая соответствующий фрагмент программы. В результате этих действий выдвигают гипотезы об ошибках, каждую из которых проверяют. Если гипотеза верна, то детализируют информацию об ошибке, иначе — выдвигают другую гипотезу. Последовательность выполнения отладки методом индукции показана на рис. 10.3 в виде схемы алгоритма.

Самый ответственный этап — выявление симптомов ошибки. Организуя данные об ошибке, целесообразно записать все, что известно о ее проявлениях, причем фиксируют, как ситуации, в которых фрагмент с ошибкой выполняется нормально, так и ситуации, в которых ошибка проявляется. Если в результате изучения данных никаких гипотез не появляется, то необходима дополнительная информация об ошибке. Дополнительную информацию можно получить, например, в результате выполнения схожих тестов.

В процессе доказательства пытаются выяснить, все ли проявления ошибки объясняет данная гипотеза, если не все, то либо гипотеза не верна, либо ошибок несколько.

По методу дедукции вначале формируют множество причин, которые могли бы вызвать данное проявление ошибки. Затем анализируя причины, исключают те, которые противоречат имеющимся данным. Если все причины исключены, то следует выполнить дополнительное тестирование исследуемого фрагмента. В противном случае наиболее вероятную гипотезу пытаются доказать. Если гипотеза объясняет полученные признаки ошибки, то ошибка найдена, иначе — проверяют следующую причину (рис. 10.4).

Метод обратного прослеживания. Для небольших программ эффективно применение метода обратного прослеживания. Начинают с точки вывода неправильного результата. Для этой точки строится гипотеза о значениях основных переменных, которые могли бы привести к получению имеющегося результата. Далее, исходя из этой гипотезы, делают предложения о значениях переменных в предыдущей точке. Процесс продолжают, пока не обнаружат причину ошибки.

Ме­то­ды О. п. для по­сле­до­ва­тель­ных и па­рал­лель­ных вы­чис­лит. про­цес­сов су­ще­ст­вен­но раз­ли­ча­ют­ся. Для ха­рак­тер­на по­вто­ряе­мость ре­зуль­та­тов при вы­пол­не­нии про­грам­мы с од­ни­ми и те­ми же ис­ход­ны­ми дан­ны­ми. По­это­му для от­сле­жи­ва­ния и кон­тро­ля со­стоя­ний вы­чис­лит. про­цес­са при их от­лад­ке при­ме­ня­ют О. п.: руч­ную, по­ша­го­вую, О. п. по пред­ва­ри­тель­но за­дан­ным т. н. точ­кам ос­та­но­ва и др. При руч­ной О. п. (desk checking) ана­лиз со­стоя­ния вы­чис­лит. про­цес­са (ис­поль­зуя ис­ход­ные дан­ные, при ра­бо­те с ко­то­ры­ми бы­ла об­на­ру­же­на ошиб­ка) вы­пол­ня­ет не­по­сред­ст­вен­но раз­ра­бот­чик на ос­но­ва­нии сво­его опы­та, зна­ний и ин­туи­ции. В про­цес­се по­ша­го­вой О. п. (single-step operation) со­стоя­ние вы­чис­лит. про­цес­са ана­ли­зи­ру­ют по­сле вы­пол­не­ния ка­ж­до­го опе­ра­то­ра (ко­ман­ды) про­грам­мы. О. п. по пред­ва­ри­тель­но за­дан­ным точ­кам ос­та­но­ва про­грам­мы (break­points – мет­кам опе­ра­то­ров) по­зво­ля­ет по­сле вы­пол­не­ния за­дан­но­го за­ра­нее мно­же­ст­ва опе­ра­то­ров при­ос­та­но­вить на вре­мя вы­пол­не­ние про­грам­мы, напр. для про­смот­ра со­стоя­ний вы­бран­ных па­ра­мет­ров. Про­во­дят так­же ана­лиз за­фик­си­ро­ван­ных со­стоя­ний вы­де­лен­ных об­лас­тей па­мя­ти (dump) от­ла­жи­вае­мо­го про­цес­са и его про­грамм­но-ап­па­рат­но­го ок­ру­же­ния. При О. п. об­рат­но­го вы­пол­не­ния (re­versible execution) осу­ще­ст­в­ля­ют ана­лиз вы­чис­лит. про­цес­са на­чи­ная с со­стоя­ния, в ко­то­ром за­фик­си­ро­ва­на ошиб­ка, и за­кан­чи­вая со­стоя­ни­ем, иден­ти­фи­ци­руе­мым как при­чи­на ошиб­ки. Трас­си­ров­ка (tracing) пре­дос­тав­ля­ет для ана­ли­за ин­фор­ма­цию о по­ве­де­нии про­грам­мы, ко­то­рая со­дер­жит в т. ч. дан­ные о по­то­ке управ­ле­ния, т. е. по­сле­до­ва­тель­но­сти со­бы­тий (пу­тей) в про­цес­се вы­пол­не­ния про­грам­мы. Ин­фор­ма­ция, не­об­хо­ди­мая для ана­ли­за О. п., как пра­ви­ло, со­би­ра­ет­ся ав­то­ма­ти­че­ски в про­цес­се тес­ти­рова­ния О. п. и со­хра­ня­ет­ся в фай­ле спец. фор­ма­та (Log – жур­нал). Со­став и струк­ту­ра со­хра­няе­мой в жур­на­ле ин­фор­ма­ции оп­ре­де­ля­ет­ся раз­ра­бот­чи­ком за­ра­нее. Для сбо­ра ин­фор­ма­ции об О. п. час­то при­ме­ня­ют т. н. ин­ст­ру­мен­та­цию от­ла­жи­вае­мой про­грам­мы, т. е. пре­об­ра­зо­ва­ние ис­ход­ной про­грам­мы в функ­цио­наль­но эк­ви­ва­лент­ную, ко­то­рая в за­дан­ных точ­ках рас­ши­ре­на опе­ра­то­ра­ми, фик­си­рую­щи­ми вы­бран­ное под­мно­же­ст­во со­стоя­ний вы­чис­лит. про­цес­са. Ин­ст­ру­мен­та­ция про­грам­мы не на­ру­ша­ет ре­зуль­та­тов вы­чис­ле­ний от­ла­жи­вае­мо­го про­цес­са, но влия­ет на вре­мя его вы­пол­не­ния. Для О. п. по­сле­до­ват. про­цес­сов с не­де­тер­ми­ни­ро­ван­ным ок­ру­же­ни­ем сле­ду­ет соз­да­вать спец. ус­ло­вия (напр., спец. мно­же­ст­ва тес­тов – тес­то­вые на­бо­ры), по­зво­ляю­щие учи­ты­вать все ва­ри­ан­ты не­де­тер­ми­ни­ро­ван­ных вза­и­мо­дей­ст­вий от­ла­жи­вае­мой про­грам­мы с про­грамм­но-ап­па­рат­ным ок­ру­же­ни­ем.

Читать также:  Ошибка 0x80070005, отказано в доступе. Как исправить?

При О. п. сле­ду­ет учи­ты­вать, что по­ря­док вы­пол­не­ния опе­ра­то­ров (ко­манд) ка­ж­до­го из про­цес­сов при па­рал­лель­ных вы­чис­ле­ни­ях со­хра­ня­ет­ся, од­на­ко по­ря­док вы­пол­не­ния опе­ра­то­ров раз­ных про­цес­сов не­де­тер­ми­ни­ро­ван (свой­ст­во ин­тер­ли­вин­га), что мо­жет при­вес­ти к по­лу­че­нию раз­ных ре­зуль­та­тов вы­пол­не­ния па­рал­лель­ных про­цес­сов (на од­ном и том же на­бо­ре дан­ных). Ес­ли па­рал­лель­ные про­цес­сы не­за­ви­си­мы, т. е. со­вме­ст­но не ис­поль­зу­ют об­щих пе­ре­мен­ных и иных об­щих ре­сур­сов, а так­же не об­ме­ни­ва­ют­ся со­об­ще­ния­ми, то их от­лад­ка мо­жет быть све­де­на к от­лад­ке не­сколь­ких па­рал­лель­ных про­цес­сов. Ес­ли вы­ше­пе­ре­чис­лен­ные ус­ло­вия не вы­пол­ня­ют­ся, то в про­цес­се О. п. не­об­хо­ди­мо ло­ка­ли­зо­вать и про­ана­ли­зи­ро­вать точ­ки (об­лас­ти) па­рал­лель­ных вы­чис­лит. про­цес­сов, в ко­то­рых со­сре­до­то­че­но их взаи­мо­влия­ние; ча­ще все­го в этих точ­ках про­цесс вы­пол­не­ния опе­ра­то­ров раз­ных про­цес­сов не­об­хо­ди­мо упо­ря­до­чить (син­хро­ни­зо­вать). Т. е. в про­грам­мы про­цес­сов сле­ду­ет вне­сти та­кие из­ме­не­ния, ко­то­рые га­ран­ти­ру­ют при ис­пол­не­нии про­грамм не­за­ви­си­мый (ин­ва­ри­ант­ный) от ин­тер­ли­вин­га ре­зуль­тат вы­чис­ле­ний.

При от­лад­ке па­рал­лель­ных про­грамм обыч­но при­ме­ня­ют сле­дую­щие ме­то­ды. Ана­лиз вы­пол­не­ния па­рал­лель­ных про­цес­сов на пред­мет воз­ник­но­ве­ния не­до­пус­ти­мой си­туа­ции – од­но­вре­мен­но­го дос­ту­па к об­ще­му ре­сур­су не­сколь­ких про­цес­сов, и обес­пе­че­ние ус­ло­вий, ис­клю­чаю­щих дан­ную си­туа­цию. Ло­ка­ли­за­ция то­чек из­ме­не­ния об­ще­го ре­сур­са од­ним из па­рал­лель­ных про­цес­сов, ана­лиз влия­ния этих из­ме­не­ний на др. па­рал­лель­ные про­цес­сы, а так­же обес­пе­че­ние син­хро­ни­за­ции про­цес­сов в ло­ка­ли­зо­ван­ных точ­ках. Ло­ка­ли­за­ция и ана­лиз то­чек не­де­тер­ми­ни­ро­ван­но­го взаи­мо­дей­ст­вия па­рал­лель­ных про­цес­сов и соз­да­ние спец. ус­ло­вий (напр., спец. тес­то­вые на­бо­ры), по­зво­ляю­щих учи­ты­вать все ва­ри­ан­ты не­де­тер­ми­ни­ро­ван­ных взаи­мо­дей­ст­вий. Ре­зуль­та­том кор­рек­ти­ров­ки про­грам­мы в про­цес­се от­лад­ки мо­жет яв­лять­ся не толь­ко ис­прав­ле­ние най­ден­ных оши­бок, но и вне­се­ние в про­грам­му но­вых оши­бок (т. н. ин­ду­ци­ро­ван­ных оши­бок), что при­во­дит к по­втор­но­му цик­лу тес­ти­ро­ва­ния и от­лад­ке про­грамм.

Отладка программы — один их самых сложных этапов разработки программного обеспечения, требующий глубокого знания:

специфики управления используемыми техническими средствами,

среды и языка программирования,

природы и специфики различных ошибок,

методик отладки и соответствующих программных средств.

— это процесс локализации и исправления ошибок, обнаруженных при тестировании программного обеспечения. называют процесс определения оператора программы, выполнение которого вызвало нарушение нормального вычислительного процесса. Доя исправления ошибки необходимо определить ее , т. е. определить оператор или фрагмент, содержащие ошибку. Причины ошибок могут быть как очевидны, так и очень глубоко скрыты.

целом сложность отладки обусловлена следующими причинами:

Читать также:  Ошибка runtime

требует от программиста глубоких знаний специфики управления используемыми техническими средствами, операционной системы, среды и языка программирования, реализуемых процессов, природы и специфики различных ошибок, методик отладки и соответствующих программных средств;

психологически дискомфортна, так как необходимо искать собственные ошибки и, как правило, в условиях ограниченного времени;

возможно взаимовлияние ошибок в разных частях программы, например, за счет затирания области памяти одного модуля другим из-за ошибок адресации;

отсутствуют четко сформулированные методики отладки.

соответствии с этапом обработки, на котором проявляются ошибки, различают (рис. 10.1):

— ошибки, фиксируемые компилятором (транслятором, интерпретатором) при выполнении синтаксического и частично семантического анализа программы; — ошибки, обнаруженные компоновщиком (редактором связей) при объединении модулей программы;

— ошибки, обнаруженные операционной системой, аппаратными средствами или пользователем при выполнении программы.

Синтаксические ошибки относят к группе самых простых, так как синтаксис языка, как правило, строго формализован, и ошибки сопровождаются развернутым комментарием с указанием ее местоположения. Определение причин таких ошибок, как правило, труда не составляет, и даже при нечетком знании правил языка за несколько прогонов удается удалить все ошибки данного типа.

Следует иметь в виду, что чем лучше формализованы правила синтаксиса языка, тем больше ошибок из общего количества может обнаружить компилятор и, соответственно, меньше ошибок будет обнаруживаться на следующих этапах. В связи с этим говорят о языках программирования с защищенным синтаксисом и с незащищенным синтаксисом. К первым, безусловно, можно отнести Pascal, имеющий очень простой и четко определенный синтаксис, хорошо проверяемый при компиляции программы, ко вторым — Си со всеми его модификациями. Чего стоит хотя бы возможность выполнения присваивания в условном операторе в Си, например:

if (c = n) x = 0; /* в данном случае не проверятся равенство с и n, а выполняется присваивание с значения n, после чего результат операции сравнивается с нулем, если программист хотел выполнить не присваивание, а сравнение, то эта ошибка будет обнаружена только на этапе выполнения при получении результатов, отличающихся от ожидаемых */

Ошибки компоновки, как следует из названия, связаны с проблемами,

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

К самой непредсказуемой группе относятся ошибки выполнения. Прежде всего они могут иметь разную природу, и соответственно по-разному проявляться. Часть ошибок обнаруживается и документируется операционной системой. Выделяют четыре способа проявления таких ошибок:

• появление сообщения об ошибке, зафиксированной схемами контроля выполнения машинных команд, например, переполнении разрядной сетки, ситуации «деление на ноль», нарушении адресации и т. п.;

появление сообщения об ошибке, обнаруженной операционной системой, например, нарушении защиты памяти, попытке записи на устройства, защищенные от записи, отсутствии файла с заданным именем и т. п.;

«зависание» компьютера, как простое, когда удается завершить программу без перезагрузки операционной системы, так и «тяжелое», когда для продолжения работы необходима перезагрузка;

несовпадение полученных результатов с ожидаемыми.

. Отметим, что, если ошибки этапа выполнения обнаруживает пользователь, то в двух первых случаях, получив соответствующее сообщение, пользователь в зависимости от своего характера, степени необходимости и опыта работы за компьютером, либо попробует понять, что произошло, ища свою вину, либо обратится за помощью, либо постарается никогда больше не иметь дела с этим продуктом. При «зависании» компьютера пользователь может даже не сразу понять, что происходит что-то не то, хотя его печальный опыт и заставляет волноваться каждый раз, когда компьютер не выдает быстрой реакции на введенную команду, что также целесообразно иметь в виду. Также опасны могут быть ситуации, при которых пользователь получает неправильные результаты и использует их в своей работе.

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

неверное определение исходных данных,

накопление погрешностей результатов вычислений (рис. 10.2).

Н е в е р н о е о п р е д е л е н и е и с х о д н ы х д а н н ы х происходит, если возникают любые ошибки при выполнении операций ввода-вывода: ошибки передачи, ошибки преобразования, ошибки перезаписи и ошибки данных. Причем использование специальных технических средств и программирование с защитой от ошибок (см.§ 2.7) позволяет обнаружить и предотвратить только часть этих ошибок, о чем безусловно не следует забывать.

Читать также:  Пишите. Исправляйте. Парафразируйте

Л о г и ч е с к и е о ш и б к и имеют разную природу. Так они могут следовать из ошибок, допущенных при проектировании, например, при выборе методов, разработке алгоритмов или определении структуры классов, а могут быть непосредственно внесены при кодировании модуля.

последней группе относят:

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

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

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

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

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

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

опосредованного проявления ошибок;

возможности взаимовлияния ошибок;

возможности получения внешне одинаковых проявлений разных ошибок;

отсутствия повторяемости проявлений некоторых ошибок от запуска к запуску – так называемые стохастические ошибки;

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

написания отдельных частей программы разными программистами.

Инструменты для отладки программ

Раз­ра­бо­та­ны спец. про­грамм­ные сред­ст­ва (ин­ст­ру­мен­ты) для про­ве­де­ния О. п., сре­ди ко­то­рых наи­бо­лее по­пу­ляр­ны т. н. и. Они име­ют удоб­ный поль­зо­ва­тель­ский ин­тер­фейс, по­зво­ля­ют про­во­дить О. п. по­ша­го­во и с пред­ва­ри­тель­но за­дан­ны­ми (за­ка­зан­ны­ми) точ­ка­ми ос­та­но­ва, про­смат­ри­вать и из­ме­нять со­стоя­ние вы­де­лен­ной об­лас­ти па­мя­ти, кон­тро­ли­ро­вать разл. ин­фор­ма­цию на эта­пе вы­пол­не­ния. От­лад­чи­ки час­то ин­тег­ри­ро­ва­ны в сис­те­му раз­ра­бот­ки ко­да про­грамм (напр., Eclipse CDT, MS Visual Studio). Ши­ро­ко ис­поль­зу­ют­ся ин­ст­ру­мен­ты ди­на­мич. и ста­тич. ана­ли­за. (напр., Val­grind) кон­тро­ли­ру­ют вре­мя вы­пол­не­ния уча­ст­ков ко­да про­грам­мы, на­хо­дят точ­ки (об­лас­ти) не­кор­рект­ной ра­бо­ты с па­мя­тью и объ­ек­та­ми опе­ра­ци­он­ной сис­те­мы и др. (напр., Kloc­work) вы­яв­ля­ют ошиб­ки вы­хо­да (об­ра­ще­ния) за гра­ни­цы мас­си­вов, по­тен­ци­аль­ные про­бле­мы безо­пас­но­сти, т. н. утеч­ки па­мя­ти, не­кор­рект­ность ис­поль­зо­ва­ния сис­тем­ных ре­сур­сов и др. По­пу­ляр­ны так­же ска­не­ры ин­тер­фей­сов (напр., Wire­shark, по­зво­ляю­щий осу­ще­ст­в­лять се­те­вой мо­ни­то­ринг). Од­на­ко для ана­ли­за ти­пич­ных оши­бок па­рал­лель­ных или мно­го­по­точ­ных при­ло­же­ний, напр. т. н. гон­ки дан­ных, ту­пи­ков (вза­им­ной бло­ки­ров­ки про­цес­сов), по­то­ков в со­стоя­нии ожи­да­ния, по­те­рян­ных сиг­на­лов, тре­бу­ют­ся спе­циа­ли­зир. сред­ст­ва от­лад­ки па­рал­лель­ных при­ло­же­ний (напр., Intel Thre­ad Checker). Сле­ду­ет от­ме­тить, что наи­бо­лее эф­фек­тив­но ком­плекс­ное при­ме­не­ние ин­ст­ру­мен­тов О. п., по­сколь­ку кон­крет­ные про­грамм­ные сред­ст­ва обес­пе­чи­ва­ют по­иск лишь оп­ре­де­лён­ных ти­пов оши­бок.

Похожие вопросы и ответы

Программирование на языке высокого уровня — итоговое тестирование

Ваш адрес email не будет опубликован. Обязательные поля помечены

Сохранить моё имя, email и адрес сайта в этом браузере для последующих моих комментариев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *