Подтвердить что ты не робот

Как вы используете gdb для отладки вашего кода?

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

4b9b3361

Ответ 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.