Какова самая жесткая ошибка, которую Вы когда-нибудь находили и фиксировали? [закрытый]

Его тернарный оператор (?:)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.
63
задан 9 revs, 7 users 57% 23 May 2017 в 10:31
поделиться

72 ответа

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

100%-я восстанавливаемая ошибка.

я разыгрываю Вас нет!

Это то, почему:

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

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

Действительно классический.

201
ответ дан sharkin 24 November 2019 в 16:02
поделиться

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

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

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

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

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

Bryan Cantrill из Sun Microsystems дал превосходный Google Tech Talk на ошибке, он разыскал использование инструмента, он помог разработать названный dtrace.

Технический Разговор является забавным, гиковским, информативным, и очень впечатляющим (и длинный , приблизительно 78 минут).

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

12
ответ дан Tim Stewart 24 November 2019 в 16:02
поделиться

Это вернулось, когда я думал, что C++ и цифровые часы были довольно аккуратны...

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

В этом случае, они были COM-объектами. В ядре системы был компонент, который выделил много извилистых небольших COM-объектов, что все смотрели более или менее то же. Каждый был роздан многим различным клиентам, каждый из которых был ответственен за то, что сделал AddRef() и Release() то же количество раз.

не было способа автоматически вычислить, кто назвал каждого AddRef, и имели ли они Release d.

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

На следующий день я переключился на язык GC'd.*

(*Not на самом деле верный, но было бы хорошее окончание к истории.)

12
ответ дан Jay Bazuzi 24 November 2019 в 16:02
поделиться

У меня была ошибка в консольной игре, которая произошла только после того, как Вы боролись и выиграли долгое сражение босса, и затем только приблизительно в 1 раз в 5. Когда это инициировало, это оставит аппаратные средства 100% втиснутый и неспособный говорить с внешним миром вообще.

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

В конце я нашел проблему (вещь гонки кэша/DMA/прерывания) путем чтения кода много раз в течение 2-3 дней.

12
ответ дан Mike F 24 November 2019 в 16:02
поделиться

Не очень жесткий, но я смеялся много, когда это было раскрыто.

, Когда я обслуживал 24/7 систему обработки заказов для магазина онлайн, клиент жаловался, что его порядок был "усеченным". Он утверждал, что, в то время как порядок он поместил на самом деле содержавшие положения N, система приняла намного меньше положений без любого предупреждения вообще.

После того, как мы проследили поток порядка через систему, следующие факты были показаны. Была хранимая процедура, ответственная за хранение объектов порядка в базе данных. Это приняло список объектов порядка как строка, которая закодировала список (product-id, quantity, price), утраивается как это:

" < 12345, 3, 19.99> < 56452, 1, 8.99> < 26586, 2, 12.99>"

Теперь, автор хранимой процедуры был слишком умен для обращения к чему-либо как обычный парсинг и цикличное выполнение. Таким образом, он непосредственно преобразовал строку в SQL, мультивставляют оператор путем замены "<" с "insert into ... values (" и ">" с ");". Который был все великолепен, если только он не сохранил получившую строку в varchar (8000) переменная!

то, Что произошло, - то, что его "insert ...; insert ...;" было усеченным в 8000-м символе, и для того особого порядка сокращению достаточно "посчастливилось" произойти прямо между insert с, так, чтобы усеченный SQL остался синтаксически корректным .

Позже я узнал, что автор SP был моим боссом.

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

С ФОРТРАНОМ на миникомпьютере Data General в 80-х у нас был случай, где компилятор заставил постоянный 1 (один) рассматриваться как 0 (нуль). Это произошло, потому что некоторый старый код передавал константу значения 1 к функции, которая объявила переменную как параметр ФОРТРАНА, который означал, что это было (предположено быть) неизменно. Из-за дефекта в коде мы делали уроки к переменной параметра, и компилятор радостно изменил данные в ячейке памяти, которую это использовало для постоянного от 1 до 0.

Много несвязанных функций позже у нас был код, который сделал сравнивание с литеральным значением 1, и тест перестанет работать. Я не забываю уставиться на тот код в течение самого долгого времени в отладчике. Я распечатал бы значение переменной, это будет 1 все же тест 'если (нечто.EQ. 1)' перестал бы работать. Мне потребовалось долгое время, прежде чем я думавший попросить, чтобы отладчик распечатал, что это думало значение 1, был. Тогда потребовалось большое получение по запросу волос для прослеживания через код для нахождения, когда постоянный 1 стал 0.

15
ответ дан Bryan Oakley 24 November 2019 в 16:02
поделиться

