Что означает “Ошибка карликов: DW_FORM_line_strp использован без обязательного раздела”?

Вопрос или проблема

Я создал обычную программу “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 ожидает найти строки, но по какой-то причине они отсутствуют.

Возможные причины проблемы

  1. Некорректная информация о отладке, сгенерированная GCC: Возможно, версия GCC, которую вы используете, не полностью поддерживает необходимую структуру форматов отладки для работы с последними версиями GDB.

  2. Баг в GDB: Вполне вероятно, что версия GDB, которую вы используете, имеет ошибку, связующуюся с обработкой секций отладки, или несовместима с DWARF, сгенерированным вашей версией GCC на macOS.

Рекомендации по устранению проблемы

  1. Отчет об ошибке: Рекомендуется сообщить об этой ошибке в систему отслеживания ошибок GDB. Обратите внимание, что разработчики GDB могут не активно разрабатывать патчи для macOS, поэтому обратной связи может не быть.

  2. Обходной путь: Попробуйте скомпилировать ваш проект с использованием флага -gdwarf-4. Это может помочь создать информацию отладки в более старом формате, который может лучше поддерживаться текущей версией GDB.

    Пример команды:

    gcc-14 -g -gdwarf-4 hello.c -o hello
  3. Обновление инструментов: Убедитесь, что вы используете самые последние стабильные версии GCC и GDB. Иногда обновления содержат исправления для известных проблем.

Заключение

Ваша ошибка указывает на несовместимость в генерации или интерпретации данных отладки между GCC и GDB. Попробуйте указанные выше пути решения, и, если это не поможет, более детальное изучение проблемы и отчет о ней может быть уместным.

Оцените материал
Добавить комментарий

Капча загружается...