Вопрос или проблема
Я создал обычную программу “Hello World” на C с помощью gcc 14.2.0 на macOS Sequoia 15.0, и она работала идеально. Однако, когда я попытался отладить её с помощью gdb
, появилось сообщение об ошибке Dwarf Error: DW_FORM_line_strp used without required section
. Что означает это сообщение об ошибке?
bash-3.2$ cat hello.c
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
return 0;
}
bash-3.2$ gcc-14 --version
gcc-14 (Homebrew GCC 14.2.0) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
Это бесплатное программное обеспечение; см. источник для условий копирования. Гарантий НЕТ; даже для ТОВАРНОГО КАЧЕСТВА или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
bash-3.2$ ./hello
Hello World
bash-3.2$ gdb ./hello
GNU gdb (GDB) 15.2
Copyright (C) 2024 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версия 3 или более поздняя <http://gnu.org/licenses/gpl.html>
Это бесплатное программное обеспечение: вы можете изменять и перераспределять его.
Гарантий НЕТ, в той мере, в какой это допускается законом.
Введите "show copying" и "show warranty" для получения подробностей.
Этот GDB был сконфигурирован как "x86_64-apple-darwin23.4.0".
Введите "show configuration" для получения подробной информации о конфигурации.
Инструкции по отчетам об ошибках можно увидеть на:
<https://www.gnu.org/software/gdb/bugs/>.
Найдите руководство GDB и другие документы онлайн на:
<http://www.gnu.org/software/gdb/documentation/>.
Для получения помощи введите "help".
Введите "apropos слово", чтобы искать команды, связанные со словом "слово"...
Чтение символов из ./hello...
Чтение символов из /Users/jianfeiye/test/ctest/hello.dSYM/Contents/Resources/DWARF/hello...
(gdb) list
Dwarf Error: DW_FORM_line_strp used without required section
(gdb) break main
Dwarf Error: DW_FORM_line_strp used without required section
(gdb)
Что означает это сообщение об ошибке?
Это значит, что GDB нашел запись информации DWARF
с кодировкой DW_FORM_line_strp
, которая требует секцию .debug_line_str
, но GDB не нашел эту секцию.
Согласно стандарту:
Если код формы
DW_FORM_line_strp
,DW_FORM_strp
илиDW_FORM_strp_sup
, то строка включается в .debug_line_str, .debug_str или в секцию вспомогательных строк соответственно
В конечном счете, это означает, что либо GCC сгенерировал неправильную отладочную информацию, либо в GDB есть ошибка.
Лучше сообщить об этой ошибке в bugzilla, но немногие разработчики GDB используют MacOS, так что не стоит ожидать быстрого исправления.
Возможная обходная мера: компилировать с -gdwarf-4
.
Ответ или решение
Ошибка, которую вы видите, "Dwarf Error: DW_FORM_line_strp used without required section", связана с проблемами в информации отладки, сгенерированной компилятором GCC. Давайте детально разберем, что это значит и как можно это исправить.
Что означает данная ошибка?
Ошибка указывает на то, что GDB обнаружил элемент информации DWARF с кодом формата DW_FORM_line_strp
, который требует секции .debug_line_str
, однако GDB не смог найти эту секцию.
Согласно стандарту DWARF, если используется форма кода DW_FORM_line_strp
, DW_FORM_strp
или DW_FORM_strp_sup
, то строка должна содержаться в секциях .debug_line_str
, .debug_str
или в дополнительной строковой секции соответственно. В вашем случае GDB ожидает найти строки, но по какой-то причине они отсутствуют.
Возможные причины проблемы
-
Некорректная информация о отладке, сгенерированная GCC: Возможно, версия GCC, которую вы используете, не полностью поддерживает необходимую структуру форматов отладки для работы с последними версиями GDB.
-
Баг в GDB: Вполне вероятно, что версия GDB, которую вы используете, имеет ошибку, связующуюся с обработкой секций отладки, или несовместима с DWARF, сгенерированным вашей версией GCC на macOS.
Рекомендации по устранению проблемы
-
Отчет об ошибке: Рекомендуется сообщить об этой ошибке в систему отслеживания ошибок GDB. Обратите внимание, что разработчики GDB могут не активно разрабатывать патчи для macOS, поэтому обратной связи может не быть.
-
Обходной путь: Попробуйте скомпилировать ваш проект с использованием флага
-gdwarf-4
. Это может помочь создать информацию отладки в более старом формате, который может лучше поддерживаться текущей версией GDB.Пример команды:
gcc-14 -g -gdwarf-4 hello.c -o hello
-
Обновление инструментов: Убедитесь, что вы используете самые последние стабильные версии GCC и GDB. Иногда обновления содержат исправления для известных проблем.
Заключение
Ваша ошибка указывает на несовместимость в генерации или интерпретации данных отладки между GCC и GDB. Попробуйте указанные выше пути решения, и, если это не поможет, более детальное изучение проблемы и отчет о ней может быть уместным.