Первое было то, что наш выпущенный продукт показал ошибку, но когда я пытался отладить проблему, он не произошел. Я думал, что это было "выпуском по сравнению с отладкой" вещь сначала - но даже когда я скомпилировал код в режиме выпуска, я не мог воспроизвести проблему. Я пошел, чтобы видеть, мог ли какой-либо другой разработчик воспроизвести проблему. Нет. После большого расследования (производящий смешанный ассемблерный код / C листинг кода) вывода программы и ступающий через ассемблерный код выпущенного продукта (фу!), я нашел незаконную строку. Но строка смотрела очень хорошо мне! Я тогда имел к поиску, что инструкции по сборке сделали - и конечно же неправильная инструкция по сборке была в выпущенном исполняемом файле. Тогда я проверил исполняемый файл, который произвела моя среда сборки - это имело корректную инструкцию по сборке. Оказалось, что машина сборки так или иначе стала поврежденной и произвела плохой ассемблерный код только для одной инструкции для этого приложения. Все остальное (включая предыдущие версии нашего продукта) произвело идентичный код для других машин разработчиков. После того, как я показал свое исследование менеджеру по программному обеспечению, мы быстро восстановили нашу машину сборки.

19
ответ дан Kevin 24 November 2019 в 16:02
поделиться

Где-нибудь глубоко в кишечнике сетевого приложения была (упрощенная) строка:

if (socket = accept() == 0)
    return false;

//code using the socket()

, Что произошло когда вызов, за которым следуют? socket был установлен на 1. Что делает send(), делают, когда дали 1? (такой как в:

send(socket, "mystring", 7);

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

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

Я просто хочу указать на довольно общую и противную ошибку, которая может происходить в это время области Google:
вставка кода и печально известное минус

Это когда Вы вставка копии некоторый код с минус в нем вместо регулярного дефиса символа ASCII - минус ('-') .

alt text
Плюс, минус (U+2212), Дефис - Минус (U+002D)

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

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

май не быть самой жесткой ошибкой там, но разбивающий достаточно;)

(Спасибо ShreevatsaR для определения инверсии в моем исходном сообщении - см. комментарии)

26
ответ дан 4 revs 24 November 2019 в 16:02
поделиться

Один из продуктов, я помог сборке на своей работе, работал на сайте для клиентов в течение нескольких месяцев, собираясь и счастливо записывая каждое событие, которое это получило к базе данных SQL Server. Это работало очень хорошо в течение приблизительно 6 месяцев, собирая приблизительно 35 миллионов записей или около этого.

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

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

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

При работе над сервером однажды, все еще сборе отладочной информации из приложений, поскольку они отказали, пытаясь выяснить то, что продолжалось, сервер BSoD на мне. Когда сервер возвратился онлайн, я открыл мини-дамп в WinDbg для выяснения, каков незаконный драйвер был. Я получил имя файла и проследил его до фактического файла. После исследования информации о версии в файле я выяснил, что это была часть пакета антивируса McAfee, установленного на компьютере.

Мы отключили антивирус и не имели единственной проблемы с тех пор!!

28
ответ дан Miquella 24 November 2019 в 16:02
поделиться

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

34
ответ дан Dave L. 24 November 2019 в 16:02
поделиться

Мой был аппаратной проблемой...

Назад в день, я использовал DEC VaxStation с большим 21-дюймовым монитором CRT. Мы переместились в лабораторию в нашем новом здании и установили два VaxStations в противоположных углах комнаты. После включения питания мой монитор мерцал как дискотека (да, это были 80-е), но другой монитор не сделал.

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

я помнил, что основанные на CRT мониторы были чувствительны к магнитным полям. На самом деле они были - очень чувствительны к 60 Гц, чередующим магнитные поля. Я сразу подозревал, что что-то в моей рабочей области генерировало 60 Гц, чередующих магнитное поле.

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

Для тестирования этой теории мы преобразовали VaxStation и его 85-фунтовый монитор в портативную систему. Мы поместили всю систему в rollaround корзину и подключили ее к 100-футовому оранжевому кабельному удлинителю конструкции. План состоял в том, чтобы использовать эту установку в качестве портативного измерителя напряженности поля для определения местоположения незаконного элемента оборудования.

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

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

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

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

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

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

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

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

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

43
ответ дан 2 revs, 2 users 98% 24 November 2019 в 16:02
поделиться

Это было на Linux, но, возможно, произошло на фактически любой ОС. Теперь большинство из Вас, вероятно, знакомо с API сокета BSD. Мы счастливо используем его год за годом, и это работает.

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

