Bug 19707

Summary: Автоматическая генерация debug-пакетов
Product: Sisyphus Reporter: Konstantin Pavlov <thresh>
Component: rpmAssignee: at <at>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: enhancement    
Priority: P3 CC: at, becase, boris, crux, enp, erthad, evg, glebfm, imz, kas, ktirf, lav, ldv, mike, php-coder, placeholder, redbaron, vt, wrar
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 24863    

Description Konstantin Pavlov 2009-04-21 18:25:03 MSD
Нужна функция автоматической генерации debug-пакетов, аналогичная реализованной в Debian и Fedora.

Подробности реализации в fedora можно посмотреть в их rpm 4.7 macros.in:166, scripts/find-debuginfo.sh.
Comment 1 Sir Raorn 2009-04-21 19:26:22 MSD
В SuSE, кажется, тоже было что-то подобное.
Comment 2 Andrey Rahmatullin 2009-05-03 22:02:56 MSD
Нерабочий proof of concept тут:
http://git.altlinux.org/people/wrar/packages/rpm.git?p=rpm.git;a=shortlog;h=refs/heads/debuginfo
Comment 3 Andrey Rahmatullin 2009-05-03 22:04:47 MSD
(В ответ на комментарий №1)
> В SuSE, кажется, тоже было что-то подобное.
Это в дебиане "что-то подобное", во всех остальных rpm-baes дистрибутивах оно просто через rpm-4.2+
Comment 4 redbaron 2009-05-18 20:16:57 MSD
прошу обратить внимание на фич реквест, полезная же вещь!
Comment 5 Vitaly Lipatov 2010-03-08 20:24:23 MSK
Вообще очень интересно, как можно что-то отлаживать, отлавливать ошибки, если нормальной возможности получить отладочный вывод для программы из собранного пакета.
Comment 6 Kirill A. Shutemov 2010-07-12 16:33:17 MSD
Дима, есть мысли на этот счёт?
Comment 7 Dmitry V. Levin 2010-08-05 20:36:33 MSD
(In reply to comment #2)
> Нерабочий proof of concept тут:
> http://git.altlinux.org/people/wrar/packages/rpm.git?p=rpm.git;a=shortlog;h=refs/heads/debuginfo

Почему нерабочий?
Comment 8 Andrey Rahmatullin 2010-08-05 20:44:00 MSD
(В ответ на комментарий №7)
> > Нерабочий proof of concept тут:
> > http://git.altlinux.org/people/wrar/packages/rpm.git?p=rpm.git;a=shortlog;h=refs/heads/debuginfo
> 
> Почему нерабочий?

http://lists.altlinux.org/pipermail/devel/2009-May/170090.html
Хочет beecrypt из этого века.
Comment 10 Dmitry V. Levin 2010-09-21 14:41:48 MSD
Спасибо Кириллу, beecrypt уже давно обновлён.
Кто будет катить камень дальше?
Comment 11 Kirill A. Shutemov 2010-09-22 23:29:46 MSD
(In reply to comment #10)
> Спасибо Кириллу, beecrypt уже давно обновлён.
> Кто будет катить камень дальше?

Я собирался после gcc4.5.
Comment 12 at@altlinux.org 2011-01-08 04:58:50 MSK
Мужики, у нас же свой brp-strip, и он обрезает сильнее, чем в редхате (у нас используется 'strip --strip-unneeded', а в редхате используется 'eu-strip --strip-debug').  И в нём 100 тысяч миллионов опций.  Так что надо всё переделывать, причем неизвестно как. А просто так коммитить новые файлы в наш rpm смысла нет. В лучшем случае мы получим пустые/некогерентные debuginfo пакеты.

Принципиальный вопрос - надо ли обрезать .symtab.  У нас .symtab всегда обрезается.  В редхате .symtab не обрезается.
Comment 13 at@altlinux.org 2011-01-08 06:53:25 MSK
Нет, американцы тоже .symtab отрезают, я не так понял в одном месте. Надо придумать, как совместить brb-strip и debuginfo, чтобы это работало одинаково для всех пакетов - работало хорошо и с минимальным количеством опций.

Дело в том что сейчас всякие опции в rpmbuild типа _strip_method или _strip_skiplist исходят из того, что бинарики собраны без -g.  А если бинарики собраны с -g, то debug можно отрезать в любом случае.  Короче смысол этих опций будет под вопросом.

Предлагаю для обдумывания следующую модель brp-strip+debuginfo: каждый ELF executable и ELF shared в билдруте принудительно обрезается (и создается /usr/lib/debug$f.debug файл).  Разница только сколько надо обрезать.  По умолчанию режим обрезания "debug,comment,symbols".  Со стороны rpmbuild можно только изменить сколько надо обрезать, например, так:

%название_макроса_обрезания шелл-паттерн сколько-обрезать

E.g.

# keep symbols
%название_макроса_обрезания %_libdir/valgrind/*.so debug,comment
Comment 14 at@altlinux.org 2011-01-08 21:13:05 MSK
Мужики, короче я подумал, решил что надо делать отдельный *-debuginfo пакет на каждый подпакет, а пустых *-debuginfo пакетов делать не надо.  И чтобы у каждого *-debuginfo пакета была зависимость на свой подпакет.

А это не очень просто сделать.  Так что кому надо просьба не беспокоиться.  Я уже придумал как можно сделать.  А то американцы насрут - всё в один пакет и без всяких зависимостей - и считается что круто.

И ещё надо делать сделать замыкание *-debuginfo пакетов по завимостям.  То есть чтобы была "сквозная отладка".  А не так там что на одном фрейме отладка есть а на другом нету.
Comment 15 Michael Shigorin 2011-01-08 23:09:11 MSK
И класть бы их хорошо в отдельный компонент, не classic.
Comment 16 at@altlinux.org 2011-01-09 10:53:03 MSK
Мужики, я нарисовал сишную часть, лежит у меня в rpm.git бранч debuginfo.  Работает пока примерно так:

LD_LIBRARY_PATH=$PWD/build/.libs rpmbuild --define '__find_debuginfo_files while read -r f; do f=${f#$RPM_BUILD_ROOT}; if [ -f $RPM_BUILD_ROOT/usr/lib/debug$f.debug ]; then echo /usr/lib/debug$f.debug; fi; done' -bb --short-circuit *.spec

То есть там будет две стадии - одна brp-debuginfo для всего билдрута в целом, а другая на каждый пакет, которая будет выцеживать нужные файлы.  Какие будут мнения.
Comment 17 at@altlinux.org 2011-01-14 08:24:26 MSK
Мужчины, я выложил бранч debuginfo, там реализована мегафича - автоматическое удаление дупов исходников между *-debuginfo подпакетами.  На основе зависимостей между основными подпакетами!  Например, если пакет rpm требует пакет librpm, то из пакета rpm-debuginfo можно удалить пересекающиеся исходники, добавив зависимость на librpm-debuginfo. А пакет rpm-static требует пакет rpm.  Тогда, по этой же логике, из пакета rpm-static-debuginfo можно удлить исходники, пересекающиеся с rpm-debuginfo, и добавить зависимость на rpm-debuginfo.  Но rpm в свою очередь требует librpm.  Так что в пакете rpm-static-debuginfo по идее может вообще не остаться исходников!

Бранч debuginfo собираем, его можно собрать в хешере два раза и посмотреть результат (который появится на второй раз в результате сборки rpm'а самим собой).
Comment 18 Vladimir Lettiev 2011-01-18 11:30:59 MSK
(В ответ на комментарий №17)
> Бранч debuginfo собираем, его можно собрать в хешере два раза и посмотреть
> результат (который появится на второй раз в результате сборки rpm'а самим
> собой).

Пробовал собрать midori на x86_64. Создался пакет midori-debuginfo, но символы запаковались в /usr/lib/debug вместо /usr/lib64/debug и gdb их соотвественно автоматом не подхватывает.

В целом же фича просто потрясающая! Спасибо!
Comment 19 at@altlinux.org 2011-01-18 11:33:40 MSK
По-моему должно быть /usr/lib/debug на обеих архитектурах.
Comment 20 Dmitry V. Levin 2011-01-18 15:40:49 MSK
(In reply to comment #19)
> По-моему должно быть /usr/lib/debug на обеих архитектурах.

Если /usr/lib/debug -- это префикс, за котором следует полный путь, включая %_libdir, то совершенно все равно, какой это префикс.  На данном этапе есть возможность выбрать такой же префикс, как и у других.
Comment 21 at@altlinux.org 2011-01-18 15:54:47 MSK
Лучше сделать как в редхате, если нет других соображений. Я проверил, gdb действительно смотрит в /usr/lib64/debug (хотя в "info gdb" написано про /usr/lib/debug).  А valgrind - в /usr/lib/debug. Я помню, что valgrind у меня подцепил debuginfo пакет...

$ strings /usr/bin/gdb |grep /debug
/usr/lib64/debug
$ rpm -ql valgrind |xargs strings |grep /debug
m_debuginfo/debuginfo.c
/usr/lib/debug%s/%s
/usr/lib/debug/.build-id/%c%c/%s.debug

Да, подразумевается, что /usr/lib/debug - это префикс, за которым следует полный путь - будет выполняться что-то вроде eu-strip -f /usr/lib/debug$f.debug $f
Comment 22 Dmitry V. Levin 2011-01-18 16:39:39 MSK
(In reply to comment #21)
> Лучше сделать как в редхате, если нет других соображений.

А какой префикс выбрали там?

> Я проверил, gdb
> действительно смотрит в /usr/lib64/debug (хотя в "info gdb" написано про
> /usr/lib/debug).  А valgrind - в /usr/lib/debug. Я помню, что valgrind у меня
> подцепил debuginfo пакет...

Префикс должен быть один для всех, кого-то из них придется исправить.
Comment 23 at@altlinux.org 2011-01-18 16:47:45 MSK
В федоре везде /usr/lib/debug.  Можно скачать какой-нибудь пакет и посмотреть.  http://download.fedora.redhat.com/pub/fedora/linux/development/x86_64/debug/
Comment 24 Vladimir Lettiev 2011-01-18 18:18:26 MSK
В ubuntu/debian тоже /usr/lib/debug
Comment 25 Andrey Rahmatullin 2011-01-18 18:24:25 MSK
(В ответ на комментарий №24)
> В ubuntu/debian тоже /usr/lib/debug
Так там беарчь без извращений с /usr/lib64.
Comment 26 Bikov Rinat 2011-03-09 14:29:09 MSK
Вроде бы уже есть?