Отладка программ

Материал из База знаний Etersoft
Перейти к: навигация, поиск

Отладка программ

Как сделать, чтобы создавался core dump:

ulimit -c unlimited
echo core > /proc/sys/kernel/core_pattern

Можно ещё так (%u - uid, %p - pid, %e - executable):

echo /var/tmp/%u.%e.%p.core > /proc/sys/kernel/core_pattern


echo 1 > /proc/sys/kernel/print-fatal-signals

Включает запись в /var/log/messages о процессах, завершившихся из-за получения сигнала.

Поиск проблем с памятью

Отладку может упростить следующее ПО: Valgrind, Electric Fence, Google Perfomance Tools, Duma.

Duma

Рассмотрим пример отладки программы с помощью Duma (это развитие Electric Fence).

Первоначально надо включить создание core dump файла (см. выше).

Собираем программу с отладочной информацией. Затем запускаем

$ duma ./MyProgram

После завершения программы просматриваем core file:

$ gdb --core=core ./VargusViewer

Затем в gdb вводим

> bt

и просматриваем backtrace.

Google Performance Tools

Не получилось проверить.

Valgrind

Не получилось проверить.

AddressSanitizer

Входит в состав LLVM 3.1 и выше

Статический анализ кода

Для статического анализа кода следует воспользоваться ключами gcc и специальным ПО, таким как Cppcheck.

GCC

Некоторые полезные ключи gcc

   -Wall включает все ворнинги, среди которых совместимость с новым стандартом
   -Wextra несколько ворнингов типа пустых тел в if'ах, сравнение signed и unsigned
   -Winit-self int i = i

Cppcheck

Распознает довольно много, находит следующие ошибки:

   -некоторые memory leaks, например, отсутствие delete и delete[], отсутствие delete в деструкторе
   -выход за границу массива
   -exception'ы, бросаемые в деструкторе
   -разыменование нулевого указателя
   -разыменование после очистки памяти
   -виртуальность деструктора базового класса
   -использование одного и того же итератора для разных контейнеров
   -разные более мелкие штуки

Использование:

   cppcheck -enable=all projectPath

Ссылки

http://www.opennet.ru/tips/940_gdb_debug_core.shtml

http://www.opennet.ru/base/dev/memory_leak_debug.txt.html

http://code.google.com/p/address-sanitizer/wiki/AddressSanitizer

http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page#Documents_and_articles