Некоторые подсказки:
В целом Вы находите что-то, что не является, как это должно быть и работать назад, пока Вы не понимаете почему.
Самое очевидное является самым полезным: Установка точки останова на функциональном или номере строки и обходе через строку кода с методической точностью.
Другая удобная подсказка должна иметь выставочные функции для всех Ваших структур/объектов, даже если они никогда не используются в Вашей программе, потому что можно выполнить эти функции из gdb:
gdb> p show_my_struct(struct)
My custom display of Foo:
...
Контрольные точки могут быть действительно удобными также, но могут замедлить Вашу программу много. Они повреждают поток, когда значение переменной или обращается к изменениям.:
gdb> watch foo
Watchpoint4: foo
gdb>
Одной особенно полезной функцией gdb является своя способность осмотреть конечное состояние программы, это разрушается.
Для осмотра дампа катастрофического отказа (или базовый файл, как это чаще всего называют), запустите gdb следующим образом:
gdb <название программы> <базовый файл>
Например:
gdb a.out ядро
После выполнения этой команды на базовом файле gdb скажет Вам, как завершенная программа и отображается, где в программе ошибка произошла:
Program terminated with signal 11, Segmentation fault.
#0 0x08048364 in foo () at foo.c:4
4 *x = 100;
В примере выше, Вы видите, что программа, завершенная с сегментацией, дает сбой при попытке присвоить значение указателю. Путем ввода следа (или купленный или где) при подсказке gdb, можно просмотреть полный след программы:
(gdb) backtrace
#0 0x08048364 in foo () at foo.c:4
#1 0x0804837f in main () at foo.c:9
На данном этапе Вы знаете это main()
названный foo()
и foo()
разрушенный на строке 4 при попытке присвоить значение *x
. Много раз это предоставляет достаточно информации, чтобы позволить Вам исправлять ошибку.
Основной, но очень полезный - Использование текст gui с опцией - tui.
Я делаю много параллельной программы dev, таким образом, я нашел, что использование простой обертки в Python/рубине, который позволяет мне иметь gdb, присоединенный ко всем процессам на всех узлах и связывающийся назад со мной, чрезвычайно полезно (я не нашел лучший путь, если кто-либо знает об одном, для не угона потока, хотя...),
Я не уверен, насколько опытный OP, таким образом:
Документы GDB довольно хороши и все затрагивание. Первая глава является хорошим введением во все основы.
http://www.gnu.org/software/gdb/documentation/
Хотя не gdb, они связаны: я лично нашел, что разрушение сложных строк для помощи в определении, какие операторы являются erroring, помогает.
Кроме того, Valgrind (http://valgrind.org/) действительно nice/usefull для занятия переполнением буфера и т.п. (у меня не было удачи с gdb для того, чтобы сделать это.
Используйте ddd, визуальный фронтенд для gdb. Это позволяет Вам сделать вещи легко несколькими щелчками мышью и визуализировать, как код работает, плюс в консоли отладки, у Вас есть intercative gdb.