Лучший инструмент для отладки для C и С++

Я работаю над C/С++ в UNIX и часто вижу основные файлы. Много раз основные файлы трудно отлаживать, чтобы найти фактическую причину повреждения ядра или сегментации. Не могли бы вы предложить мне эффективный отладчик?

Ответ 1

Я думаю, что большинство компиляторов C в большинстве вариантов поддержки * nix -g включают в себя отладочные символы в объектных файлах, поэтому если вы выполните:

cc -g -c file1.c
cc -g -c file2.c
cc -g file1.o file2.o -o program
./program

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

Так как я не знаю, на какой платформе вы работаете или какие инструменты у вас есть (или даже на самом деле, какой компилятор C вы используете), трудно дать более конкретные советы. Вы должны прочитать справочную страницу (руководство) для вашего собеседника. В командной строке введите:

man cc

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

В вашей системе Unix, возможно, установлен некоторый тип отладчика. На большинстве Linux-машин, настроенных для разработки C, установлены gdb. gdb может использоваться для запуска вашей программы в режиме отладки или для анализа основного файла. Если у вас есть gdb, вы можете:

gdb ./program

он запустится для запуска вашей программы. Если вы выполните:

gdb ./program ./core

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

(gdb) bt

Здесь (gdb) - это приглашение, а bt - это команда, которая говорит, чтобы создать обратную трассировку. Это означает, что стек вызовов, который показывает, какая функция была в программе, когда произошел сбой, и какая функция называла эту функцию, и какую функцию вызывала эта функция, а также до и до первой функции. Это может сбивать с толку, потому что часто будет отображаться библиотечная функция как самый последний вызов, но это обычно означает, что вы передали некоторые плохие данные где-то по пути, вызывающему проблему.

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

Если это не ваша система, вы должны узнать, какие подобные инструменты есть. Некоторые из графических отладчиков (либо внутри IDE, либо нет) действуют как интерфейсные отладчики командной строки, а некоторые даже поддерживают несколько разных отладчиков командной строки, поэтому, если вы можете использовать один из графических отладчиков, вам, возможно, не придется беспокоиться о том, какой фактический отладчик командной строки задней линии используется.

Ответ 2

Для ошибок сегментации, утечек памяти, неинициализированных данных и т.д. запуск вашей программы с помощью valgrind всегда хорошая идея. Если вас особенно интересуют утечки памяти, рассчитывается опция "--leak-check = full".

И да, узнайте gdb. Это занимает немного времени, но это того стоит.

Ответ 3

Используйте gdb. Это дезактон стандартного Unix C/С++ отладчика, а с версии 7.0 имеет обратимые функции отладки (вы можете вернуться назад во времени). Только эти причины делают это, по крайней мере, целесообразным, чтобы проверить это.

Ответ 4

Мне действительно нравится Totalview. Параллельные функции отладки делают меня таким же, как и я.

Ответ 5

Как правило, gdb - отличный отладчик (хотя для изучения требуется немного времени). Существуют также различные интерфейсы, некоторые с графическим интерфейсом, такие как DDD или cgdb.

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