Дебаг и поиск ошибок

Виды ошибок

Ошибки компиляции

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

В интерпретируемых языках (например Python) текст программы команда за командой переводится в машинный код и сразу исполняется. К моменту обнаружения ошибки часть программы уже может исполниться.

Ошибки компоновки

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

Ошибки выполнения (RUNTIME Error)

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

  • сообщение об ошибке, которую зафиксировали схемы контроля машинных команд. Это может быть переполнение разрядной сетки (когда старшие разряды результата операции не помещаются в выделенной области памяти), «деление на ноль», нарушение адресации и другие;
  • сообщение об ошибке, которую зафиксировала операционная система. Она же, как правило, и документирует ошибку. Это нарушение защиты памяти, отсутствие файла с заданным именем, попытка записи на устройство, защищенное от записи;
  • прекращение работы компьютера или зависание. Это и простые ошибки, которые не требуют перезагрузки компьютера, и более сложные, когда нужно выключать ПК;
  • получение результатов, которые отличаются от ожидаемых. Программа работает стабильно, но выдает некорректный результат, который пользователь воспринимает за истину.

Ошибки выполнения можно разделить на три большие группы.

Ошибки определения данных или неверное определение исходных данных. Они могут появиться во время выполнения операций ввода-вывода.

К ним относятся:

  • ошибки преобразования;
  • ошибки данных;
  • ошибки перезаписи.

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

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

В эту группу входят:

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

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

Инструменты для снятия логов: Android

Расскажем о трёх способах.

Первый — Logcat в составе Android Studio, самый известный и широко используемый.

Для снятия логов нам необходимо перевести устройство в режим разработчика/отладки. Для этого нужно:

  • найти в настройках номер нашего билда или ОС (в зависимости от устройства),

  • около десяти раз нажать на эту информацию,

  • при появлении сообщения о том, не хотим ли мы перевести устройство в режим разработчика, нажать «Ок».

Примечание: алгоритм может отличаться в зависимости от производителя устройства, потому что у многих из них свои надстройки на ОС Android.

Дальше подключаем устройство по USB к ПК и устанавливаем Android Studio. Следующие шаги на скрине:

  1. Выбираем вкладку Logcat (переходим к сообщениям в реальном времени).

  2. В окошке выбираем телефон, с которого снимаем логи.

  3. На этой вкладке выбираем логи определённого приложения. Если нужно снять вообще все логи со всех приложений и системы, эту вкладку стоит не трогать. Рядом с ней можно выбрать уровень логирования (вкладка Verbose на скрине).

  4. В поле поиска, где мы можем фильтровать выдачу, разрешено писать что угодно — от названия пакета до частей вроде fatal.

На скрине видно логи с подключенного устройства.

Второй способ — выгрузка логов с самого устройства. Кроме режима разработчика нам нужно подключить устройство к ПК через USB и установить ADB — Android Debug Bridge.

Открываем терминал и пишем две команды.

Первая — adb devices — показывает подключённые устройства, которые видит ADB. В терминале выглядит так:

Название устройства — 7BKDU18504001505

Вводим вторую команду — adb -s название устройства logcat, — которая запускает утилиту Logcat для конкретного устройства. В терминале в реальном времени будут поступать логи.

Как их читать?

  1. В первом столбце — дата и время поступления записи.

  2. Во втором — обозначения уровней логирования. Например, D — это Debug.

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

Третий инструмент — SDK Platform Tools. Процесс его установки практически аналогичен предыдущим двум:

  • переводим телефон в режим разработчика,

  • подключаем к ПК по USB,

  • скачиваем на ПК папку SDK PT (под свою ОС),

  • открываем папку SDK PT в терминале.

Теперь пишем команду ./adb logcat –v threadtime > ./android-debug.log.

В терминале это выглядит так:

Прерываем выполнение команды (например, на Mac это Control+C). Лог добавляется в папку.

Открываем:

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

Очень похоже на предыдущий терминал, но файл обновляется, пока в терминале действует команда.

Как исправить System.Diagnostics.Debug.dll

Обновлен декабрь 2022:

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

  • Шаг 1: (Windows 10, 8, 7, XP, Vista — Microsoft Gold Certified).
  • Шаг 2: Нажмите «Начать сканирование”, Чтобы найти проблемы реестра Windows, которые могут вызывать проблемы с ПК.
  • Шаг 3: Нажмите «Починить все», Чтобы исправить все проблемы.

Если System.Diagnostics.Debug.dll отсутствует или поврежден, это может повлиять на многие приложения, включая операционную систему, что может помешать вам выполнять свою работу или использовать критические функции в критически важных программах.

Запустить SFC

