Не уверенный, если это - лучший способ, но это работает:
a = ["apple", 1, "banana", 2]
m1 = {}
for x in (a.length / 2).times
m1[a[x*2]] = a[x*2 + 1]
end
b = [["apple", 1], ["banana", 2]]
m2 = {}
for x,y in b
m2[x] = y
end
Они известны как Heisenbugs .
У разных языков программирования будет свой вид ошибок.
Добавление отладочных операторов может сделать проблему невозможной для дублирования , потому что сам оператор отладки сдвигает указатели (достаточно далеко, чтобы избежать SEGFAULT). Проблемы с указателями - это кошмар для отслеживания и репликации, но существуют отладчики (такие как GDB и DDD ), которые могут помочь.
Приложение с несколькими потоками может показывать свои ошибки только с очень конкретным временем или последовательностью событий. Неправильная реализация параллелизма может вызвать взаимоблокировки в ситуациях, которые трудно воспроизвести.
Некоторые веб-браузеры печально известны утечками памяти. Код JavaScript, который нормально работает в одном браузере, может вызывать некорректное поведение в другом браузере. Использование сторонних библиотек, которые были тщательно протестированы тысячами пользователей, может помочь избежать некоторых неясных ошибок.
В зависимости от сложности среды, в которой работает приложение (содержащее ошибку), единственный выход - упростить среду. Выполняется ли приложение:
В какой среде приложение вызывает проблему?
Закройте посторонние приложения, завершите фоновые задачи, остановите все запланированные события (задания cron), удалите плагины и удалите надстройки браузера.
Поскольку для этого важна сеть множество приложений:
Исключите как можно больше неизвестных:
Удалите все различия между производством, тестированием и разработкой. Используйте то же оборудование. Совершенно точно выполните те же шаги, чтобы настроить компьютеры. Согласованность является ключевым моментом.
Используйте большое количество журналов для сопоставления времени, когда произошли события. Изучите журналы на наличие очевидных ошибок, проблем с синхронизацией и т. Д.
Если с программным обеспечением все в порядке, рассмотрите аппаратные неисправности:
Между аппаратным и программным обеспечением находится прошивка.
Проблемы с синхронизацией трудно отследить:
Соберите точные числовые данные о проблеме. Проблема, которая сначала может показаться случайной, на самом деле может иметь закономерность.
Иногда проблемы возникают после обновления системы.
В разных операционных системах существуют разные способы распространения конфликтующих библиотек:
Выполните новую установку операционной системы и включите только поддерживающее программное обеспечение, необходимое для вашего приложения.
Убедитесь, что каждая библиотека используется только один раз. Иногда контейнеры приложений имеют другую версию библиотеки, чем само приложение. Это может быть невозможно воспроизвести в среде разработки.
Используйте инструмент управления библиотекой, такой как Maven или Ivy .
Создайте метод обнаружения, который запускает уведомление (например, журнал, электронная почта, всплывающее окно, звуковой сигнал пейджера), когда происходит ошибка. Используйте автоматическое тестирование для отправки данных в приложение. Используйте случайные данные. Используйте данные, которые охватывают известные и возможные крайние случаи. В конце концов ошибка должна появиться снова.
Стоит повторить то, о чем говорили другие: спите на ней. Проведите время вдали от проблемы, завершите другие задачи (например, документацию). Держитесь подальше от компьютеров и делайте упражнения.
Построчно изучите код и опишите, что каждая строка делает с вами, вашим коллегой или резиновой уткой . Это может привести к пониманию того, как воспроизвести ошибку.
Космические лучи могут переключать биты. Это не такая большая проблема, как в прошлом из-за современной проверки памяти на ошибки. Программное обеспечение для оборудования, которое оставляет защиту Земли, подвержено проблемам, которые просто невозможно воспроизвести из-за случайности космического излучения.
Редко, но это случается, особенно для нишевых инструментов (например, компилятор микроконтроллера C, страдающий от переполнение таблицы символов).
Существуют такие инструменты, как gotomeeting.com, которые вы можете использовать для демонстрации экрана своему пользователю и наблюдения за его поведением. Может быть много потенциальных проблем, таких как количество программного обеспечения, установленного на их машинах, некоторые служебные программы, конфликтующие с вашей программой. Я считаю, что gotomeeting - не единственное решение, но могут быть проблемы с тайм-аутом, проблема с медленным интернетом.
В большинстве случаев я бы сказал, что программное обеспечение не сообщает вам правильные сообщения об ошибках, например, в случае java и c # отслеживать каждые исключения .. не ловите все, но держите точку, где вы можете поймать и зарегистрировать. Ошибки пользовательского интерфейса трудно решить, если вы не используете инструменты удаленного рабочего стола. И в большинстве случаев это может быть ошибка даже в стороннем программном обеспечении.
Попросите пользователя предоставить вам удаленный доступ к своему компьютеру и все увидите сами. Попросите пользователя сделать небольшой видеоролик о том, как он воспроизводит эту ошибку, и отправить его вам.
Конечно, и то, и другое не всегда возможно, но если да, то это может прояснить некоторые вещи. Обычный способ поиска ошибок все тот же: разделение частей, которые могут вызвать ошибку, попытка понять, что происходит, сужение кодового пространства, которое может вызвать ошибку.
Обсудить проблему, прочитать код, часто довольно много. Часто мы делаем это парами, потому что обычно можно довольно быстро исключить возможности аналитически.
Предполагая, что вы уже добавили все журналы, которые, по вашему мнению, могут помочь, но это не так ... На ум приходят две вещи:
Работайте в обратном направлении от указанного симптома. Подумайте про себя ... «если бы я хотел вызвать симптом, о котором сообщалось, какой фрагмент кода мне нужно было бы выполнить, и как мне добраться до него, и как я доберусь до этого?» D ведет к C ведет к B ведет к A. Примите тот факт, что, если ошибка не воспроизводится, обычные методы не помогут. Мне приходилось смотреть на код в течение многих часов с подобными мыслями, чтобы найти какие-то ошибки. Обычно это оказывается что-то действительно глупым.
Помните первый закон отладки Боба: если вы не можете что-то найти, это потому, что вы ищете не в том месте: -)
Есть два типа ошибок, которые нельзя воспроизвести. Типа, обнаруженного вами, и типа, обнаруженного кем-то другим.
Если вы обнаружили ошибку, вы сможете воспроизвести ее. Если вы не можете воспроизвести его, значит, вы просто не учли все факторы, способствующие возникновению ошибки. Вот почему всякий раз, когда у вас есть ошибка, вы должны задокументировать ее. Сохраните журнал, сделайте снимок экрана и т. Д. Если вы этого не сделаете, то как вы вообще сможете доказать, что ошибка действительно существует? Может быть, это просто ложное воспоминание?
Если кто-то другой обнаружил ошибку, и вы не можете ее воспроизвести, очевидно, попросите их воспроизвести ее. Если они не могут это воспроизвести, вы пытаетесь повторить это. Если вы не можете воспроизвести это быстро, игнорируйте это.
Я знаю, что это звучит плохо, но я думаю, что это оправданно. Время, необходимое для воспроизведения ошибки, обнаруженной кем-то другим, очень велико. Если ошибка реальна, это произойдет снова естественным образом. Кто-то, может быть, даже вы, снова наткнетесь на это. Если это трудно воспроизвести, то это также случается редко и, вероятно, не причинит слишком большого ущерба, если это произойдет еще несколько раз.
Вы можете быть намного более продуктивным, если потратите свое время, фактически работая, исправляя другие ошибок и написания нового кода, чем вы будете пытаться воспроизвести загадочную ошибку, о существовании которой вы даже не можете гарантировать. Просто подождите, пока он снова не появится естественным образом, и тогда вы сможете потратить все свое время на его устранение, вместо того, чтобы тратить время на попытки его обнаружить.
снова наткнется на это. Если это трудно воспроизвести, то это также случается редко и, вероятно, не вызовет слишком большого ущерба, если это произойдет еще несколько раз.Вы можете быть намного более продуктивным, если потратите свое время на то, чтобы работать, исправляя другие ошибок и написания нового кода, чем вы будете пытаться воспроизвести загадочную ошибку, о существовании которой вы даже не можете гарантировать. Просто подождите, пока он снова не появится естественным образом, и тогда вы сможете потратить все свое время на его устранение, вместо того, чтобы тратить время на попытки его обнаружить.
снова наткнется на это. Если это трудно воспроизвести, то это также случается редко и, вероятно, не причинит слишком большого ущерба, если это произойдет еще несколько раз.Вы можете быть намного более продуктивным, если потратите свое время, фактически работая, исправляя другие ошибок и написания нового кода, чем вы будете пытаться воспроизвести загадочную ошибку, о существовании которой вы даже не можете гарантировать. Просто подождите, пока он снова не появится естественным образом, и тогда вы сможете потратить все свое время на его устранение, вместо того, чтобы тратить время на попытки его обнаружить.
чем вы будете пытаться воспроизвести загадочную ошибку, о существовании которой вы даже не можете гарантировать. Просто подождите, пока он снова не появится естественным образом, и тогда вы сможете потратить все свое время на его устранение, вместо того, чтобы тратить время на попытки его обнаружить. чем вы будете пытаться воспроизвести загадочную ошибку, о существовании которой вы даже не можете гарантировать. Просто подождите, пока он снова не появится естественным образом, и тогда вы сможете потратить все свое время на его устранение, вместо того, чтобы тратить время на попытки его обнаружить.Это может быть сложно, а иногда почти невозможно. Но мой опыт показывает, что вы рано или поздно сможете воспроизвести и исправить ошибку, если потратите на это достаточно времени (другое дело, если потраченное время того стоит).
Общие предложения, которые могут помочь в в этой ситуации.
Иногда мне просто нужно сесть и изучить код, пока не найду ошибку. Постарайтесь доказать, что ошибка невозможна, и в процессе вы сможете выяснить, где вы могли ошибиться. Если вам действительно удается убедить себя в том, что это невозможно, предположите, что вы где-то напортачили.
Это может помочь добавить набор проверок ошибок и утверждений, чтобы подтвердить или опровергнуть ваши убеждения / предположения. Может случиться что-то такое, чего вы даже не ожидали.
Начните с того, что посмотрите, какие инструменты у вас есть. Например, сбои на платформе Windows переходят в WinQual, поэтому, если это ваш случай, теперь у вас есть информация о аварийном дампе. Можете ли вы использовать инструменты статического анализа, которые обнаруживают потенциальные ошибки, инструменты анализа времени выполнения, инструменты профилирования?
Затем посмотрите на ввод и вывод. Что-нибудь похожее на входные данные в ситуациях, когда пользователи сообщают об ошибке, или что-то неуместное в выходных данных? Составьте список отчетов и найдите закономерности.
Наконец, как сказал Дэвид, внимательно изучите код.
Если это приложение с графическим интерфейсом, то бесценно наблюдать, как клиент генерирует ошибку (или пытается это сделать). Они, несомненно, будут делать то, о чем вы даже не догадывались (не ошибочно, просто по-другому).
В противном случае сконцентрируйте свое ведение журнала в этой области. Регистрируйте почти все (вы можете вытащить это позже) и заставьте свое приложение также сбрасывать свою среду. например, тип компьютера, тип виртуальной машины, используемая кодировка.
Сообщает ли ваше приложение номер версии, номер сборки и т. д.? Это необходимо, чтобы точно определить, какую версию вы отлаживаете (или нет!).
Если вы можете инструментировать свое приложение (например, с помощью JMX, если вы работаете в мире Java), то инструментируйте рассматриваемую область. Хранить статистику, например, запросы + параметры, время выполнения и т. Д. Используйте буферы для хранения последних "n"
измените код, в котором, по вашему мнению, возникла проблема, чтобы где-то была записана дополнительная информация об отладке. когда это произойдет в следующий раз, у вас будет все необходимое для решения проблемы.
Вносите случайные изменения, пока что-то не сработает: -)
Если вы не можете воспроизвести это, вы можете исправить это, но не можете знать, что вы исправили это.
Я сделал все возможное, чтобы объяснить, как возникла ошибка (даже если я этого не сделал) Я не знаю, как могла возникнуть такая ситуация), исправил это и убедился, что, если ошибка появится снова, наши механизмы уведомлений позволят будущему разработчику узнать то, что я хотел бы знать. На практике это означало добавление событий журнала, когда пути, которые могли вызвать ошибку, были пересечены, и были записаны метрики для связанных ресурсов. И, конечно же, удостовериться, что тесты в целом хорошо работают с кодом.
Решение, какие уведомления добавить, является вопросом осуществимости и сортировки. Так что в первую очередь нужно решить, сколько времени разработчика потратить на исправление ошибки. На него нельзя ответить, не зная, насколько серьезна ошибка.
I ' у него были хорошие результаты (больше не появлялись, и код был для этого лучше), и плохие (потратили слишком много времени, не исправляя проблему, независимо от того, исправлена ли ошибка или нет). Вот для чего нужны оценки и приоритеты задач.