Можно выделить два типа ошибок, с которыми сталкивается программист. Во-первых — это ошибки, которые сопровождают создание программ, а во вторых — ошибки времени выполнения .
Если вы неправильно введете оператор или ключевое слово , если забудете указать часть выражения — ошибка сразу же будет заметна в редакторе. Такие ошибки относятся к синтаксическим . Также на этапе разработки можно обнаружить и устранить логические ошибки . Они связаны с неправильными формулами расчета показателей, неверным использованием переменных и т.д.
Приведем несколько примеров синтаксических ошибок .
- Неправильное ключевое слово. Такая ошибка сразу будет отмечена редактором. Например, если в конструкции цикла For-Next сделать ошибку в ключевом слове For — вы увидите сообщение об ошибке как только попытаетесь перейти к написанию следующей, после начала цикла, строки.
- Ошибка при объявлении переменной. Если вы забудете указать ключевое слово Dim при объявлении переменной — редактор выдаст сообщение об ошибке. Однако, сделает он это лишь при попытке запуска программы.
А вот — логические ошибки .
Как исправить ошибку с загрузкой приложений в Microsoft Store
- Неправильное использование операторов. Например, вместо знака обычного деления вы случайно использовали знак целочисленного деления.
- Расчет какого-либо показателя по неправильной формуле. Например, если неточно расставить скобки в каком-либо выражении — это приведет к ошибке, хотя внешне все может выглядеть правильным.
- Неправильное использование функций — как встроенных, так и пользовательских. Например, используя функцию Str для получения строкового представления числа, вы не учли, что для положительных чисел эта функция добавляет в начало строки пробел. Далее вы попытались узнать первую цифру числа, вырезав первый символ полученной строки. Естественно, никакой цифры в этом случае не получится — лишь знак пробела для положительных или «минус» для отрицательных чисел.
- Неправильное использование переменных. Например, вы используете два вложенных цикла для обработки двумерного массива. Одна из цикловых переменных имеет имя i , вторая — j . Они довольно сильно похожи внешне, их можно случайно перепутать при указании индексов массива. К тому же, обрабатывая массив в цикле довольно легко перепутать место каждой из переменных при указании индекса массива . Использование понятных имен переменных (например — my_Age или num_Vozrast для хранения возраста и т.д.) позволяет эффективно бороться с такими ошибками.
- Случайное использование «новых» переменных. Например, вы предложили пользователю ввести некое значение и записали его в переменную num_Inp , а использовав эту переменную в выражении, напечатали не num_Inp , а num_Ihp . Внешне они похожи, но, присмотревшись, вы можете обнаружить, что имена разные. Еще сложней искать ошибки в латинских именах переменных, в которые «вкрались» русские буквы. Разницу между my_Name и my_Namе вы не увидите, но это — разные переменные — в конце второй вместо латинской e использована русская е . Эффективно бороться с такими ошибками можно, если задать в редакторе опцию обязательного объявления переменных ( Option Explicit ). При появлении необъявленной переменной редактор даст знать об этом.
- Неправильное использование оператора сравнения. Например, это может быть оператор, который сравнивает некие величины не так, как вы предполагали — вместо знака < вы случайно использовали >или, редактируя сравнение (скажем, скопировав похожий оператор сравнения из другого места программы для ускорения работы), поменяли местами сравниваемые переменные или выражения, не поменяв знака и т.д.
Ошибки логики можно найти лишь тщательно проверив и протестировав программу. Чтобы облегчить работу с кодом программы, рекомендуется снабжать ее комментариями. Вовсе необязательно комментировать каждую строчку, достаточно выделить крупные функциональные блоки.
Программа не предназначена для выполнения в Windows что делать как запустить
8.2. Ошибки при выполнении программы
Такие ошибки называют еще ошибками времени выполнения . Происходят они, как правило, при неправильном вводе данных пользователем, при возникновении обстоятельств, делающих дальнейшую нормальную работу программы невозможной. Например, ошибку вызовет попытка использовать текстовые данные в арифметическом выражении, попытка сохранения файла в несуществующей директории, деление на ноль и т.д.
Ошибки времени выполнения возникают в нормально работающих программах, которые прошли проверку на синтаксическую и логическую правильность. С этими ошибками можно бороться используя один из двух методов. Первый — разработка программы таким образом, чтобы не допустить этих ошибок, создание программных конструкций, которые предотвращают возникновение ошибок. Второе — перехват ошибок и их обработка.
Давайте, для начала, рассмотрим способы поиска ошибок в процессе создания программ
8.3. Тестирование программ и поиск ошибок
Синтаксические ошибки , как уже было сказано, выявляются обычно на очень раннем этапе — сразу после набора текста в редакторе. А вот для поиска логических ошибок полезно протестировать программу.
Для начала протестируйте вашу программу в обычном режиме работы. Например, если вы предлагаете ввести пользователю число — введите сами число и проверьте результаты работы. Если действия программы будут различаться в зависимости от введенных данных — попытайтесь перебрать все варианты этих данных — так, чтобы проверить все ветви программы.
Если обычные проверки закончились успешно — можно считать, что ваша программа корректно работает, не имеет синтаксических и логических ошибок .
После этого можно усложнить режим тестирования, чтобы как можно более полно сымитировать действия пользователя программы и посмотреть на ее поведение. Еще лучше — попытайтесь целенаправленно вызвать ошибку. Гораздо лучше, когда программа даст сбой на вашем рабочем столе, и вы сможете оперативно устранить этот сбой, чем ждать, когда то же самое произойдет у другого пользователя.
Для проверки программы в реальных условиях попробуйте провести следующие эксперименты.
- Если программа запрашивает число — введите какое-нибудь слово, очень большое число, ноль, отрицательное число, оставьте поле ввода пустым, введите дробное число. Если вы не предусмотрели никаких специальных мер по обработке ошибок, при выполнении подобных операций вы почти гарантированно встретитесь с проблемами.
- Попытайтесь запустить программу, открыв несколько окон с документами.
- Попытайтесь прервать работу программы, а потом снова возобновить ее. Если в вашей программе есть участки, в течение выполнения которых нельзя допускать прерывания работы программы пользователем — вам следует подумать о том, чтобы запретить прерывание работы программы на этих участках.
- Попытайтесь использовать вашу программу в более старой версии Microsoft Office, в нерусифицированной версии. Обратите внимание, например, на различия расширений имен файлов в Office 2007 и более старых версиях, на различия в объектных моделях. В общем случае программы из более старых версий Office будут работать в Office 2007, однако если они используют какие-то специфические особенности Office — такие программы нуждаются в проверке и обновлении. В то же время, макросы для Office 2007, использующие новые объектные модели, могут не работать или работать неправильно в старых версиях.
- Попытайтесь поработать с вашей программой на чужом ПК. Вполне возможно, что при таком эксперименте вы столкнетесь с ошибкой. Например, вы программно работаете с файлами на вашем рабочем ПК — если эти файлы отсутствуют на ПК другого пользователя или находятся в других директориях, или тех директорий, которые нужны вашей программе, нет на ПК другого пользователя — вы столкнетесь с ошибкой.
- Во время работы программы сделайте что-нибудь необычное. Как правило, от пользователей можно ожидать любых странных на первый взгляд действий. Если вы тестируете программу для MS Word, которая правит текст или занимается автоматическим созданием текста, попробуйте во время ее работы переключаться между документами, читать документ, вносить в него правки, выделять произвольные участки текста. То же самое касается MS Excel — во время работы программы попробуйте переключаться между открытыми книгами, между листами, выделять ячейки, попробуйте запустить программу, делая различные листы активными, открыв несколько книг. Результаты такого тестирования могут быть совершенно непредсказуемыми. Проанализировав их, вы можете прити к выводу, что, например, на время выполнения программы нужно скрывать или блокировать документ, пользоваться альтернативными методами работы с документом. Яркий пример — объект Selection в MS Word, который чувствителен к смене выделения в процессе работы, и объект Range , который может работать совсем без создания выделения в тексте.
- Если ваша программа использует файлы, находящиеся в локальной сети, отключите сеть во время работы программы. Проверьте ее реакцию. То же самое можно сделать, если ваша программа работает с принтером — проверьте ее реакцию на выключенный принтер, на принтер, в котором нет бумаги.
- Наконец, представьте, что вы — пользователь программы и просто поработайте с ней. А еще лучше — попросите потенциального пользователя немного «пообщаться» с вашей программой. Этот способ позволяет протестировать программу в условиях, максимально приближенных к реальным.
Возможно, вам покажется, что такая проверка не нужна вашей программе. Если вы пишете небольшой макрос для собственного использования, скорее всего, так оно и есть. Но стоит вашему проекту хоть немного вырасти, методы поиска и устранения ошибок могут оказаться очень кстати.
Если вы встретитесь с ошибками и затрудняетесь определить, где именно они происходят — попробуйте выполнить программу в пошаговом режиме, используйте встроенные в редактор VBA средства для отладки программ .
8.4. Отладка программ в редакторе VBA
Основной метод отладки — это пошаговое исполнение программы с использованием точек останова ( breakpoint ).
Чтобы создать в программе точку останова, достаточно щелкнуть мышью в редакторе на серой панели напротив команды, на которой нужно остановить выполнение программы. Там появится большая красная точка (рис. 8.1.) — здесь программа будет остановлена в процессе выполнения. Строка будет подсвечена красным цветом.
Рис. 8.1. Точка останова в программе
Следует понимать, что строка, подсвеченная при остановке программы еще не выполнялась — редактор указывает на нее, как бы говоря «Эта строка будет выполнена следующей».
Таких точек останова можно установить столько, сколько нужно — на тех строках программы, где вы подозреваете возникновение ошибки. Чтобы убрать точку останова, щелкните по ней мышью.
Установить точку останова в строку можно, выделив строку и выбрав команду Debug o Toggle Breakpoint ( Отладка o Установить точку останова). Для удаления всех точек останова из программы можно воспользоваться командой Debug o Clear All Breakpoints ( Отладка o Очистить точки останова).
Вместо точек останова, расставленных мышью или из меню , можно использовать оператор Stop . Он останавливает работу программы и переводит ее в режим отладки .
Так же режим отладки можно включить, нажав во время работы программы комбинацию клавиш Ctr + Pause Break и нажав в появившемся окне кнопку Debug . Текущая строка будет выделена желтым цветом, напротив нее будет установлена желтая стрелочка. Однако такой способ обычно не позволяет точно «попасть» в то место программы, где находится предполагаемая ошибка (рис. 8.2.).
Рис. 8.2. Программа, остановленная во время выполнения
Чтобы запущенная программа останавливалась на каждой строке, можно запустить ее в режиме Step Into командой Debug o Step Into ( Отладка o Пошаговое исполнение ). Того же эффекта можно достичь, нажав клавишу F8 на клавиатуре.
Когда программа остановлена, вы можете выполнить следующие действия
- Просмотреть значения переменных, наведя на них указатель мыши. Например, на рис. 8.3. вы видите всплывающее окно, которое содержит значение переменной.
Рис. 8.3. Значение переменной во всплывающем окне
Помимо режима Step Into существуют следующие режимы отладки, доступные в меню Debug.
- Step Over (Перейти на следующую строку). Эта команда полезна при отладке программы , содержащей вызовы уже отлаженных процедур. В режиме Step Over отладчик не входит в процедуру , выполняя ее без отладки , после чего переходит на следующую строку. Например, вы выполняете программу в режиме Step Into и при очередной остановке видите, что подсвеченная строка содержит вызов процедуры, которую отлаживать не нужно. Вы выбираете команду Step Over, процедура выполняется без остановок на каждой ее строке, после чего следующая остановка происходит на строке вашей программы, которая идет за вызовом процедуры.
- Step Out (Выполнить процедуру) — эта команда позволяет выполнить текущую процедуру (например, вызванную из кода основной программы при обычной отладке ) без остановки в каждой строке. Следующая остановка будет сделана на строке, которая следует за вызовом процедуры в основном тексте программы.
- Run To Cursor (Выполнить до курсора) — выполняет программу до позиции, на которой установлен курсор. Аналогично установке одиночной точки останова.
Помимо точек останова существуют и другие средства отладки . Они полезны при проверке значений переменных (ведь если переменных достаточно много — проверка их значений в коде программы может превратиться в утомительное и непродуктивное занятие), свойств объектов, которые могут вызвать ошибки и в других случаях.
Источник: intuit.ru
На вашем ПК возникла проблема, и его необходимо перезагрузить WIN 10
Во время загрузки Виндовс 10 (или её инсталляции) мы можем столкнуться с синим экраном смерти, сопровождающимся сообщением «На вашем ПК возникла проблема, и его необходимо перезагрузить». Как это часто бывает, перезагрузка системы ничего не даёт, и при следующем запуске системы ошибка возникает вновь. Ниже разберём суть возникшей проблемы и варианты её решения.
Почему появляется эта ошибка в WIN 10
Рассматриваемая ошибка обычно возникает при загрузке или установке ОС Виндовс. Пользователь внезапно получает BSoD, на экране которого содержится упомянутое выше сообщение, техническое название ошибки, и QR-код ссылки на неё в сети. Ещё какое-то время система собирает технические данные об ошибке, и при наличии Интернет-подключения пересылает указанные данные в Майкрософт для последующего анализа.
По статистике Майкрософт в WIN 10, около 70% всех случаев возникновения этой и близкой к ней проблем вызваны некорректно работающими драйверами. Ещё 10% приходятся на аппаратные проблемы (память, жёсткий диск, перегрев), остальные 20% вызваны различными альтернативными факторами.
Каковы причины дисфункции, которая информирует нас об возникновении проблемы и предлагает перезагрузить ПК? Их может быть несколько:
- Некорректно работающие драйвера (особенно в ситуации их недавней установки);
- Повреждённые системные файлы;
- Повреждён системный реестр (файлы реестра случайно или намеренно удалены из папки System32);
- Перегрев системы (в частности, из-за её намеренного разгона);
- Различные проблемы с памятью PC (выход из строя планок памяти, ошибки в их работе и др.);
- Злокачественная деятельность вирусных зловредов;
- Ошибки (битые сектора) на винчестере (в частности, из-за некорректного отключения PC).
После появления ошибки «На вашем ПК возникла проблема, и его необходимо перезагрузить» мы ещё можем загрузиться в системе обычным образом или использовать «Safe mode». В самых же печальных случаях система входит в циклический режим перезагрузки (BSoD – Перезагрузка – BsoD). Вследствие которого получить доступ к системному функционалу становится невозможно.
Как исправить дисфункцию «На вашем ПК возникла проблема»
Решение данной проблемы делится на два основных этапа, в зависимости от того, можете ли вы загрузить систему в безопасном режиме или нет.
- Для перехода в безопасный режим перезагрузите PC, и на экране входа удерживайте Shift.
- А затем выберите «Выключение» — «Перезапуск».
- После перезагрузки ПК на экране выбора параметра выберите «Диагностика».
- Затем «Дополнительные параметры».
- Далее «Параметры запуска» и «Перезапуск».
После перезагрузки ПК в списке параметров нажмите 4 для выбора загрузки в безопасном режиме или 5 для выбора загрузки безопасного режима с поддержкой сетевых драйверов. Кстати, загрузившись в последнем, а потом перезагрузив ваш ПК стандартным способом, иногда можно устранить ошибку «На вашем ПК возникла проблема».
Выберите 4 или 5 вариант загрузки
Итак, в зависимости от того, загрузились вы в безопасном режиме или нет, и необходимо построить дальнейший алгоритм наших действий.
Если загрузка в безопасном режиме возможна, выполните следующее:
Обновите драйвера
Первым делом обновите драйвера для основных компонентов вашего ПК (графические драйвера, драйвера дисплея, драйвера Ethernet и беспроводного адаптера). Скачав свежие их версии с сайта разработчика компонента (понадобится безопасный режим с поддержкой сетевых драйверов). В обновлении драйверов могут помочь такие инструменты как «ДрайверПак Солюшн», устанавливающие самые свежие драйвера в полуавтоматическом режиме. Установка свежих драйверов часто позволяет исправить ошибку о том, что на вашем компьютере появилась проблема и требуется перезагрузка WIN 10.
Деинсталлируйте недавно установленные программы
Рассматриваемая ошибка также может быть вызвана недавно установленными приложениями, вызывающими конфликт устройств и появления BSoD. Удалите недавно установленные программы и приложения стандартным для Виндовс образом, перезагрузите PC и понаблюдайте, появится ли синий экран.
Если при попытке удаления программы в безопасном режиме вы встретитесь с сообщением о недоступности инсталляционного сервиса Виндовс, тогда запустите от админа командную строку, и там наберите:
REG ADD «HKLMSYSTEMCurrentControlSetControlSafeBootMinimalMSIServer» /VE /T REG_SZ /F /D «Service»
И нажмите ввод. Затем наберите:
нажмите ввод и попробуйте де инсталлировать нужную программу вновь.
Модифицируйте настройки дампа памяти
- В безопасном режиме нажмите на Win+R.
- Введите там sysdm.cpl и клацните на Энтер.
- В открывшемся окне свойств системы выберите вкладу «Дополнительно», и справа от опции «Загрузка и восстановление» нажмите на «Параметры».
- Снимите галочку с опции «Выполнить автоматическую перезагрузку», а в «Запись отладочной информации» выберите опцию «Полный дамп памяти».
- Внизу нажмите на «ОК», и перезагрузите систему, это может помочь избавиться от ошибки «На вашем ПК возникла проблема».
Проверьте целостность системных файлов
Запустите от админа командную строку, и в ней наберите:
и нажмите на Энтер. Дождитесь завершения проверки.
Проверьте PC на наличие зловредов
В этом вам помогут такие испытанные утилиты как «ДокторВеб Кюрейт» и другие эффективные альтернативы, удаляющие с ПК различные виды зловредов.
Отключите средства разгона аппаратной части PC
Если вы используйте различные инструменты для разгона процессора или видеокарты ПК, рекомендуем отключить (удалить) их.
Установите все необходимые обновления Виндовс 10
Кликните ПКМ на аналог кнопки «Пуск» в Виндовс 10, выберите «Параметры», далее «Обновление и безопасность», и «Проверка наличия обновлений». Установите обновления и перезагрузите ПК.
Загрузка в безопасном режиме невозможна
Если загрузится в безопасном режиме не представляется возможным, то способами избавиться от ошибки «На вашем ПК возникла проблема» WIN 10 будут следующие альтернативы:
Используйте средство восстановления
Для реализации данного способа нам понадобится загрузочная флешка Виндовс 10, с которой будет необходимо загрузиться в системе. Выберите опцию «Восстановления системы» вместо установки.
Затем перейдите в «Диагностика», после этого в «Дополнительные параметры», и далее «Восстановление системы».
Выберите ваш аккаунт (при необходимости введите пароль), определитесь со стабильной точкой восстановления, и откатите систему на прежнее стабильное состояние.
Скопируйте файлы реестра для устранения сообщения об возникновении проблемы и необходимости перезагрузки
Перейдите в «Дополнительные параметры» меню восстановления системы, и выберите в них «Командная строка». С её помощью перейдите в директорию:
Скопируйте файлы «Default», «SAM», «Security», «Software» и «System» в предыдущую директорию «C»WindowsSystem32Config».
Прежде чем копировать данные файлы, покиньте папку Config. После окончания копирования перезагрузите систему.
Используйте функционал SFC
Также в данном режиме вновь выберите командную строку, и в ней наберите:
и нажмите на Энтер. Дождитесь завершения процедуры и перезагрузите PC, что поможет в устранении ошибки «на компьютере возникла проблема, и его необходимо перезагрузить».
Ещё несколько способов устранить ошибку в WIN 10
Кроме описанных программных способов решить ошибку на ПК возникла проблема можно следующим образом:
- Проверьте работоспособность планок памяти вашего PC. Рекомендуется отключить ПК, изъять планки памяти и слотов, и аккуратно протереть их контакты ластиком. После окончания процедуры уберите с контактов остатки ластика, вставьте планки обратно в ПК, и включите компьютер. Проблема может исчезнуть;
- Проверьте целостность жёсткого диска. Если загрузка системы не доступна, рекомендуем снять жёсткий диск с ПК, и протестировать его на другом компьютере с помощью популярных программ проверки диска (уровня «Victoria HDD»).
Проверьте целостность винчестера с помощью Victoria HDD
Заключение
Появление на экране ПК ошибки «На вашем ПК возникла проблема, и его необходимо перезагрузить» обычно сигнализирует о наличии разнообразных проблем с аппаратными компонентами PC и обслуживающих их драйверами. Выполните перечисленный выше комплекс советов, это позволит решить ошибку «С вашим компьютером возникла проблема» на вашем ПК.
Источник: sdelaicomp.ru
Как искать и исправлять ошибки в коде
Искать ошибки в программах — непростая задача. Здесь нет никаких готовых методик или рецептов успеха. Можно даже сказать, что это — искусство. Тем не менее есть общие советы, которые помогут вам при поиске. В статье описаны основные шаги, которые стоит предпринять, если ваша программа работает некорректно.
Шаг 1: Занесите ошибку в трекер
После выполнения всех описанных ниже шагов может так случиться, что вы будете рвать на себе волосы от безысходности, все еще сидя на работе, когда поймете, что:
- Вы забыли какую-то важную деталь об ошибке, например, в чем она заключалась.
- Вы могли делегировать ее кому-то более опытному.
Трекер поможет вам не потерять нить размышлений и о текущей проблеме, и о той, которую вы временно отложили. А если вы работаете в команде, это поможет делегировать исправление коллеге и держать все обсуждение в одном месте.
Вы должны записать в трекер следующую информацию:
- Что делал пользователь.
- Что он ожидал увидеть.
- Что случилось на самом деле.
Это должно подсказать, как воспроизвести ошибку. Если вы не сможете воспроизвести ее в любое время, ваши шансы исправить ошибку стремятся к нулю.
Шаг 2: Поищите сообщение об ошибке в сети
Если у вас есть сообщение об ошибке, то вам повезло. Или оно будет достаточно информативным, чтобы вы поняли, где и в чем заключается ошибка, или у вас будет готовый запрос для поиска в сети. Не повезло? Тогда переходите к следующему шагу.
Шаг 3: Найдите строку, в которой проявляется ошибка
Если ошибка вызывает падение программы, попробуйте запустить её в IDE под отладчиком и посмотрите, на какой строчке кода она остановится. Совершенно необязательно, что ошибка будет именно в этой строке (см. следующий шаг), но, по крайней мере, это может дать вам информацию о природе бага.
Шаг 4: Найдите точную строку, в которой появилась ошибка
Как только вы найдете строку, в которой проявляется ошибка, вы можете пройти назад по коду, чтобы найти, где она содержится. Иногда это может быть одна и та же строка. Но чаще всего вы обнаружите, что строка, на которой упала программа, ни при чем, а причина ошибки — в неправильных данных, которые появились ранее.
Если вы отслеживаете выполнение программы в отладчике, то вы можете пройтись назад по стектрейсу, чтобы найти ошибку. Если вы находитесь внутри функции, вызванной внутри другой функции, вызванной внутри другой функции, то стектрейс покажет список функций до самой точки входа в программу (функции main() ). Если ошибка случилась где-то в подключаемой библиотеке, предположите, что ошибка все-таки в вашей программе — это случается гораздо чаще. Найдите по стектрейсу, откуда в вашем коде вызывается библиотечная функция, и продолжайте искать.
Шаг 5: Выясните природу ошибки
Ошибки могут проявлять себя по-разному, но большинство из них можно отнести к той или иной категории. Вот наиболее частые.
- Ошибка на единицу
Вы начали цикл for с единицы вместо нуля или наоборот. Или, например, подумали, что метод .count() или .length() вернул индекс последнего элемента. Проверьте документацию к языку, чтобы убедиться, что нумерация массивов начинается с нуля или с единицы. Эта ошибка иногда проявляется в виде исключения Index out of range . - Состояние гонки
Ваш процесс или поток пытается использовать результат выполнения дочернего до того, как тот завершил свою работу. Ищите использование sleep() в коде. Возможно, на мощной машине дочерний поток выполняется за миллисекунду, а на менее производительной системе происходят задержки. Используйте правильные способы синхронизации многопоточного кода: мьютексы, семафоры, события и т. д. - Неправильные настройки или константы
Проверьте ваши конфигурационные файлы и константы. Я однажды потратил ужасные 16 часов, пытаясь понять, почему корзина на сайте с покупками виснет на стадии отправки заказа. Причина оказалась в неправильном значении в /etc/hosts , которое не позволяло приложению найти ip-адрес почтового сервера, что вызывало бесконечный цикл в попытке отправить счет заказчику. - Неожиданный null
Бьюсь об заклад, вы не раз получали ошибку с неинициализированной переменной. Убедитесь, что вы проверяете ссылки на null , особенно при обращении к свойствам по цепочке. Также проверьте случаи, когда возвращаемое из базы данных значение NULL представлено особым типом. - Некорректные входные данные
Вы проверяете вводимые данные? Вы точно не пытаетесь провести арифметические операции с введенными пользователем строками? - Присваивание вместо сравнения
Убедитесь, что вы не написали = вместо == , особенно в C-подобных языках. - Ошибка округления
Это случается, когда вы используете целое вместо Decimal , или float для денежных сумм, или слишком короткое целое (например, пытаетесь записать число большее, чем 2147483647, в 32-битное целое). Кроме того, может случиться так, что ошибка округления проявляется не сразу, а накапливается со временем (т. н. Эффект бабочки). - Переполнение буфера и выход за пределы массива
Проблема номер один в компьютерной безопасности. Вы выделяете память меньшего объема, чем записываемые туда данные. Или пытаетесь обратиться к элементу за пределами массива. - Программисты не умеют считать
Вы используете некорректную формулу. Проверьте, что вы не используете целочисленное деление вместо взятия остатка, или знаете, как перевести рациональную дробь в десятичную и т. д. - Конкатенация строки и числа
Вы ожидаете конкатенации двух строк, но одно из значений — число, и компилятор пытается произвести арифметические вычисления. Попробуйте явно приводить каждое значение к строке. - 33 символа в varchar(32)
Проверяйте данные, передаваемые в INSERT , на совпадение типов. Некоторые БД выбрасывают исключения (как и должны делать), некоторые просто обрезают строку (как MySQL). Недавно я столкнулся с такой ошибкой: программист забыл убрать кавычки из строки перед вставкой в базу данных, и длина строки превысила допустимую как раз на два символа. На поиск бага ушло много времени, потому что заметить две маленькие кавычки было сложно. - Некорректное состояние
Вы пытаетесь выполнить запрос при закрытом соединении или пытаетесь вставить запись в таблицу прежде, чем обновили таблицы, от которых она зависит. - Особенности вашей системы, которых нет у пользователя
Например: в тестовой БД между ID заказа и адресом отношение 1:1, и вы программировали, исходя из этого предположения. Но в работе выясняется, что заказы могут отправляться на один и тот же адрес, и, таким образом, у вас отношение 1:многим.
Если ваша ошибка не похожа на описанные выше, или вы не можете найти строку, в которой она появилась, переходите к следующему шагу.
Шаг 6: Метод исключения
Если вы не можете найти строку с ошибкой, попробуйте или отключать (комментировать) блоки кода до тех пор, пока ошибка не пропадет, или, используя фреймворк для юнит-тестов, изолируйте отдельные методы и вызывайте их с теми же параметрами, что и в реальном коде.
Попробуйте отключать компоненты системы один за другим, пока не найдете минимальную конфигурацию, которая будет работать. Затем подключайте их обратно по одному, пока ошибка не вернется. Таким образом вы вернетесь на шаг 3.
Шаг 7: Логгируйте все подряд и анализируйте журнал
Пройдитесь по каждому модулю или компоненту и добавьте больше сообщений. Начинайте постепенно, по одному модулю. Анализируйте лог до тех пор, пока не проявится неисправность. Если этого не случилось, добавьте еще сообщений.
Ваша задача состоит в том, чтобы вернуться к шагу 3, обнаружив, где проявляется ошибка. Также это именно тот случай, когда стоит использовать сторонние библиотеки для более тщательного логгирования.
Шаг 8: Исключите влияние железа или платформы
Замените оперативную память, жесткие диски, поменяйте сервер или рабочую станцию. Установите обновления, удалите обновления. Если ошибка пропадет, то причиной было железо, ОС или среда. Вы можете по желанию попробовать этот шаг раньше, так как неполадки в железе часто маскируют ошибки в ПО.
Если ваша программа работает по сети, проверьте свитч, замените кабель или запустите программу в другой сети.
Ради интереса, переключите кабель питания в другую розетку или к другому ИБП. Безумно? Почему бы не попробовать?
Если у вас возникает одна и та же ошибка вне зависимости от среды, то она в вашем коде.
Шаг 9: Обратите внимание на совпадения
- Ошибка появляется всегда в одно и то же время? Проверьте задачи, выполняющиеся по расписанию.
- Ошибка всегда проявляется вместе с чем-то еще, насколько абсурдной ни была бы эта связь? Обращайте внимание на каждую деталь. На каждую. Например, проявляется ли ошибка, когда включен кондиционер? Возможно, из-за этого падает напряжение в сети, что вызывает странные эффекты в железе.
- Есть ли что-то общее у пользователей программы, даже не связанное с ПО? Например, географическое положение (так был найден легендарный баг с письмом за 500 миль).
- Ошибка проявляется, когда другой процесс забирает достаточно большое количество памяти или ресурсов процессора? (Я однажды нашел в этом причину раздражающей проблемы «no trusted connection» с SQL-сервером).
Шаг 10: Обратитесь в техподдержку
Наконец, пора попросить помощи у того, кто знает больше, чем вы. Для этого у вас должно быть хотя бы примерное понимание того, где находится ошибка — в железе, базе данных, компиляторе. Прежде чем писать письмо разработчикам, попробуйте задать вопрос на профильном форуме.
Ошибки есть в операционных системах, компиляторах, фреймворках и библиотеках, и ваша программа может быть действительно корректна. Но шансы привлечь внимание разработчика к этим ошибкам невелики, если вы не сможете предоставить подробный алгоритм их воспроизведения. Дружелюбный разработчик может помочь вам в этом, но чаще всего, если проблему сложно воспроизвести вас просто проигнорируют. К сожалению, это значит, что нужно приложить больше усилий при составлении багрепорта.
Полезные советы (когда ничего не помогает)
- Позовите кого-нибудь еще.
Попросите коллегу поискать ошибку вместе с вами. Возможно, он заметит что-то, что вы упустили. Это можно сделать на любом этапе. - Внимательно просмотрите код.
Я часто нахожу ошибку, просто спокойно просматривая код с начала и прокручивая его в голове. - Рассмотрите случаи, когда код работает, и сравните их с неработающими.
Недавно я обнаружил ошибку, заключавшуюся в том, что когда вводимые данные в XML-формате содержали строку xsi_type=’xs:string’ , все ломалось, но если этой строки не было, все работало корректно. Оказалось, что дополнительный атрибут ломал механизм десериализации. - Идите спать.
Не бойтесь идти домой до того, как исправите ошибку. Ваши способности обратно пропорциональны вашей усталости. Вы просто потратите время и измотаете себя. - Сделайте творческий перерыв.
Творческий перерыв — это когда вы отвлекаетесь от задачи и переключаете внимание на другие вещи. Вы, возможно, замечали, что лучшие идеи приходят в голову в душе или по пути домой. Смена контекста иногда помогает. Сходите пообедать, посмотрите фильм, полистайте интернет или займитесь другой проблемой. - Закройте глаза на некоторые симптомы и сообщения и попробуйте сначала.
Некоторые баги могут влиять друг на друга. Драйвер для dial-up соединения в Windows 95 мог сообщать, что канал занят, при том что вы могли отчетливо слышать звук соединяющегося модема. Если вам приходится держать в голове слишком много симптомов, попробуйте сконцентрироваться только на одном. Исправьте или найдите его причину и переходите к следующему. - Поиграйте в доктора Хауса (только без Викодина).
Соберите всех коллег, ходите по кабинету с тростью, пишите симптомы на доске и бросайте язвительные комментарии. Раз это работает в сериалах, почему бы не попробовать?
Что вам точно не поможет
- Паника
Не надо сразу палить из пушки по воробьям. Некоторые менеджеры начинают паниковать и сразу откатываться, перезагружать сервера и т. п. в надежде, что что-нибудь из этого исправит проблему. Это никогда не работает. Кроме того, это создает еще больше хаоса и увеличивает время, необходимое для поиска ошибки. Делайте только один шаг за раз. Изучите результат. Обдумайте его, а затем переходите к следующей гипотезе. - «Хелп, плиииз!»
Когда вы обращаетесь на форум за советом, вы как минимум должны уже выполнить шаг 3. Никто не захочет или не сможет вам помочь, если вы не предоставите подробное описание проблемы, включая информацию об ОС, железе и участок проблемного кода. Создавайте тему только тогда, когда можете все подробно описать, и придумайте информативное название для нее. - Переход на личности
Если вы думаете, что в ошибке виноват кто-то другой, постарайтесь по крайней мере говорить с ним вежливо. Оскорбления, крики и паника не помогут человеку решить проблему. Даже если у вас в команде не в почете демократия, крики и применение грубой силы не заставят исправления магическим образом появиться.
Ошибка, которую я недавно исправил
Источник: tproger.ru