2013-07-30 4 views
3

Я пытаюсь проанализировать, почему (довольно большая) программа segfaults. Если программа сработает, она записывает основной дамп в/tmp, который я пытаюсь проанализировать с помощью gdb. Однако, GDB дает мне следующую ошибку:Как изменить версию компиляции?

Reading symbols from /home/user/Executable...Dwarf Error: 
wrong version in compilation unit header (is 4, should be 2) 
[in module /home/user/Executable] 

Я искал немного, и нашел thread на StackOverflow, где автор предполагает, что это результат компиляции части кода (именно в библиотеке, он/она использовал) с другим флагом -g.

Я проверил версию модуля компиляции на мой исполняемый файл (C++) и библиотеки (C) Я использую в моей программе через

readelf --debug-dump=info Executable | grep -A 2 'Compilation Unit @' 

И по-видимому, исполняемый везде версию 4, в то время как библиотека имеет версию 2. Мне интересно, можно ли исправить это и как? Мне также очень любопытно, как эта проблема действительно поднялась в первую очередь (разыгрывание с уровнем отладки с помощью флага -g вообще не помогло).

ТИА

+0

Какая у вас ОС, версия gcc и версия gdb? –

+0

ОС - Debian 6.07, а gcc - в версии 4.8 (мне пришлось скомпилировать ее самостоятельно, так как я использую возможности C++ 11). Я использую версию gdb, поставляемую с Debian (это означает, что это gdb 7.0.1). – user1729210

+0

Да, это и есть причина. Всегда используйте последнюю версию gdb. (Примите свой ответ, чтобы другие сразу увидели, что он сработал). –

ответ

6

Набор входов, которые создают один объектный файл (.o), называется единицей компиляции; для получения дополнительной информации см. wikipedia. Для удобства «единица компиляции» часто сокращается как «CU».

При компиляции CU с информацией об отладке каждый CU имеет секцию информации отладки, которая начинается с заголовка CU; этот заголовок содержит номер версии. Эта отладочная информация находится в формате DWARF.

С течением времени стандарт DWARF развился. Для каждого основного выпуска номер версии изменился. Это гарантирует, что когда производитель DWARF (например, компилятор) создает отладочную информацию, потребитель DWARF (например, отладчик) знает, чего ожидать.

Когда gdb жалуется на версию CU, она действительно жалуется на номер версии, которая находится в заголовке DWARF CU.

Чтобы избежать этой проблемы, как вы обнаружили, вы должны убедиться, что вся ваша программная инструментальная программа (компилятор, компоновщик, отладчик) может «говорить» о той же версии DWARF. Ваше решение по компиляции последней версии gdb является правильным.

1

Я собрал библиотеку с г ++ (вместо GCC), которая привела к желаемому единице компиляции. Однако это все равно привело к ошибке DWARF, вызванной gdb, и поэтому я скомпилировал последнюю версию gdb на машине и, наконец, теперь работает.

3

От GCC 4.8 release notes:

Before GCC 4.8 the default version used was DWARF2. To make GCC 4.8 generate an older DWARF version use -g together with -gdwarf-2 or -gdwarf-3

В моем случае, при добавлении

-gdwarf-2 -gstrict-dwarf 

сделал старый отладчик работать снова. Я согласен с тем, что использование более новой версии GDB является лучшим решением в большинстве случаев.

Смежные вопросы