Мы видели в файлах журнала, что что-то пошло не так, как надо, но было безумно трудно точно определить. Тесты с Рациональным Очищают, сказал, что ничто не было неправильно. Но что-то БЫЛО неправильно. Мы работали над этим в течение многих дней и все больше расстраивались. Это был showblocker, потому что уже согласованный тест вызовет опустошение в приложении.

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

Наконец (и к счастью) я помнил, что крупное количество сокетов могло бы быть проблемой с выбором (), который ожидает изменений состояния на сокетах (может читать / может записать / ошибка). Конечно же, наше приложение начало наносить ущерб точно момент, это достигло сокета с дескриптором 1025. Проблема состоит в том, что выбор () работает с параметрами битового поля. Битовые поля заполнены макросами FD_SET () и друзья, которые не ПРОВЕРЯЮТ ИХ ПАРАМЕТРЫ НА ЗАКОННОСТЬ.

Поэтому каждый раз мы преобладали над 1 024 дескрипторами (каждая ОС имеет свой собственный предел, ядра Linux ванили имеют 1024, фактическое значение определяется как FD_SETSIZE), макрос FD_SET счастливо перезаписал бы свое битовое поле и мусор записи в следующую структуру в памяти.

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

извлеченные Уроки:

  • , даже если API-функции 25 лет и все используют ее, она может иметь темные углы, которые Вы еще не знаете

  • записи памяти, непроверенные в макросах API ЗЛЫЕ

  • , средству отладки нравится, Очищают, не может помочь со всеми ситуациями, особенно когда большая память используется

  • , Всегда имеют платформу для Вашего приложения, если это возможно. Используя его не только увеличивает мобильность, но также и помогает в случае ошибок API

  • много выборов использования приложений (), не думая о пределе сокета. Таким образом, я вполне уверен, можно вызвать ошибки в БОЛЬШОМ КОЛИЧЕСТВЕ популярного программного обеспечения путем простого использования многих много сокетов. К счастью большинство приложений никогда не будет иметь больше чем 1 024 сокетов.

  • Вместо того, чтобы иметь безопасный API, разработчикам ОС нравится возлагать вину на разработчика. Выбор Linux () в странице справочника говорится

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

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

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

Thorsten79

50
ответ дан 8 revs 24 November 2019 в 16:02
поделиться

Это требует знания небольшого количества ассемблера Z-8000, который я объясню, когда мы идем.

я работал над встроенной системой (в ассемблере Z-8000). Различное подразделение компании создавало различную систему на той же платформе и записало библиотеку функций, которые я также использовал на своем проекте. Ошибка была то, что каждый раз я вызвал одну функцию, разрушенная программа. Я проверил все свои исходные данные; они были в порядке. Это должна была быть ошибка в библиотеке - за исключением того, что библиотекой пользовались (и хорошо работал) в тысячах сайтов POS по всей стране.

Теперь, центральные процессоры Z-8000 имеют 16 16-разрядных регистров, R0, R1, R2... R15, который может также быть обращен как 8 32-разрядных регистров, названных RR0, RR2, RR4.. RR14 и т.д. Библиотека была записана с нуля, осуществив рефакторинг набор более старых библиотек. Это были очень чистые и сопровождаемые строгие стандарты программирования. В начале каждой функции каждый регистр, который использовался бы в функции, был продвинут на стек сохранить свое значение. Все было аккуратным & опрятный - они были прекрасны.

, Тем не менее, я изучил список ассемблеров для библиотеки, и я заметил что-то нечетное о той функции---В начале функции, это имело НАЖАТИЕ, RR0 / ПРОДВИГАЮТ RR2, и в конце имел POP RR2 / POP R0. Теперь, если Вы не следовали за этим, это продвинуло 4 значения на стеке в запуске, но только удалило 3 из них в конце. Это - залог провала. Там неизвестное значение на вершине стека, где обратный адрес должен был быть. Функция не могла возможно работать.

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

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

ну, помните, что библиотека была очень хороша о сохранении значений в регистрах, поэтому как только Вы помещаете значение в регистр, это осталось там. R1 имел 0000 в нем. Это всегда имело бы 0000 в нем, когда та функция была вызвана. Ошибка поэтому уехала 0000 на стеке. Таким образом, когда функция возвратилась, она перейдет для обращения 0000, который именно так, оказалось, был RET, которое вытолкает следующее значение (корректный обратный адрес) от стека и перейдет к этому. Данные отлично замаскировали ошибку.

, Конечно, в моем приложении, у меня было различное значение в R1, таким образом, это просто отказало....

