Как разработчик, как вы используете gdb для отслеживания ошибок в вашем коде? Какие приемы использования методов вы используете для облегчения вашей жизни?
Как вы используете gdb для отладки вашего кода?
Ответ 1
Некоторые подсказки:
- используйте графический интерфейс (kdbg неплохо, ddd, по крайней мере, лучше командной строки gdb, kdevelop имеет хороший интерфейс gdb, но имеет некоторые bgs, nemiver выглядит неплохо, но все еще работает)
- убедитесь, что у вас есть отладочные символы и исходный код для всех важных частей (ваш собственный код, а также некоторые системные библиотеки)
- на RedHat вы можете установить пакеты -debuginfo, чтобы сделать оба символа и исходный код волшебным образом отображаться в отладчике - действительно здорово, потому что вы можете искать вызовы функций libc и т.д.
- на Debian/Ubuntu вы можете установить пакеты -dbg для получения символов; установка соответствующих исходных файлов для системных пакетов кажется трудной, хотя
- Я обычно добавляю вызовы assert() и abort() в местах, которые не должны быть достигнуты, или в местах, которые я хочу изучить (какая-то тяжелая точка останова)
- в идеале вызовы assert() или abort() должны быть обернуты каким-либо методом или макросом, который разрешает их только в отчетах Debug, или даже лучше, что только разрешает их, если установлен определенный env var
- установить обработчик сигналов для SIGSEGV и SIGABRT; лично я проверяю, установлен ли определенный env var перед установкой обработчиков; и в обработчике я выполняю жестко запрограммированную внешнюю команду, которая обычно находится где-то в ~/.local/bin/; эта команда может затем запустить kdbg и прикрепить ее к аварийному приложению. Voila, отладчик появляется, когда ваше приложение делает что-то плохое.
- Если вы используете модульные тесты, вы можете аналогичным образом присоединить отладчик всякий раз, когда не удается выполнить проверку, чтобы проверить приложение.
Ответ 2
В общем, вы находите то, что не так, как должно быть, и работайте назад, пока не поймете, почему.
Наиболее очевидным является наиболее полезное: установка точки останова на функцию или номер строки и прохождение кода по строкам.
Другим удобным советом является наличие функций отображения для всех ваших структур/объектов, даже если они никогда не используются в вашей программе, потому что вы можете запускать эти функции изнутри gdb:
gdb> p show_my_struct(struct)
My custom display of Foo:
...
Точки наблюдения могут быть очень удобными, но могут значительно замедлить работу вашей программы. Они прерывают поток при изменении значения переменной или адреса.:
gdb> watch foo
Watchpoint4: foo
gdb>
Ответ 3
Одной из особенно полезных функций gdb является его способность проверять окончательное состояние сбойной программы.
Чтобы проверить дамп сбоя (или основной файл, как его обычно называют), запустите gdb следующим образом:
gdb <program-name> <core-file>
Например:
gdb a.out core
После запуска этой команды в основном файле gdb расскажет вам, как программа завершена и отображает, где в программе произошла ошибка:
Program terminated with signal 11, Segmentation fault.
#0 0x08048364 in foo () at foo.c:4
4 *x = 100;
В приведенном выше примере вы можете увидеть, что программа завершена с ошибкой сегментации при попытке присвоить значение указателю. Набрав backtrace (или bt или where) в приглашении gdb, вы можете просмотреть полную обратную трассировку программы:
(gdb) backtrace
#0 0x08048364 in foo () at foo.c:4
#1 0x0804837f in main () at foo.c:9
В этот момент вы знаете, что main()
, называемый foo()
и foo()
, разбился в строке 4 при попытке присвоить значение *x
. Много раз это дает достаточно информации, чтобы вы могли исправить ошибку.
Ответ 4
Вы также можете использовать Geany.
Ответ 5
Я делаю много параллельных программных разработчиков, поэтому я обнаружил, что использование простой оболочки в python/ruby, которая позволяет мне иметь gdb, привязанную ко всем процессам на всех узлах, и обратная связь со мной чрезвычайно полезна (I не нашли лучшего способа, если кто-нибудь знает об одном, а не обмануть нить, хотя...)
Я не уверен, насколько опытным является OP, поэтому:
Документы GDB довольно приятные и всеохватывающие. Первая глава - хорошее введение во все основы.
http://www.gnu.org/software/gdb/documentation/
Хотя не gdb, они связаны между собой: Я лично обнаружил, что разбиение сложных строк на помощь в определении того, какие утверждения являются ошибками, помогает.
Кроме того, Valgrind (http://valgrind.org/) действительно приятен/полезен для решения переполнения буфера и т.п. (у меня не было удачи в gdb для этого.
Ответ 6
Базовый, но очень полезный. Используйте текст gui с опцией -tui.
Ответ 7
Используйте ddd, визуальный интерфейс для gdb. Это позволяет вам делать что-то легко с помощью нескольких щелчков мыши и визуализировать, как работает код, а также в консоли отладчика у вас есть intercative gdb.