Книга: Linux программирование в примерах
15.2. Компиляция для отладки
15.2. Компиляция для отладки
Для использования отладчика исходного кода, отлаживаемый исполняемый файл должен быть откомпилирован с опцией компилятора -g
. Эта опция заставляет компилятор внедрять в объектный код дополнительные отладочные идентификаторы; то есть дополнительные сведения, содержащие имена и типы переменных, констант, функций и так далее. Отладчик затем использует эту информацию для приведения в соответствие местоположения исходного кода с исполняемым кодом и получения или сохранения значений переменных в работающей программе.
На многих системах Unix опция компилятора -g
является взаимно исключающей с опцией -O
, которая включает оптимизацию. Это потому, что оптимизации могут вызвать перестановку битов и участков объектного кода, так что больше не будет прямого соответствия с тем, что исполняется, и линейным прочтением исходного кода. Отменив оптимизации, вы значительно облегчаете отладчику установление связи между объектным и исходным кодом, и в свою очередь, пошаговое прохождение программы работает очевидным образом. (Пошаговое исполнение вскоре будет описано.)
GCC, GNU Compiler Collection (коллекция компиляторов GNU), на самом деле допускает совместное использование -g
и -O
. Однако, это привносит как раз ту проблему, которую мы хотим избежать при отладке: следование исполнению в отладчике становится значительно более трудным. Преимуществом совместного использования опций является то, что вы можете оставить отладочные идентификаторы в конечном оптимизированном исполняемом модуле. Они занимают лишь дисковое пространство, а не память. После этого установленный исполняемый файл все еще можно отлаживать при непредвиденных случаях.
По нашему опыту, если нужно использовать отладчик, лучше перекомпилировать приложение с самого начала, использовав лишь опцию -g
. Это значительно упрощает трассировку; имеется достаточно деталей, за которыми нужно следить при простом прохождении написанной программы, не беспокоясь о том, как компилятор переставляет код.
Есть одно предостережение: убедитесь, что поведение программы все еще неправильное. Воспроизводимость является ключевой при отладке; если вы не можете воспроизвести проблему, гораздо труднее ее выследить и исправить. В редких случаях компиляция без опции -O
может устранить ошибку[161]. Обычно проблема остается при компиляции без использования опции -O
, что означает, что на самом деле действительно имеется какая-то разновидность логической ошибки, ждущая своего обнаружения.
- Условная компиляция
- Компиляция с библиотекой curses
- 1.2.1. Компиляция одного исходного файла
- Дополнительные средства отладки
- Компиляция
- Средства отладки
- 3.8.3. Компиляция ядра
- Компиляция ядра
- 15.4. Программирование для отладки
- 15.4.1. Код отладки времени компилирования
- 15.4.1.4. Используйте вспомогательные функции отладки
- 15.4.2.4. Файлы отладки времени исполнения