Самый безопасный способ восстановить отсутствующий или поврежденный файл System.Diagnostics.Debug.dll, вызванный вашей операционной системой Windows, — запустить встроенную проверку системных файлов, которая заменяет отсутствующие или поврежденные системные файлы.

Для этого щелкните правой кнопкой мыши кнопку «Пуск» на компьютере Windows 10, чтобы открыть меню WinX, и щелкните ссылку «Командная строка (администратор)».

В окне CMD скопируйте следующую команду и нажмите Enter:

ПФС / SCANNOW

Сканирование может занять 10 минут, и если оно успешно завершено, вы должны перезагрузить компьютер. Запуск sfc / scannow в безопасном режиме или при запуске может дать лучшие результаты.

Обновить драйверы

Иногда, при использовании аппаратного обеспечения, такого как принтер, вы получаете отсутствующую ошибку файла System.Diagnostics.Debug.dll. Эта ошибка может быть связана с более старой версией драйвера, который не совместим с обновленным файлом .dll, поэтому принтер ищет неправильный файл .dll и не может его найти.

Обновите драйверы вашего устройства, чтобы увидеть, решит ли это проблему.

Восстановление при загрузке

Восстановление при загрузке — это еще один способ восстановить все DLL-файлы, такие как System.Diagnostics.Debug.dll, до их первоначального рабочего состояния. Однако это исправление может вызвать проблемы в других программах, особенно если программа обновила файлы DLL.

Скачать или переустановить System.Diagnostics.Debug.dll

В большинстве учебников и руководств авторы предупреждают своих читателей, чтобы они не загружали недостающие файлы System.Diagnostics.Debug.dll со случайных и непригодных для использования веб-сайтов, которые могут предоставить им вредоносное ПО. Это не без причины, конечно. Правда в том, что в Интернете полно сайтов, которые обещают пользователям решить их проблемы, открыв определенные приложения или программы как можно скорее. К сожалению, очень немногие могут действительно оправдать ваши ожидания.

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

К счастью, процесс установки System.Diagnostics.Debug.dll довольно прост. Короче говоря, все, что вам нужно сделать, это скопировать оригинальный файл DLL в C: \ Windows \ System32. После копирования .DLL выполните следующую команду: regsvr32 System.Diagnostics.Debug.dll, и ваш .DLL будет успешно установлен.

(опциональное предложение для Reimage — Cайт | Лицензионное соглашение | Персональные данные | Удалить)

Новые функции, о которых вам нужно знать в Windows 8.1

В то время как Windows 8, Windows 8 Pro и Enterprise предназначены для традиционных ПК, другой выпуск Windows 8 RT предназначен для планшетов, работающих на чипах ARM. Этот выпуск включает в себя все функции Windows 8, а также некоторые расширенные функции, такие как Client Hyper-V, Групповая политика и присоединение к домену.

Инструмент анализатора памяти:

   Обнаружение шаговследующим образом:Справка по делу

(A) Когда экран переворачивают несколько раз, а память продолжает увеличиваться. Щелкните Дамп java Heap, чтобы создать файл hprof текущего снимка памяти.

(B) Затем полностью выйдите из приложения, перезапустите его, откройте Android Monitor и снова нажмите Dump java Heap, чтобы сгенерировать файл hprof моментального снимка памяти перед операцией (поворот экрана). Теперь два файла hprof были сгенерированы, один не поворачивается на экране, а другой несколько раз поворачивается на экране.

(c) Затем выберите Capture в левой части Android Studio, чтобы экспортировать файл hprof. При экспорте нужно выбрать сохраненный каталог и имя файла.

D) Откройте MAT и импортируйте наши 2 файла hprof. Откройте файл -> Выберите файл -> Отчет о подозрениях на утечку -> Готово: *

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

Типы динамической памяти

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

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

  • PermGen space (пространство PermGen) — это было распространено в старых JVM, особенно с инструментами, которые выполняют тяжелые манипуляции с байт-кодом. Сегодня это не так распространено благодаря динамическому пространству PermGen.

  • Java heap space/Requested array size exceeds VM limit/Out of swap space? (пространство кучи Java/запрошенный размер массива превышает лимит виртуальной машины/недостаточно места в файле подкачки?) и т. д. — это, вероятно, означает, что утечка находится в вашем коде или в сторонней библиотеке. Но эта проблема в Java коде, что является хорошей новостью!

  • Если стек указывает на нативный метод — это может быть связано с утечкой нативного метода.

Обратите внимание, что это неверно, поскольку утечка в собственной памяти может привести к истощению кучи Java и наоборот. Нам нужно будет проверить оба, но это даст нам представление о том, с чего начать…

Причины зависания программ и их решение

