#gcc #gdb #mapping #symbol-table
#gcc #gdb #сопоставление #таблица символов
Вопрос:
У меня есть простой файл .c:
$ cat a.c
int i=0;
int j;
static int l=4;
void k(){}
void main(){
k();
}
Я попытался скомпилировать его с помощью «-Og», чтобы включить отладочную информацию. Сотрудник GCC говорит
-Og оптимизирует процесс отладки.
-Og обеспечивает оптимизацию, которая не мешает отладке.
Но когда я использую «gdb a.out» и пытаюсь «list», он говорит:
(gdb) l
Таблица символов не читается. Пожалуйста, используйте команду «файл».
Ну, это так странно, как я и ожидал, если я использую gcc a.c -g
, «список» в gdb в порядке. Почему это?
Ответ №1:
-Og — это переключатель оптимизации. Он позволяет любые оптимизации, которые не мешают отладке, но ничего не говорит об отладочной информации.
-g включает отладочную информацию (которая обычно представляет собой отдельный раздел, не связанный с кодом).
Итак, используйте -Og -g или аналогичный, чтобы включить отладочную информацию и оптимизации отладки.
Ваша сборка с -g включила только отладочную информацию, но оставила оптимизацию на уровне по умолчанию (который полностью отключен).
Больше информации о параметрах отладки в руководстве GCC, включая это: «Если вы не используете какой-либо другой вариант оптимизации, рассмотрите возможность использования -Og (см. Параметры оптимизации) с -g . При отсутствии опции -O некоторые проходы компилятора, которые собирают информацию, полезную для отладки, вообще не выполняются, так что -Og может привести к улучшению процесса отладки. «