Как Вы исправляете ошибку, которую Вы не можете копировать?

Не уверенный, если это - лучший способ, но это работает:

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
63
задан cdeszaq 12 August 2009 в 20:44
поделиться

13 ответов

Они известны как Heisenbugs .

Язык

У разных языков программирования будет свой вид ошибок.

C

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

Java

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

JavaScript

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

Среда

В зависимости от сложности среды, в которой работает приложение (содержащее ошибку), единственный выход - упростить среду. Выполняется ли приложение:

  • на сервере?
  • на рабочем столе?
  • в веб-браузере?

В какой среде приложение вызывает проблему?

  • разработка?
  • тест?
  • production?

Закройте посторонние приложения, завершите фоновые задачи, остановите все запланированные события (задания cron), удалите плагины и удалите надстройки браузера.

Сеть

Поскольку для этого важна сеть множество приложений:

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

Согласованность

Исключите как можно больше неизвестных:

  • Изолируйте архитектурные компоненты.
  • Удалите несущественные или, возможно, проблемные (конфликтующие) элементы.
  • Деактивируйте различные модули приложений.

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

Ведение журнала

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

Аппаратное обеспечение

Если с программным обеспечением все в порядке, рассмотрите аппаратные неисправности:

  • Надежны ли физические сетевые соединения?
  • Есть ли свободные кабели?
  • ] Правильно ли установлены микросхемы?
  • Все ли кабели имеют чистые соединения?
  • Чистая ли рабочая среда и нет ли пыли?
  • Были ли какие-либо скрытые устройства или кабели повреждены грызунами или насекомыми ?
  • Есть ли сбойные блоки на дисках?
  • Работают ли вентиляторы процессора?
  • Может ли материнская плата питать все компоненты? (ЦП, сетевая карта, видеокарта, диски и т. Д. не по сети)? Испытывают ли другие серверы такие же проблемы? База данных удалена? Можно ли использовать локальную базу данных?

    Прошивка

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

    • Обновлена ​​ли BIOS компьютера?
    • Работает ли батарея BIOS?
    • BIOS ли BIOS. часы и системные часы синхронизированы?

    Время и статистика

    Проблемы с синхронизацией трудно отследить:

    • Когда возникает проблема?
    • Как часто?
    • Какие другие системы работают в это время?
    • Зависит ли приложение от времени (например, дополнительные дни или секунды вызовут проблемы)?

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

    Управление изменениями

    Иногда проблемы возникают после обновления системы.

    • Когда проблема впервые возникла?
    • Что изменилось в среде (аппаратном и программном обеспечении)?
    • Что происходит после отката к предыдущей версии?
    • Какие различия существуют между проблемной версией и хорошей версией ?

    Управление библиотеками

    В разных операционных системах существуют разные способы распространения конфликтующих библиотек:

    • Windows имеет DLL Hell .
    • Unix может иметь множество неработающих символических ссылок.
    • Библиотека Java файлы могут быть одинаково кошмарными для разрешения.

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

    Java

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

    Используйте инструмент управления библиотекой, такой как Maven или Ivy .

    Отладка

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

    Sleep

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

    Code Review

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

    Космическое излучение

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

    Инструменты

    Редко, но это случается, особенно для нишевых инструментов (например, компилятор микроконтроллера C, страдающий от переполнение таблицы символов).

78
ответ дан 24 November 2019 в 16:17
поделиться

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

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

0
ответ дан 24 November 2019 в 16:17
поделиться

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

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

1
ответ дан 24 November 2019 в 16:17
поделиться

Обсудить проблему, прочитать код, часто довольно много. Часто мы делаем это парами, потому что обычно можно довольно быстро исключить возможности аналитически.

2
ответ дан 24 November 2019 в 16:17
поделиться

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

  1. Работайте в обратном направлении от указанного симптома. Подумайте про себя ... «если бы я хотел вызвать симптом, о котором сообщалось, какой фрагмент кода мне нужно было бы выполнить, и как мне добраться до него, и как я доберусь до этого?» D ведет к C ведет к B ведет к A. Примите тот факт, что, если ошибка не воспроизводится, обычные методы не помогут. Мне приходилось смотреть на код в течение многих часов с подобными мыслями, чтобы найти какие-то ошибки. Обычно это оказывается что-то действительно глупым.

  2. Помните первый закон отладки Боба: если вы не можете что-то найти, это потому, что вы ищете не в том месте: -)

3
ответ дан 24 November 2019 в 16:17
поделиться

Есть два типа ошибок, которые нельзя воспроизвести. Типа, обнаруженного вами, и типа, обнаруженного кем-то другим.

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

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

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

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

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

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

снова наткнется на это. Если это трудно воспроизвести, то это также случается редко и, вероятно, не причинит слишком большого ущерба, если это произойдет еще несколько раз.

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

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

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

3
ответ дан 24 November 2019 в 16:17
поделиться

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

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

  • По возможности добавьте дополнительные записи, чтобы у вас было больше данных при следующем появлении ошибки.
  • Спросите пользователей, могут ли они воспроизвести ошибку. Если да, вы можете попросить их воспроизвести это, наблюдая через плечо, и, надеюсь, выяснить, что вызывает ошибку.
6
ответ дан 24 November 2019 в 16:17
поделиться

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

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

7
ответ дан 24 November 2019 в 16:17
поделиться

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

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

Наконец, как сказал Дэвид, внимательно изучите код.

2
ответ дан 24 November 2019 в 16:17
поделиться

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

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

Сообщает ли ваше приложение номер версии, номер сборки и т. д.? Это необходимо, чтобы точно определить, какую версию вы отлаживаете (или нет!).

Если вы можете инструментировать свое приложение (например, с помощью JMX, если вы работаете в мире Java), то инструментируйте рассматриваемую область. Хранить статистику, например, запросы + параметры, время выполнения и т. Д. Используйте буферы для хранения последних "n"

13
ответ дан 24 November 2019 в 16:17
поделиться

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

3
ответ дан 24 November 2019 в 16:17
поделиться

Вносите случайные изменения, пока что-то не сработает: -)

3
ответ дан 24 November 2019 в 16:17
поделиться

Если вы не можете воспроизвести это, вы можете исправить это, но не можете знать, что вы исправили это.

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

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

I ' у него были хорошие результаты (больше не появлялись, и код был для этого лучше), и плохие (потратили слишком много времени, не исправляя проблему, независимо от того, исправлена ​​ли ошибка или нет). Вот для чего нужны оценки и приоритеты задач.

8
ответ дан 24 November 2019 в 16:17
поделиться
Другие вопросы по тегам:

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