RPM/debuginfo: различия между версиями

Материал из ALT Linux Wiki
< RPM
Нет описания правки
(→‎Отладка: AT_decl_file)
 
(не показано 13 промежуточных версий 2 участников)
Строка 2: Строка 2:
[[Категория:Devel]]
[[Категория:Devel]]


== Цель ==
= Цель =
Поддержка автоматической генерации подпакетов с дополнительной отладочной информацией<ref>[https://bugzilla.altlinux.org/19707 #19707]</ref>. По использованию см. страницу [[Debuginfo]].
Поддержка автоматической генерации подпакетов с дополнительной отладочной информацией<ref>[https://bugzilla.altlinux.org/19707 #19707]</ref>. По использованию см. страницу [[Debuginfo]].


== Реализация ==
= Реализация =
Доступна начиная с 4.0.4-alt100.14<ref>позднее доводилась, к использованию рекомендуется начиная с 4.0.4-alt100.21</ref>.  Обучена автоматически проставлять зависимости между подпакетами {{pkg|*-debuginfo}}.
Доступна начиная с 4.0.4-alt100.14<ref>позднее доводилась, к использованию рекомендуется начиная с 4.0.4-alt100.21</ref>.  Обучена автоматически проставлять зависимости между подпакетами {{pkg|*-debuginfo}}.


Результаты для Sisyphus и стабильных веток, начиная с t6/p6, складываются в отдельный компонент <tt>debuginfo</tt> (<tt>RPMS.debuginfo</tt>).
Результаты для Sisyphus и стабильных веток, начиная с t6/p6, складываются в отдельный компонент <tt>debuginfo</tt> (<tt>RPMS.debuginfo</tt>).


== Использование ==
= Использование =
При сборке пакета с помощью {{pkg|rpm-build}} >= 4.0.4-alt100.15 будут автоматически порождаться подпакеты {{pkg|*-debuginfo}}, содержащие файлы в {{path|/usr/{lib,src}/debug/}}. На x86_64 с ними работает {{pkg|gdb}} >= 7.2-alt1.
При сборке пакета с помощью {{pkg|rpm-build}} >= 4.0.4-alt100.15 будут автоматически порождаться подпакеты {{pkg|*-debuginfo}}, содержащие файлы в {{path|/usr/{lib,src}/debug/}}. На x86_64 с ними работает {{pkg|gdb}} >= 7.2-alt1.


Строка 21: Строка 21:
  ldd: ERROR: /usr/src/tmp/paraview-buildroot/usr/lib/debug/usr/bin/pvserver.debug: trace failed
  ldd: ERROR: /usr/src/tmp/paraview-buildroot/usr/lib/debug/usr/bin/pvserver.debug: trace failed


== Диагностика ==
= Диагностика =
 
Обращайте внимание на сообщения от <tt>debuginfo.brp</tt>! Примеры:
Обращайте внимание на сообщения от <tt>debuginfo.brp</tt>! Примеры:


Строка 43: Строка 42:
— есть DWARF бинарники (<tt>*.debug</tt> файлы в дереве {{path|/usr/lib/debug}}), но нет соответствующих им исходников (в дереве {{path|/usr/src/debug}}).
— есть DWARF бинарники (<tt>*.debug</tt> файлы в дереве {{path|/usr/lib/debug}}), но нет соответствующих им исходников (в дереве {{path|/usr/src/debug}}).


== Отключение ==
= Отключение =
Есть такие возможности отключения (от менее к более радикальным):


Отключать отладочную информацию настоятельно '''не рекомендуется''', но если необхоимо, чтобы отладочных данных было меньше или вообще не было можно добавлять в <tt>%optflags -g1</tt> (обычный -g включает -g2), а
# Чтобы отладочных данных было меньше или вообще не было можно добавлять в <tt>%optflags -g1</tt> (обычный -g включает -g2), а для отключения — -g0 (убирания -g из <tt>%optflags</tt> может быть недостаточно, если в проекте принято добавлять свой -g). [https://lists.altlinux.org/pipermail/devel/2019-May/207855.html]<p>Для ядер Linux (kernel-image-) отключите опцию <tt>CONFIG_DEBUG_INFO=y</tt> (например, сделать её <tt>=n</tt>). Это необходимо сделать даже в случае использования способов указанных ниже — для сокращения времени сборки ядра.
для отключения — -g0 (убирания -g из <tt>%optflags</tt> может быть недостаточно,
# Можно отключить ''strip'' (note: используется <tt>eu-strip</tt> из elfutils, а не <tt>strip</tt> из bintutils). См. тж. [http://lists.altlinux.org/pipermail/devel/2011-February/188023.html обсуждение] <tt>%brp_strip_debug</tt> и <tt>%brp_strip_none</tt> вместо ранее использовавшегося <tt>%set_strip_method</tt>. Пример:<pre>%brp_strip_none %_bindir/*</pre> <p>'''NB''': Buildroot policy пост-обработчик отладочной информации вызывает не только ''strip'', но и ''debugedit'' (нормализация путей к исходным файлам, вычисление .build-id — операции могущие изменить исходный ELF объект), поэтому указания <tt>%brp_strip_none</tt> может быть недостаточно.</p>
если в проекте принято добавлять свой -g). [https://lists.altlinux.org/pipermail/devel/2019-May/207855.html]
# Макрос <tt>%add_debuginfo_skiplist</tt> отключает пост-обработчик отладочной информации (<tt>/usr/lib/rpm/brp.d/056-debuginfo.brp</tt>) для указанных файлов или директорий (в пути можно использовать звездочку). Пример:<pre>%add_debuginfo_skiplist %_bindir</pre>
# Если пакеты {{pkg|*-debuginfo}} нежелательны вообще, отключение [https://lists.altlinux.org/pipermail/devel/2019-May/207852.html производится] посредством глобальной переменной <tt>__find_debuginfo_files</tt>:<pre>%global __find_debuginfo_files %nil</pre>


{{note|макрос <tt>%add_debuginfo_skiplist</tt> определяет (не)отделение отладочной информации от ELF-файлов (т.е. при его задействовании она ''останется'' в соответствующих файлах основного пакета)}}
= Отладка =
Список исходных файлов определяется по время BRP утилитой <code>debugedit</code> с опцией <code>-l</code>. Она берет его из ELF секции <code>.debug_line</code>. (Список секций можно посмотреть <code>readelf -S /path/to/the/binary</code>.) Содержимое этой секции можно посмотреть <code>readelf -wl /path/to/the/binary</code> где список исходных файлов определяется комбинацией таблиц <code>The Directory Table</code> + <code>The File Name Table</code> (которых может быть много в одной секции).


Если {{pkg|*-debuginfo}} нежелательны вообще, отключение [https://lists.altlinux.org/pipermail/devel/2019-May/207852.html производится] посредством глобальной переменной <tt>__find_debuginfo_files</tt>:
Кроме того, имена исходных файлов есть в DWARF атрибутах <code>AT_decl_file</code> — хотя ''debugedit'' берёт их не оттуда, а как описано выше, может быть полезно глянуть его там (примеры как это сделать):
:* <code>dwgrep /path/to/the/binary -e 'entry @AT_decl_file' | sort -u</code>
:* <code>dwarfdump /path/to/the/binary | grep AT_decl_file</code>
:* <code>llvm-dwarfdump-15 --show-sources /path/to/the/binary</code>


%global __find_debuginfo_files %nil
* В '''Go''' пакетах могут пропадать исходники из debuginfo если при сборке в <code>GO_FLAGS</code> передавалась опция <code>-trimpath</code>. Для сохранения исходников рекомендуется её удалить.


См. тж. [http://lists.altlinux.org/pipermail/devel/2011-February/188023.html обсуждение] <tt>%brp_strip_debug</tt> и <tt>%brp_strip_none</tt> вместо ранее использовавшегося <tt>%set_strip_method</tt>.
* В '''Rust''' пакетах могут пропадать исходники из debuginfo если потерялась опция <code>-Cdebuginfo=1</code> из <code>rustflags</code>. Это может произойти если debuginfo было включено через файл <code>.cargo</code>, но затем при сборке использована переменная окружения <code>RUSTFLAGS</code>, которая отменяет секцию <code>build.rustflags</code> из <code>.cargo</code>.


%brp_strip_none %_bindir/*
= Ссылки =
<!--
* [[debuginfo]]
Как вариант:
%define debug_package %nil
-->


== Примечания ==
= Примечания =
<references/>
<references/>


[[Категория:Отладка]]
[[Категория:debuginfo]]

Текущая версия от 01:44, 8 июня 2023


Цель

Поддержка автоматической генерации подпакетов с дополнительной отладочной информацией[1]. По использованию см. страницу Debuginfo.

Реализация

Доступна начиная с 4.0.4-alt100.14[2]. Обучена автоматически проставлять зависимости между подпакетами *-debuginfo.

Результаты для Sisyphus и стабильных веток, начиная с t6/p6, складываются в отдельный компонент debuginfo (RPMS.debuginfo).

Использование

При сборке пакета с помощью rpm-build >= 4.0.4-alt100.15 будут автоматически порождаться подпакеты *-debuginfo, содержащие файлы в /usr/{lib,src}/debug/. На x86_64 с ними работает gdb >= 7.2-alt1.

В секции %files следует избегать обобщений вида

%files 
%_libdir/*

— так как на 32-битных архитектурах, где макрос %_libdir равен /usr/lib, файлы /usr/lib/debug/*.debug могут попасть в обычный пакет, о чём можно судить по ошибке вида[3]

ldd: ERROR: /usr/src/tmp/paraview-buildroot/usr/lib/debug/usr/bin/pvserver.debug: trace failed

Диагностика

Обращайте внимание на сообщения от debuginfo.brp! Примеры:

056-debuginfo.brp: WARNING: You have 3 stripped ELF objects. Please compile with debugging information!
056-debuginfo.brp: WARNING: An excerpt from the list of affected files follows:

— обнаружены ELF бинарники без отладочной информации (stripped), вероятно, где-то при компиляции добавилась опция -sCFLAGS, в install -s), выполнился strip, потерялась опция -g.

056-debuginfo.brp: WARNING: 9 non-stripped binaries don't contain .debug sections making -debuginfo
056-debuginfo.brp: WARNING: package less relevant. An excerpt from the list of affected files follows:

— обнаружены not stripped бинарники (т.е. с секций .symtab), но без секций .debug_* (или .zdebug_*). Это не полная отладочная информация. Причины могут быть те же.

056-debuginfo.brp: Please enable CONFIG_DEBUG_INFO=y in the kernel package!

— ядро собрано без CONFIG_DEBUG_INFO=y из-за этого модули тоже не будут содержать отладочной информации.

056-debuginfo.brp: WARNING: debuginfo without debug sources.

— есть DWARF бинарники (*.debug файлы в дереве /usr/lib/debug), но нет соответствующих им исходников (в дереве /usr/src/debug).

Отключение

Есть такие возможности отключения (от менее к более радикальным):

  1. Чтобы отладочных данных было меньше или вообще не было можно добавлять в %optflags -g1 (обычный -g включает -g2), а для отключения — -g0 (убирания -g из %optflags может быть недостаточно, если в проекте принято добавлять свой -g). [1]

    Для ядер Linux (kernel-image-) отключите опцию CONFIG_DEBUG_INFO=y (например, сделать её =n). Это необходимо сделать даже в случае использования способов указанных ниже — для сокращения времени сборки ядра.

  2. Можно отключить strip (note: используется eu-strip из elfutils, а не strip из bintutils). См. тж. обсуждение %brp_strip_debug и %brp_strip_none вместо ранее использовавшегося %set_strip_method. Пример:
    %brp_strip_none %_bindir/*

    NB: Buildroot policy пост-обработчик отладочной информации вызывает не только strip, но и debugedit (нормализация путей к исходным файлам, вычисление .build-id — операции могущие изменить исходный ELF объект), поэтому указания %brp_strip_none может быть недостаточно.

  3. Макрос %add_debuginfo_skiplist отключает пост-обработчик отладочной информации (/usr/lib/rpm/brp.d/056-debuginfo.brp) для указанных файлов или директорий (в пути можно использовать звездочку). Пример:
    %add_debuginfo_skiplist %_bindir
  4. Если пакеты *-debuginfo нежелательны вообще, отключение производится посредством глобальной переменной __find_debuginfo_files:
    %global __find_debuginfo_files %nil

Отладка

Список исходных файлов определяется по время BRP утилитой debugedit с опцией -l. Она берет его из ELF секции .debug_line. (Список секций можно посмотреть readelf -S /path/to/the/binary.) Содержимое этой секции можно посмотреть readelf -wl /path/to/the/binary где список исходных файлов определяется комбинацией таблиц The Directory Table + The File Name Table (которых может быть много в одной секции).

Кроме того, имена исходных файлов есть в DWARF атрибутах AT_decl_file — хотя debugedit берёт их не оттуда, а как описано выше, может быть полезно глянуть его там (примеры как это сделать):

  • dwgrep /path/to/the/binary -e 'entry @AT_decl_file' | sort -u
  • dwarfdump /path/to/the/binary | grep AT_decl_file
  • llvm-dwarfdump-15 --show-sources /path/to/the/binary
  • В Go пакетах могут пропадать исходники из debuginfo если при сборке в GO_FLAGS передавалась опция -trimpath. Для сохранения исходников рекомендуется её удалить.
  • В Rust пакетах могут пропадать исходники из debuginfo если потерялась опция -Cdebuginfo=1 из rustflags. Это может произойти если debuginfo было включено через файл .cargo, но затем при сборке использована переменная окружения RUSTFLAGS, которая отменяет секцию build.rustflags из .cargo.

Ссылки

Примечания

  1. #19707
  2. позднее доводилась, к использованию рекомендуется начиная с 4.0.4-alt100.21
  3. at@ в devel@