CPPUTest отладка - C++

Я изучаю TDD и использую CppUTest в затмении. Есть ли способ отладить мой код, получая ноющую ошибку сегментации.

Спасибо

2 ответа

Решение

Я не знаю ничего особенного в CppUTest или Eclipse, чтобы помочь вам, но некоторые общие идеи отладки segfault здесь уместны:

  • Добавьте в ваш код операторы очистки (например, printf(...) + fflush(stdout) или fprintf(stderr, ...)) и посмотрите, что будет напечатано. Делайте это в режиме бинарного поиска, используя всего несколько распечаток за раз, пока вы точно не определите , где происходит сбой. Это звучит старомодно, но очень эффективно. Вот руководство, которое я нашел в Google, рассказывающее об этой известной технике: http://www.floccinaucinihilipilification.net/blog/2011/3/24/debugging-via-binary-search.html

  • Скомпилируйте ваш код с отладочными символами и запустите его в отладчике. Когда вы нажмете на свой segfault, попросите обратную трассировку и посмотрите, сможете ли вы выяснить, что произошло. При этом может быть особенно полезно использовать графический отладчик.

  • Запустите ваш код с помощью средства отладки, такого как библиотека отладки malloc или что-то из набора valgrind. Это может выявить проблемы, которые являются коренными причинами ваших segfaults, но не происходят именно в том месте, где генерируется segfault (например, двойное освобождение, указатели контроля доступа из связанного массива, используемые позже и т. Д.).

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

  1. добавлять -vк аргументам вашего исполняемого файла в диалоге отладки. Это напечатает имена ваших тестовых случаев по мере их выполнения. Последнее напечатанное имя, скорее всего, является тестом, в котором происходит ошибка сегментации.
  2. Поместите точку останова в тот контрольный пример, где вы вызываете тестируемый код
  3. Шагните в свой код, пока не произойдет ошибка.
  4. Проследите значение, которое вызвало ошибку segfault (чаще всего, висячий указатель) и выясните, почему оно было NULL или неинициализировано.
Другие вопросы по тегам