Каковы ваши лучшие советы по отладке? - PullRequest
7 голосов
/ 19 ноября 2008

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

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

C ++

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

  • Узнайте, как включить стандартную библиотеку отладки вашего компилятора и использовать ее! (-D_GLIBCXX_DEBUG для g ++). Это находит много ошибок, а также помогает точно определить, где ошибки произошли.

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

Ответы [ 8 ]

5 голосов
/ 19 ноября 2008

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

0xCDCDCDCD Распределяется в куче, но не инициализируется. Маллок
0xCCCCCCCC Выделено в стеке, но не инициализировано.
0xDDDDDDDD Освободил кучу памяти. Бесплатно
0xFDFDFDFD Заборы «NoMansLand» автоматически размещаются на границе памяти кучи. Никогда не должен быть перезаписан. Если вы перезаписываете один, вы, вероятно, уходите от конца массива.
0xFEEEFEEE Удаленная память от HeapFree
0xBAADF00D Выделен в куче, но не инициализирован. По HeapAlloc
0xABABABAB Не знаю. Если кто-то знает, что это значит, добавьте это.

2 голосов
/ 19 ноября 2008

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

  • Если вы что-то делаете с указателями в C ++, используйте assert (), где это уместно. Фактически, assert () ing-инварианты - это, как правило, хорошая идея, и она может сократить время отладки этой неясной ошибки с недель до минут. Просто не забудьте отключить их в сборке релиза. О, и не помещайте туда ничего, что имеет побочные эффекты, иначе вы будете некоторое время отлаживать свою сборку релиза. Не спрашивайте меня, как я узнал, что один
  • Аналогичным образом, BOOST_STATIC_ASSERT может быть чрезвычайно полезен при проверке несоответствий, которые вы можете проверить во время компиляции
  • Отладчики памяти, такие как PurifyPlus или valgrind являются отличными устройствами для экономии времени и должны быть на компьютере каждого разработчика
  • Узнайте, как правильно использовать отладчик, чтобы вы могли использовать его полную мощность, а не просто использовать его в качестве устройства, позволяющего выполнять пошаговый просмотр кода
  • Если вы действительно застряли, объясните коллеге проблему и код
  • Для C ++ такой инструмент, как FlexeLint / PC-Lint , может помочь точно определить множество труднодоступных вещей после правильной настройки. Вам придется потратить время на его настройку, иначе вы утонете в предупреждениях
  • Если вы пишете на C ++ и используете стандартные контейнеры, напишите код, который использует итераторы, и разрешите отладочной версии среды выполнения (или отладочному STL) отлавливать ваши ошибочные ошибки. Если вы используете индексы для ссылки на элементы, скажем, в std :: vector <>, вам придется найти их самостоятельно
  • Запустите код через различные компиляторы, если можете, и обратите внимание на предупреждения, которые выдает каждый из них. Однако убедитесь, что они находятся на одинаковом уровне языковой совместимости (нет смысла запускать современный код C ++ через MS VC ++ 6), иначе вы в конечном итоге будете преследовать проблемы, которых на самом деле нет.

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

1 голос
/ 19 ноября 2008

Моя отладка (PHP) состоит в основном из добавления к последней строке страницы (с паролем, с IP-блокировкой):

<code>echo '<pre>'; print_r($GLOBALS); echo '
';

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

1 голос
/ 19 ноября 2008

Всегда имейте "err, hr" в вашем окне часов. Я покажу результат, который вы получите от вызова GetLastError. И он динамически обновляется, когда вы шагаете по коду.

0 голосов
/ 12 мая 2010

Иногда запускайте сборку Release вместо сборки Debug. Некоторые ошибки возникают только при включенной оптимизации.

0 голосов
/ 12 мая 2010

У меня нет ссылок на это, но мне сказали, что адрес 0xABABABAB означает «память за пределами выделенной памяти». Надеюсь, это поможет.

0 голосов
/ 19 ноября 2008

В отладчике Visual C ++ вы часто обнаруживаете встроенную однострочную функцию, в которую вы не можете войти и просмотреть ее локальные элементы. Например:

  class foo
  {
     int bar() { int i = func1(); int j = func2(i); return j; }
  };

Чтобы показать значение i, вам нужен кадр стека. Но отладчик не зайдет в bar () и покажет вам содержимое i.

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

Или, может быть, есть другой способ сделать это. :)

0 голосов
/ 19 ноября 2008

Не уверен, что это считается отладкой, но для кода C и Objective-C я считаю Статический анализатор LLVM / Clang неоценимым. Помогает обнаруживать ошибки, утечки памяти и логические ошибки даже до того, как вы увидите их последствия.

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