60
ответ дан 5 revs, 3 users 95% 24 November 2019 в 16:02
поделиться

Этого не произошло со мной, но друг сказал мне об этом.

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

Это отформатировало бы дату как "среда, 22 сентября 2008", но буфер был одним символом, слишком коротким - таким образом, это только вызовет проблему, когда у Вас было 2 цифры DOM в день с самым длинным именем в месяце с самым длинным именем.

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

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

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

В том же продукте на стороне окон, записанной в Дельфи, у нас была сопоставимая проблема. Здесь продукт берет AutoCAD файлы DXF, импортирует их к внутреннему формату рисунка и представляет их в пользовательском механизме рисунка. Эта стандартная программа импорта не особенно эффективна (она использует много подстроки, копирующей), но это сделало задание. Только в этом случае это не было. Файл на 5 мегабайтов обычно импортирует за 20 секунд, но на одном файле потребовалось 20 минут, потому что объем потребляемой памяти увеличился к гигабайту или больше. Сначала это походило на типичную утечку памяти, но инструменты утечки памяти сообщили, что это убирает, и ручная инспекция кода ничего не подняла также. Проблема оказалась ошибкой в Дельфи 5 средство выделения памяти. В некоторых условиях, которые должным образом воссоздавал этот конкретный файл, это будет подвержено серьезной фрагментации памяти. Система продолжала бы пытаться выделить большие строки и найти, чтобы нигде поместить их кроме выше самого высокого выделенного блока памяти. Интеграция новой библиотеки выделения памяти исправила ошибку, не изменяя строку кода импорта.

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

9
ответ дан Joeri Sebrechts 24 November 2019 в 16:02
поделиться

Когда любимый кролик кролика клиента грыз отчасти через кабель Ethernet. Да. Это было плохо.

9
ответ дан slashmais 24 November 2019 в 16:02
поделиться

Наш сетевой интерфейс, способная к DMA карта ATM, достаточно редко поставил бы поврежденные данные в полученных пакетах. AAL5 CRC проверил как корректный, когда пакет вошел от провода, все же данные, DMAd к памяти будет неправильным. Контрольная сумма TCP обычно ловила бы, у нее, но назад в бурные дни людей ATM вызвали энтузиазм о запуске исходных приложений непосредственно на AAL5, обойдясь без TCP/IP в целом. Мы в конечном счете заметили, что повреждение только произошло на некоторых моделях рабочей станции поставщика (кто должен остаться неназванным), не другие.

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

Мы нашли ошибку в кэше данных поставлющегося ЦП. Кэш в этом процессоре не был когерентным с DMA, требуя, чтобы программное обеспечение явно сбросило его в надлежащие времена. Ошибка была то, что иногда кэш на самом деле не сбрасывал свое содержание, когда сказали, чтобы сделать так.

4
ответ дан DGentry 24 November 2019 в 16:02
поделиться

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

4
ответ дан Jason Etheridge 24 November 2019 в 16:02
поделиться

В основном, что-либо включающее потоки.

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

5
ответ дан PeterAllenWebb 24 November 2019 в 16:02
поделиться

Мое первое "реальное" задание было для компании, которая записала программное обеспечение автоматизации торгового персонала клиент-сервер. Наши клиенты запустили клиентское приложение на своих ноутбуках (15 фунтов), и в конце дня они набрали до наших серверов Unix для синхронизации с базой данных Mother. После серии жалоб мы нашли, что астрономическое количество вызовов отбрасывало в самом начале, во время аутентификации.

После недель отладки, мы обнаруживали, что аутентификация всегда отказавший, если входящий звонок ответил процесс getty на сервере, идентификатор Процесса которого содержал четное число, сопровождаемое сразу 9. Оказывается, что аутентификация была доморощенной схемой, которая зависела от представления с 8 символьными строками PID; ошибка заставила незаконный PID разрушать getty, который повторно метал икру с новым PID. Второй или третий вызов обычно находил приемлемый PID, и автоматический повторный набор сделал ненужным для клиентов вмешаться, таким образом, это не считали значительной проблемой, пока телефонные счета не прибыли в конце месяца.

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

5
ответ дан Adam Liss 24 November 2019 в 16:02
поделиться

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

Некоторые различные примеры:

  1. ffmpeg имеет эту противную привычку к созданию предупреждения о "brainfart обрезающий" (относящийся к случаю, где в потоке обрезающие значения> = 16), когда значения обрезки в потоке были на самом деле совершенно допустимы. Я зафиксировал его путем добавления трех символов: "h->".

  2. x264 имел ошибку, где в чрезвычайно редких случаях (каждый миллионный кадр) с определенными опциями он произведет случайный блок полностью неправильного цвета. Я исправил ошибку путем добавления буквы "O" в двух местах в коде. Выпущенный я написал название c орфографическими ошибками #define в более ранней фиксации.

