Я знаю, что есть много популярных и полезных Design Patters.
Есть ли что-то вроде сценариев для отладки? Возможно, не шаблоны, а методологии, которые классифицируются и которые могут использоваться повторно для подобных случаев.
Я знаю, что есть много популярных и полезных Design Patters.
Есть ли что-то вроде сценариев для отладки? Возможно, не шаблоны, а методологии, которые классифицируются и которые могут использоваться повторно для подобных случаев.
Я добавлю еще один шаблон отладки, который кажется довольно очевидным, но еще не был указан:
Уменьшите ошибку до наименьшего возможного случая, а затем используйте это как ваш unit test для любого предлагаемого исправления.
Вот некоторые из них, которые работают для меня:
Я согласен с другими в отношении Unit Testing как "Pattern" для предотвращения ошибок. Кроме того, я хотел бы привести следующие шаги из Отладка: 9 незаменимых правил поиска даже самых исключительных проблем программного и аппаратного обеспечения:
И последнее, на более практичной стороне, Дмитрий Востоков собрал несколько очень приятных отладочных шаблонов в своей книге и веб-сайт.
Когда я просто снимаю в темной отладке, я беру подход двоичного поиска. Я прокомментирую половину моего кода или половину метода, что-то вроде этих строк, затем я сосредоточусь на недокументированной половине. Если проблема все еще существует, я прокомментирую другую половину. И так далее.
Мой подход заключается в использовании научного метода:
Если у вас есть часть кода, который раньше работал, и теперь появляется ошибка, и полная история версий, бинарный поиск в вашей истории может быть очень полезным. Вы выбираете точку на полпути между рабочей и нерабочей фиксацией, и вы ее компилируете и проверяете. Если эта фиксация обнаруживает ошибку, вы знаете, что она началась здесь или раньше, поэтому вы возвращаетесь на полпути между нами и с известным хорошим сообщением и испытанием; в противном случае вы знаете, что ошибка началась позже, так что вы идете вперед на полпути между этим и известным плохим коммите и проверяете там. Вы продолжаете следовать этому процессу, пока не узнаете, какая фиксация ввела ошибку, а затем вы посмотрите, что изменилось, и есть хорошие шансы, что проблема будет очевидна.
git bisect - эффектный инструмент для этой цели. Но вы могли бы теоретически сделать то же самое с кучей tarballs, если это все, что у вас есть.
Конечно, это не сработает, если ошибка повторялась и выходила из дерева несколько раз. И, вероятно, это будет не очень полезно, если ваши коммиты не очень мелкие.
Мне нравится думать, что Unit Testing - это шаблон отладки. Если вы можете воспроизвести проблему, вы можете написать unit test, чтобы сделать ее намного легче отлаживать.
Как только у вас есть "верхний уровень" unit test, который вы используете для отладки проблемы, вы всегда можете создавать более неудачные модульные тесты на более низких и более низких уровнях кода, чтобы помочь вам сосредоточиться на ошибке при добавлении единицы тесты, которые будут полезны долгосрочно в вашем проекте.
Отказоустойчивость - одна. Проблема возникает во всех ОС или связана только с одной ОС?
Продолжайте дихотомию, чтобы определить местоположение и причину проблемы.
Я отлаживаю способ решения проблем. Я использую метод cartesian.
Существует 4 правила:
Или, скажем иначе:
Вам нужно только адаптировать эти правила в контексте программирования.
Если бы мне пришлось возобновить работу, я бы сказал, что проблема/ошибка в этом простое выражение. Сделайте это итеративно.
Существует несколько формальных шаблонов для устранения определенных ошибок:
Однако, я думаю, что большинство ваших отладочных решений и рабочего процесса будут уже разработаны средой, в которой вы используете.
Только некоторые из них я встретил:
У меня есть больше на моем веб-сайте в разделе "Разработка ПО → " Отладка ", если вам интересно.
Это не действительно метод отладки, но я думаю, что мы должны упомянуть предварительное условие отладки, которое, если не будет выполнено, значительно усложнит вашу работу.
Вы не можете начать осмысленную отладку до тех пор, пока ошибка не будет воспроизводимой, с поэтапным рецептом. Если вы получите плохой отчет об ошибках, вы можете столкнуться с необходимостью распознать этот рецепт самостоятельно, но если вы поддерживаете кого-то, вы должны сообщить им, что вы выясните, что рецепт займет больше времени, чем они делают это за вас, и могут даже быть невозможно. Полезный отчет об ошибке должен ответить на три вопроса о том, что я называю формулой отчета об ошибке: 1) что вы сделали? 2) что вы ожидали? 3) что произошло вместо этого?
Конечно, некоторые ошибки - Heisenbugs, по-видимому, временные. Вы все равно должны попытаться получить что-то похожее на инструкцию типа "Если я сделаю следующее, это выглядит примерно в 10% случаев, когда это нежелательный результат".
После того, как у вас есть рецепт, следующий шаг часто кипит до минимального тестового примера, как отмечали другие.
Другие (Xynth, Broam, Moshe) упомянули о необходимости получить минимальный тестовый пример, надеюсь, тот, который можно вставить в ваш пакет unit test. Согласен. Как только вы сможете сделать ошибку, начните отбирать лишние факторы или даже код (как предложил Боб), проверяя каждый шаг, чтобы узнать, исчезла ли ошибка. Если он в cron, запустите его вручную. Если он запускается из графического интерфейса пользователя, попробуйте его из командной строки или простого набора тестов.
Если у вас возникли проблемы, часто бывает полезен обратный подход: создайте крошечную минимальную программу, которая делает пару вещей, которые выполняет багги-процедура. Проверьте его и посмотрите, есть ли у вас ошибка. Затем, шаг за шагом, попробуйте написать рабочую программу, которая делает то, что должна выполнять багги-процедура. В какой-то момент вы можете увидеть выставленную ошибку, и в этом случае у вас теперь есть свой тестовый пример. Или вы можете пройти весь путь к успешной рутине. В этом случае начните трансформировать эту процедуру по строкам в точную копию вашего кода, протестировав по пути, чтобы увидеть, когда появляется ошибка.
Специализируется на отладке шейдера OpenGL, что очень непрозрачно. Dumbing stuff down хорош и необходим, но проверка вывода сложнее обычного программирования приложений, поэтому вам нужны некоторые трюки:
Спасибо за все идеи. Они были действительно полезны. Насколько я понимаю, нет определенного списка шаблонов, таких как Design Patterns, когда дело доходит до исправления ошибок. Возможно, после некоторого момента у каждого свой путь.
Один из подходов, которые я использую, заключается в том, что если процесс выглядит сложным, сидеть и пытаться выяснить, могу ли я сделать повторный факторинг кода. Это дает мне возможность обновить мой взгляд на поведение кода, иметь лучшее понимание и сделать его, возможно, еще более удобным для обслуживания. Метод извлечения - мой любимый для чтения читаемых логических единиц.
Одна из моих любимых вещей заключается в том, что если значение свойства изменяется неожиданным образом, я ставлю точку прерывания на настройщик этого свойства. Я не знаю, возможно ли это сделать с неявными замедлениями свойств (bool myProperty {get; set;}).
Возможно, было бы лучше начать с наличия каталога BUG, показывающего все типы ошибок, классифицированных с описаниями.
спасибо, burak ozdogan
Дмитрий Востоков каталогизирует многие шаблоны отладки http://www.dumpanalysis.org/
Он пишет о многих из них в своем блоге http://www.dumpanalysis.org/blog/
В основном, имея дело с отладкой на платформах Windows, он начал вести блог о gdb в Mac OS.