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 (например, двойное освобождение, указатели контроля доступа из связанного массива, используемые позже и т. Д.).
Было бы полезно, если бы вы могли добавить код к своему вопросу, чтобы дать нам лучшее представление о том, с чем вы столкнулись. Не зная ни одной детали, я бы предложил следующее:
- добавлять
-v
к аргументам вашего исполняемого файла в диалоге отладки. Это напечатает имена ваших тестовых случаев по мере их выполнения. Последнее напечатанное имя, скорее всего, является тестом, в котором происходит ошибка сегментации. - Поместите точку останова в тот контрольный пример, где вы вызываете тестируемый код
- Шагните в свой код, пока не произойдет ошибка.
- Проследите значение, которое вызвало ошибку segfault (чаще всего, висячий указатель) и выясните, почему оно было NULL или неинициализировано.