Как стать автором
Обновить

Комментарии 26

GDB — инструмент, без которого тяжело обойтись.
Последние годы вообще перестал пользоваться отладчиком. Всё мозгую умозрительно, в проблемных местах просто логирую. Меня вылечат? [ Простите за оффтоп ]
Всё зависит от кода, а точнее от его возраста, сложности и читабельности.

Я вот недавно дебажил легаси, который где-то глубоко-глубоко внутри сервера делал
switch (intVariable)
{
    case 0:
        GetA().Foo();
    break;
    case 1:
        GetB().Foo();
    break;
    case 2:
        GetC().Foo();
    break;
    // ...
}


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

Спасибо дебагеру)
Ну-ну. Посмотрю я на вас, когда вам приедет дамп упавшей программы от клиента. Как вы на него без дебаггера смотреть будете. Удачи, ага.
Более 25% проголосовавших поставили плюс. Это значит, что есть среди нас когорта людей, не пользующихся отладчиком. Жалко, что не могу вставить опрос. Было бы любопытно проследить корреляцию между опытом программиста и интенсивностью использования отладчика.
Ну потому что глупость написали, а 25% народа глупости кивнули.

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

Но есть разной степени забагованности и неочевидности код, который отлаживать глазом или логом просто не получится. Также возможны разные условия возникновения ошибки, и часто нужно пробежаться по стеку и посмотреть, кто же сломал данные. Ясное дело, на каком-нибудь GUI отладчик не нужен, но вот алгоритмы, особенно непонятно кем и когда написанные, отлаживать приходиться.
Есть код, который просто нет времени читать. Недавно хотел отредактировать плагин к Firefox'у (исправить ошибку), так когда распаковал, там такой быдлокодище. И как в нём искать этот единственный фрагмент, который мне нужен? Вот для этого и нужен дебаггер — чтобы в него загрузить всё по-быстрому и пройти до нужного куска.
Беда в том, что отладчик не помогает понять программу, он её позволяет прогнать до нужного момента и пошагать… что фокусирует на конкретной причине ошибки без понимания природы её возникновения. Тем самым количество костылей только увеличивается.
Если кто-то начинает править ошибку, не вникая в суть кода… Это клинический случай ;). Уж тут точно не отладчик виноват.
он её позволяет прогнать до нужного момента и пошагать

Отладчик шагает по чему? Правильно, по коду (по строкам или по вызовам функций). Если там мегабайт кода, который тебе не нужен вообще (даже если он хорошо написан, что обычно не так), то это хороший способ пройти к нужному участку КОДА. Ты просто физически его не прочитаешь, не говоря уже о том, что писал его какой-то тяп-ляп копипастер лишь бы работало.
Не говоря о том, что не всегда чужой код понятен, будь он 10 раз правильно написан.

Вчера только закончил отладку сторонней сетевой библиотеки, пользующейся другой библиотекой, написанных на разных языках и переплетенных callback'ми. Мертвое зацикливание, без критических секций, но через большую цепочку вызовов, между несколькими модулями. Я прямо представляю, как я ищу эту ошибку в чужом коде (1), готовой библиотеке без какого-либо исходного кода (2) без отладчика.
Понятный код хотя бы можно понять. А вот копипаст с неправильным выравниванием («умные» однострочники) даже понять невозможно, да и смысл? понимать то, что тебе не нужно, чтобы понять то, что тебе нужно — сложно замотивироваться на такое, особенно когда есть, чем заняться, более интересным и полезным.
Но обратите внимание, что он избыточный. Если первый символ не является черточкой '-', то не важно, что это за символ. Всё равно, терминальный там ноль или любой другой символ. Поэтому мы можем упросить код следующим образом:

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

Явный код лучше подразумеваемого.
Полагаю, автор лишь хотел показать, почему неправильный код работал правильно, а вовсе не призывал сокращать условия.
Всё отличие заключается в том, как записан 0. В первом случае это NULL. Во втором это '\0'. По сути это одно и тоже и код ведёт себя одинаковым образом.
А ведь когда-то идея тихо выполнять неявные преобразования казалась вполне здравой…
Интересно, почему до сих пор не распространен режим, когда наличие неявного преобразование прерывает компиляцию.
Некоторые преобразования уже генерируют варнинг, который можно превратить в ошибку. Скажем, в Visual Studio есть C4800: "'type': forcing value to bool 'true' or 'false' (performance warning)"
А вы не думали о создании сервиса, который бы проверял код проекта? Или там много ручной пост-обработки?
У наших клиентов нет такой потребности.
Почему сразу для клиентов, у такого сервиса могут быть и другие цели. Знаете, например, как я узнал о существовании Coverity? Я когда-то увидел маленькую зеленую полосочку на одном из проектов на гитхабе. Если бы какой-нибудь популярный OSS проект разместил у себя на странице плашку с вашим сервисом, то о вашем продукте узнало бы на много больше человек чем после статьи на хабре.
Для последнего случая есть вполне очевидный выход:
         if (*p == '}' || *p == '\0')
           abort ();
      }
      /* Fall through.  */

так что двойное присваивание здесь не ошибка.
Это очень специфический выход. И всё равно, зачем нужен «alt = 0»?
мы здесь не видим, изменялся ли alt до блока switch.
Какая разница то…
Ошибка, переменная же локальная.
она локальна и видима для всей функции.
И?
Да, но abort завершает функцию и alt больше никто не увидит.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий