Почему gcc -Og не генерирует сопоставление строк исходного кода?

#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 может привести к улучшению процесса отладки. «