Частые проблемы, которые вызывают зависания программ:

  • Неудовлетворенные потребности программы — вам следует ознакомиться с системными требованиями утилиты, чаще всего их можно найти на официальном сайте.
  • Устаревшая версия ПО – вам следует проверить наличие обновлений, возможно они и помогут решить проблему.
  • Устаревшие или несовместимые драйвера – возникает довольно часто, чтобы решить проблему вам следует установить соответствующий набор драйверов.
  • Последствия зараженности системы вирусами – для этого существует большое множество антивирусного программного обеспечения, которое сможет вам помочь, иногда может понадобиться перебрать несколько таких утилит, так как функционал и метод проверки разный. Стоит начать с наиболее известных и зарекомендовавших себя временем, а далее опытным путём перебирать программы до решения проблемы.
  • Проблема в устаревшем .Net Framework – программы, которые разработаны на более новой версии, не будут работать на старой, за редкими исключениями. Этот framework является платформой для корректной работы вашей системы с различными языками программирования.
  • Неполадки самой программы – такое тоже далеко не редкость, а скорее правило, обычно в таких случаях вам также следует проверить обновление, в случае если у вас установлена последняя версия и с драйверами всё в порядке, проверьте версию .Net Framework, DirectX, Visual C++ и другие необходимые для работы программы платформы.
  • Проблемы с оборудованием – такие проблемы встречаются реже всего, поэтому стоит проверить иные варианты прежде чем впадать в крайность. Обычно за этим может стоять несколько компонентов: недостаточный объём оперативной памяти, маленькая мощность процессора или видеоадаптера, проблемы с жестким диском и блоком питания.

Основные причины мы рассмотрели, теперь давайте перейдём к решению ситуации, когда программа не отвечает, но прежде всего вам нужно убедиться, что дело именно в программном обеспечении, а не завис компьютер. Для этого воспользуйтесь любым элементом вашей системы, лучше всего требующим мало ресурсов или нажатием Caps Lock, Num Lock, если всё работает как нужно, переходите к решению.

Вспомогательные средства

1. Добавляйте информацию о местоположении ошибки к отчету отладчика (LinePos)

printfTRACEoutputDebugString

file line

__LINE____FILE__Predefined Macros, MSDNOutputDebugStringgithub.com/fenbf/DebuggingTipsSamplesОбновление:jgalowicz__SHORT_FILE__заметке в его блогеопция компилятора /FC

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

MyFunc()Ctrl+F11

std::string default.natstepfilterHow to Not Step Into Functions using the Visual C++ DebuggerVA Step Filterdefault.natstepfilter

6. Пишите собственные отладочные визуализаторы

Debug Visualizers in Visual C++ 2015Project → Add New Item → Visual C++ → Utility → Debugger visualization file (.natvis)

DAS (Diagnosis ASsistent)

DAS – более старый ассистент, используется для авто 2000-2008 года. Все тоже самое по аналогии с Xentry, но старый интерфейс. DAS более понятен и не перегружен опциями, в отличии от Xentry. Но это мое имхо.

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

Примеры:

W220 S320 Long, разбираюсь с АКПП:

W203 C230 Kompressor, просмотр версии блока управления АКПП для дальнейшего включения скрытого режима Agility:

W203 C230 Kompressor: кодирование приборной панели, отключение лимита скорости в 120 км/ч, отключение зуммера ремня, включение информации остатка бензина в литрах:

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

блоги

некоторые блоги (смесь отладки собственного и управляемого кода).

  • Расширенная отладка .NET
  • Вся Ваша База Принадлежит Нам (Саша Гольдштейн)
  • «анализ» -в
  • ASP.NET отладка
  • Cyberiafreak (threading и расширенный Windows prog и отладки)
  • Отладка Analyzer.NET
  • Debug and Beyond
  • Отладки Экспертов Журнал Онлайн
  • Отладка Toolbox (скрипты Windbg, инструменты отладки и устранения неполадок и методы, помогающие изолировать проблемы с программным обеспечением.)
  • расшифровать мой мир
  • greggm в блог
  • примечания по программированию Windows Junfeng Zhang
  • лакомые кусочки Кристоффера
  • блог Марка Русиновича
  • Майк киосков .NET блог отладки
  • блог Навина
  • Никогда Не Сомневайся Отладчик (Карло)
  • заметки из темного угла
  • Блог Ntdebugging (Microsoft Global Escalation Services team)
  • Найнив. Приключения в отладке Windows и обратной инженерии
  • Примечания разработчика PFE для поля
  • Команда Отладчика Visual Studio
  • WinDbg по Volker von Эйнем!—8—>

Ресурсы загружены мало, а комп все равно тормозит

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

На том, как определить, что компьютер перегревается, подробно останавливаться не будем, поскольку об этом рассказано в других статьях (ссылки приведены в первом параграфе). Ниже в качестве примера – скриншот утилиты для мониторинга состояния железа HWiNFO, которая показывает температуры основных узлов ПК в реальном времени.

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