5
ответ дан Dark Shikari 24 November 2019 в 16:02
поделиться

Мертвая блокировка в моей первой многопоточной программе!

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

5
ответ дан Rômulo Ceccon 24 November 2019 в 16:02
поделиться

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

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

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

Так, когда ноутбук прибыл, он был дан мне для выяснения проблемы. Теперь, синхронизируя включенное присоединение телефонная линия к внутреннему модему, идя в страницу "Communication" нашего приложения и выбирая номер телефона из Выпадающего списка (с последним числом, используемым предварительно выбранный). Числа в DDL были частью настройки и были в основном, количество офиса, количество офиса, снабженного префиксом "+1", количество офиса, снабженного префиксом "9", в случае, если они звонили из отеля и т.д.

Так, я нажимаю значок "COMM" и нажатый возврат. Это набрало в, это соединилось с модемом - и затем сразу отказало. Я усталый еще несколько раз. 100%-я воспроизводимость.

Так, крючковатое данные определяют объем между ноутбуком & телефонная линия, и посмотревший данные, идущие через строку. Это выглядело довольно нечетным... Самая странная часть была то, что я мог считать его!

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

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

я зафиксировал номер телефона и передал его обратно службе поддержки с примечанием, выбирающим парня "Пользователь тупицы недели". (*)

<час>

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

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

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

Это поворачивается, там был ошибка в перемещающей программе для нашей платформы. перемещающая программа не была нулем, инициализирующим раздел ZI, а скорее использующим таблицу перемещения для initialze значения. Так любое время таблица перемещения, измененная в двоичном файле, ошибка переместилась бы. Так просто добавленный printf изменился бы, перемещение представляют в виде таблицы там для ошибки.

8
ответ дан Ted 24 November 2019 в 16:02
поделиться

Моя команда наследовала основанное на CGI, многопоточное веб-приложение C++. Основная платформа была Windows; удаленным, использованием вторичной платформы был Солярис с потоками Posix. Устойчивость на Солярисе была бедствием по некоторым причинам. У нас были различные люди, которые посмотрели на проблему больше года, прочь и на (главным образом прочь), в то время как наши сотрудники отдела продаж успешно продвинули версию Windows.

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

Наконец, старший, исходный разработчик задался вопросом вслух об идее. Мы изучили его и в конечном счете нашли проблему: на Солярисе было время компиляции (или время выполнения?) параметр для корректировки размера стека для исполняемого файла. Это было установлено неправильно: слишком маленький. Так, приложение исчерпывало стек и печатало отслеживания стека, которые были общими отвлекающими маневрами.

Это был истинный кошмар.

извлеченные Уроки:

  • Мозговой штурм, мозговой штурм, мозговой штурм
  • , Если что-то сходит с ума на различной, заброшенной платформе, это - вероятно, атрибут платформы среды
  • , Остерегаются проблем, которые передаются от разработчиков, которые оставляют команду. Если возможно, свяжитесь с предыдущими людьми на персональной основе для добывания информации и фона. Попросите, умоляйте, заключите сделку. Потеря опыта должна быть минимизирована любой ценой.
7
ответ дан Michael Easter 24 November 2019 в 16:02
поделиться

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

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

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

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

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

Я слышал о классическом ошибка еще в старшей школе; терминал, в который можно было войти, только если вы сидели в кресле перед ним. (Он отклонил бы ваш пароль, если бы вы стояли.)

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

В конце концов выяснилось, что какой-то придурок поменял местами пару соседних клавиш на клавиатуре, E / R и C / V IIRC, и когда вы садились, вы набирали вслепую и входили, но когда вы стояли, вам приходилось охотиться и клевать, поэтому вы смотрели на неправильные метки и терпели неудачу.

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

Это было во время моей дипломной работы. Я писал программу для моделирования воздействия высокоинтенсивного лазера на атом гелия с помощью FORTRAN.

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

  • Рассчитать исходное квантовое состояние с помощью программы 1, около 2 часов.
  • run основное моделирование данных с первого шага, для наиболее простых случаев от 20 до 50 часов.
  • затем проанализируйте результат с помощью третьей программы, чтобы получить значимые значения, такие как энергия, торк, импульс

Они должны быть постоянными в целом, но они не были. Они делали всевозможные странные вещи.

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

Таким образом я обнаружил, что написал конец массива, который изменил константу !

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

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