Как мне подойти к исправлению невоспроизводимой / случайно возникающей ошибки?

11

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

Любое предложение в поиске проблемы своевременно? Я прошу стратегии здесь.

maz3tt
источник
4
начните исследовать код для ситуаций, которые позволят этой ошибке случиться (вместо того, чтобы делать это наоборот)
Имран Омар Бухш

Ответы:

20

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

  • Как определяется язык? Основано ли это на информации из HTTP-запроса? Основано ли это на информации о сеансе или на полях базы данных? По сути, это может быть проблемой, связанной с тем, как ваше приложение выбирает язык для каждого раздела?
  • Как отображается язык? Вы тянете из файла свойств или базы данных? Возможно ли, что ссылка на правильный язык теряется каким-то образом? Является ли смешанный язык, который вы видите, по умолчанию для сайта?
  • Есть ли связь с клиентской средой? Это связано с первой пулей, но идет немного дальше. У меня были странные проблемы с рендерингом из-за нисходящих прокси-серверов. Как правило, такими типами проблем являются целая страница, которая устарела или обслуживает страницу одного человека для других пользователей (это было неудобно).
  • Используете ли вы значение локального потока? Если запрос обрабатывается более чем одним потоком, локальное значение потока будет иметь различную информацию в зависимости от потока, который работает в данный момент. В среде веб-сервера вы не можете предполагать, что поток, в котором вы начали обработку, будет тем же потоком, в котором вы выполняете обработку, - если только это не является частью спецификации для вашей платформы. Авторы сервера обнаружили, что если они повторно используют небольшой пул потоков и мультиплексируют их в виде блоков, они могут обрабатывать больше запросов одновременно. Даже если у вас есть один поток от начала до конца запроса, сервер может одновременно мультиплексировать другие запросы в этот поток. Вместо локальных потоков рассмотрите привязку этого значения к атрибутам запроса или сеанса.

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

  • Используйте профузное ведение журнала вокруг проблемных зон. Это место, где такой инструмент, как Log4J или Log4Net, действительно может сиять. Эта структура журналирования и другие подобные ей позволяют вам включить регистрацию для определенных категорий, одновременно уменьшая шум для всего остального - все путем изменения файла конфигурации. Вы хотите ввести новые операторы записи в журнал, чтобы выяснить, может ли быть проблема в том, что вы подозреваете. Также убедитесь, что в журналах HTTP-доступа есть вся необходимая информация о каждом запросе (файлы cookie, параметры заголовка http и т. Д.).
  • Попытка смоделировать проблему. Поскольку это происходит время от времени, какова нагрузка на сервер в тот момент, когда это происходит? Вы получаете несколько одновременных запросов от разных языков? Если это так, попытайтесь смоделировать такую ​​нагрузку в вашей тестовой среде. Инструмент, похожий на JMeter, может быть тем, что вам нужно. Вы также хотите иметь возможность подделывать IP-адреса для ваших поддельных клиентов. Помните, что IP-адреса разделены на части, чтобы вы могли выяснить, в какой стране / регионе этот IP-адрес основан на первых двух сегментах адреса.
  • Проблема будет так же , как спорадическая в тестовой среде, но , как вы сузить в вашу истинную причину вы можете исказить результаты , чтобы это произошло более часто , чем это делает в дикой природе. Кроме того, вы можете легче просматривать файлы журналов и пытаться учиться на них.
  • Это итеративный процесс, так что наберитесь терпения. Вы должны вызвать тип нагрузки, который, по вашему мнению, будет воспроизводить ошибку, проверить журналы и уточнить ваши тесты на основе того, что вы найдете. Важным моментом является выявление проблемы , поэтому не поддавайтесь желанию внести некоторые простые исправления, которые могут привести к тому, что реальная проблема возникнет реже.

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

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

Берин Лорич
источник
10

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

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

Я знаю, что это может показаться семантикой, но мысленно обнадеживающе сказать это себе.

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

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

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

Надеюсь, вы сможете найти лидерство.

жилль
источник
даже вызовы Random () не являются действительно случайными, если они не получены из аппаратного генератора белого шума. Они псевдослучайные, что означает, что числа математически распределены в произвольном порядке, насколько это возможно. Но если вы начнете с того же самого начального значения, вы будете получать один и тот же ответ каждый раз.
Берин Лорич
1
@ Берин: я знаю.
Жиль
+1 за "вы просто еще не узнали, как его воспроизвести". Все ошибки имеют коренную причину, иначе они не произошли бы.
Майк С
1
Он не должен быть отключен от Random (), вещи, которые зависят от времени, особенно те, которые связаны с неправильным доступом к общему ресурсу, могут быть очень трудно воспроизвести.
Лорен Печтел
2
@ Жиль: За исключением того, что они не могут быть детерминированными в чем-либо, что вы можете измерить разумно. (Скажем, именно тогда, когда какое-то другое задание было выпущено, у него есть время.)
Лорен Печтел
5

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

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

RSP
источник
2

Автоматизация должна помочь, если одни и те же шаги по воспроизведению иногда оказываются неудачными, автоматизируйте это и поместите в цикл. Запустите в 50000 раз, и это очень вероятно произойдет.

Кирен Джонстон
источник
Событие не случайно, просто кажется случайным. Это может привести к его появлению, но даст вам очень мало информации о том, почему оно появилось.
Джош К
1
@Josh - Если он не может воспроизвести его, это может быть хорошим способом сделать это и получить, например, трассировку стека с отладочными символами. Я полагаю, что это отличный первый шаг - увидеть это из первых рук
Керен Джонстон
Вы предполагаете, что есть стек и что его можно получить. Он не дал нам никакой технической информации о приложении или о том, насколько оно доступно для отладки при такого рода нагрузках. Это не стратегия отладки , это удар молотком, пытаясь поймать точный момент, когда он сломается.
Джош К
@Josh - мой реальный опыт подсказывает мне, что самая ценная вещь в расследовании / исправлении ошибки - это увидеть ее из первых рук. Будь то что-то со временем вы можете видеть, трассировка стека, что-то в журналах или что-то еще. Там, где это было возможно, наличие, казалось бы, случайно возникающих проблем, проверенных в цикле, очень быстро привело меня туда. Если у вас есть другая идея, опубликуйте ее как ответ ради бога - это правильный метод и правильный ответ.
Кирен Джонстон
Я не согласен и считаю, что ответ Берин - правильный путь решения этой проблемы.
Джош К
1

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

jwenting
источник
Нет дерьма ..............
theringostarrs
0

Вы можете обнаружить , когда проблема будет происходит? Если да, можете ли вы надежно сбросить информацию о состоянии системы на этом этапе?

Если на оба эти вопроса дан ответ «да», введите в свой код столько информации, сколько возможно, когда ошибка действительно произойдет, затем подождите.

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

jimwise
источник