Чтобы вычислить необходимую мощность блока питания ПК, не нужно быть инженером и знать хитрые формулы. Для этого есть специальные сервисы, например, OuterVision Power Supply Calculator. Он представлен набором таблиц с моделями комплектующих, из которых пользователю нужно выбрать свои, и кнопкой «Calculate» (Рассчитать). На выходе сервис показывает энергопотребление составленной сборки и рекомендует несколько моделей подходящих блоков питания.

Кстати, приблизительно через 3-7 лет эксплуатации блоки питания изнашиваются. Если компьютер начал тупить примерно в этот период, значит, пора подумать о новом источнике энергии для него.

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

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

Обложка: Pxhere

Утечка ресурсов

При проведении исследования для этой статьи обнаружилось, что почти в каждом посте упоминалась утечка файловых ресурсов и т. д. Это отдельная проблема. Утечки файловых ресурсов были проблемой 20 лет назад для некоторых ОС. Текущий сборщик мусора и очистка делают так, что эти утечки почти не имеют значения.

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

Как мы можем предотвратить утечки?

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

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

Пишите безопасный код при создании сложных API. IntelliJ/IDEA имеет довольно комплексный код для привязки элементов IDE к плагинам. Это идеальное место для утечек и багов. Поэтому умные разработчики из JetBrains добавили в свой код журналы, которые обнаруживают такие утечки при выгрузке. Возьмите страницу из их книги, предскажите будущие проблемы… Если у вас есть API, который позволяет разработчикам регистрироваться, подумайте о способе обнаружения утечек. Распечатайте список оставшихся объектов до того, как приложение будет разрушено. Возможно это из-за утечки памяти!

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

Наконец, запустите монитор памяти в своем приложении. Просмотрите объекты, имеют ли они смысл?

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

Диагностика диска с программой Victoria HDD

Victoria HDD — максимально простая, но очень мощная программа полной диагностики жёсткого диска. Приложение создавалось в качестве инструмента оценки производительности HDD, тестирования всех его параметров, устранения выявленных проблем, а также правильного и чистого форматирования HDD.

Интерфейс программа Victoria очень простой, тем не менее, программа рассчитана на продвинутых пользователей, или хотя бы со средним левелом знаний и навыков. Программа гибкая, и её можно подстроить (сконфигурировать) под ваш уровень технической грамотности\подготовки. Это изменяет алгоритмы сканирования и вывода информации. Структура данных будет такая, какая вам больше подходит. Программа выдаёт все детали по вашему диску, который сканируется, от модели, общего размера до функций.

Victoria также сканирует физическую поверхность блинов диска, то есть проводит тест с помощью считывающих головок. При обнаружении каких-то проблем и неисправностей, выдаёт предупреждение, помечает, где эта неисправность находится. Это могут быть плохие\повреждённые сектора. После выдаётся подробный отчёт. Пользователь может переназначить все повреждённые сектора, таким образом изолируя плохой блок, чтобы диском можно было продолжать пользоваться без опасения потери ваших данных. Программа является разработкой Казанского Сергея. Хоть и не было давно обновления, приложение до сих пор делает свою работу на очень высоком уровне эффективности.

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

Я уверен что данная статья поможет вам предотвратить частых сбоев в жестком диски и устранить проблему с притормаживанием Windows, удачи!

http://lp-digital.ru/articles/598-proverka-zhestkogo-diska-na-oshibki-utilita-chkdsk.html

http://commentarticle.xyz/programmy/instrukcii/5164-proverka-zhestkogo-diska-kompjutera-na-nalichie.html

https://ww.epicm.org/rtfm/chkdsk

https://www.softhome.ru/article/programmy-dlya-diagnostiki-vinchestera

Выводы

С появлением технологии обхода цепочки ожидания, в арсенале технического специалиста появился довольно действенный метод определения причин блокировок зависшего приложения и разблокировки подвисших процессов. Конечно, по уму, при изучении инцидента стоило бы проанализировать более детально, какие именно функции потоков блокируют исполнение и чего именно они ждут, но это уже совершенно другой уровень и мы не ставили себе подобной цели при написании данной статьи. Тем не менее, теперь мы вооружены еще одним, достаточно простым, понятным и быстрым способом разблокировки зависшего (не отвечающего) процесса. Сам по себе способ не требует наличия углубленных технических знаний, а так же специализированных сторонних инструментов и опирается на штатное средство под названием монитор ресурсов (Resource Monitor, resmon), что является ощутимым преимуществом. Резюмируя, можно сказать, что использование функции «анализ цепочки ожидания» зависшего приложения достаточно эффективный способ устранения причины зависания процесса.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: