Как вы относитесь к прерывистому ошибок?

голоса
31

сценарий

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

проблема

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

Вопрос

Как вы идете о проверке ваших изменений?

Я думаю, что это очень знакомый сценарий для тех, кто спроектированного программного обеспечения, поэтому я уверен, что существует множество подходов и наиболее эффективных методов борьбы с ошибками, как это. Мы в настоящее время смотрим на одну из этих проблем на нашем проекте, где я провел некоторое время решения вопроса, но не смогли подтвердить свои подозрения. Коллега является замочить тестирование моего исправления в надежде, что «день работает без сбоя» приравнивает к «это фиксируется». Тем не менее, я предпочел бы более надежный подход, и я понял, что есть богатый опыт здесь на SO.

Задан 09/12/2008 в 15:31
источник пользователем
На других языках...                            


18 ответов

голоса
12

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

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

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

Ответил 09/12/2008 в 15:40
источник пользователем

голоса
7

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

Для определения причины: Если ваша платформа позволяет, подключить некоторые посмертные отладки в проблему.

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

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

Даже при всей этой информации, вы можете в конечном итоге исправление ошибки, которая выглядит как, но это не так, тот, что клиент видит.

Ответил 09/12/2008 в 15:40
источник пользователем

голоса
5

Я использую то , что я называю «тяжелый стиль защитного программирования» : добавить утверждает во всех модулях , которые , кажется , связаны с проблемой. Что я имею в виду, добавить много утверждает , утверждает доказательства, утверждают состояние объектов во всех своих ЧЛЕНОВ, утверждают «ENVIRONNEMENT» состояние и т.д.

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

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

Ответил 09/12/2008 в 15:47
источник пользователем

голоса
5

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

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

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

Ответил 09/12/2008 в 15:39
источник пользователем

голоса
4

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

Ответил 09/12/2008 в 15:39
источник пользователем

голоса
2

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

Вот некоторые рискованный код в C:

const int NITER = 1000;
int thread_unsafe_count = 0;
int thread_unsafe_tracker = 0;

void* thread_unsafe_plus(void *a){
  int i, local;
  thread_unsafe_tracker++;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local++;
    thread_unsafe_count+=local;
  };
}
void* thread_unsafe_minus(void *a){
  int i, local;
  thread_unsafe_tracker--;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local--;
    thread_unsafe_count+=local;
  };
}

которые я могу проверить (в PThreads enironment) с:

pthread_t th1, th2;
pthread_create(&th1,NULL,&thread_unsafe_plus,NULL);
pthread_create(&th2,NULL,&thread_unsafe_minus,NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
if (thread_unsafe_count != 0) {
  printf("Ah ha!\n");
}

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

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

Ответил 09/12/2008 в 18:24
источник пользователем

голоса
2

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

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

Ответил 09/12/2008 в 15:48
источник пользователем

голоса
1

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

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

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

Ответил 09/12/2008 в 18:32
источник пользователем

голоса
1

Для трудных для воспроизведите ошибки, первый шаг, как правило, документация. В области кода, неисправный, модифицировать код, чтобы быть гипер-Явным: Одна команды в каждой строку; тяжелая, дифференцированная обработка исключений; многословен, даже многословной отладочный вывод. Таким образом, даже если вы не можете воспроизвести или исправить ошибку, вы можете получить гораздо больше информации о причине следующий раз, когда неудача видела.

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

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

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

Ответил 09/12/2008 в 18:19
источник пользователем

голоса
1

Конкретный сценарий

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

Проблема возникает, когда пользователь взаимодействует с пользовательским интерфейсом (а TabControl быть точным) на определенной стадии процесса. Это не всегда происходит, и я считаю, что это происходит потому, что окно времени для задачи будет выставлена ​​небольшое. Я подозреваю, что инициализация UserControl (мы в .NET, используя C #) совпадает с событием изменения состояния из другой области применения, что приводит к шрифту расположен. Между тем, еще один контроль (а Label) пытается нарисовать свою строку с этим шрифтом, а следовательно, и аварии.

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

Подход

Мой подход был первым смотреть на трассировке стеки из наших отчетов о сбоях и изучить код Microsoft с помощью отражателя. К сожалению, это привело к GDI + коллировать с небольшим количеством документации, которая только возвращает номер для ошибки - .NET превращает это в довольно бесполезное сообщение, указывающее то, что является недопустимым. Отлично.

Оттуда я пошел посмотреть на то, что вызов в коде приводит к этой проблеме. Стек начинается с циклом обработки сообщений, а не в коде, но я нашел вызов Update () в общей площади под подозрением и, используя инструментальные (следы и т.п.), мы смогли подтвердить около 75% уверенности, что это был источник сообщения краски. Однако, это не источник ошибки - просить ярлык рисовать не является преступлением.

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

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

Вывод

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

Ответил 09/12/2008 в 16:21
источник пользователем

голоса
1

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

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

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

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

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

Ответил 09/12/2008 в 16:17
источник пользователем

голоса
1

Некоторые вопросы, которые вы могли бы спросить себя:

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

Если код никогда не работал подход был бы другим естественным путем.

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

Ответил 09/12/2008 в 15:53
источник пользователем

голоса
1

В этой ситуации, когда ничего не работает, я представлю дополнительную регистрацию.

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

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

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

Ответил 09/12/2008 в 15:47
источник пользователем

голоса
1

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

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

Я думаю, что вы совершенно правы иметь дело с подходом вашего colleuge в.

Ответил 09/12/2008 в 15:44
источник пользователем

голоса
0

Просто: спросить у пользователя, который сообщил об этом.

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

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

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

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

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

[1] Если вы когда-либо сообщали об ошибке, вы, скорее всего, знаете, что много раз ответ от команды разработки / обслуживания каким-то отрицательным с точки конечных пользователей зрения или не будет никакого ответа на все - особенно в ситуациях, когда ошибка не может быть воспроизведена командой разработчиков.

Ответил 05/09/2014 в 11:50
источник пользователем

голоса
0

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

Как добраться до точки, где вы понимаете, ошибка?

Инструмент код (срубы, как сумасшедший). Работа с QA - они хороши при воссоздании проблемы, и вам нужно организовать, чтобы иметь полный набор инструментов DEV доступны для вас на своих машинах. Использование автоматизированных средств для неинициализированными памяти / ресурсов. Попросту смотреть на код. Не простое решение есть.

Ответил 09/12/2008 в 19:56
источник пользователем

голоса
0

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

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

Ответил 09/12/2008 в 19:06
источник пользователем

голоса
0

Эти проблемы всегда были вызваны следующими причинами:

  1. Проблемы с памятью
  2. Резьбонарезной проблемы

Чтобы решить эту проблему, вы должны:

  • Инструмент код (Добавить заявления в журнале)
  • Код Обзор резьб
  • Код Обзор распределения памяти / разыменования

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

Ответил 09/12/2008 в 15:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more