arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
202 lines (128 loc) • 9.76 kB
Markdown
Ссылки по теме
* [Устранение часто встречающихся неполадок](/index.php/%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B0%D1%81%D1%82%D0%BE_%D0%B2%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D1%8E%D1%89%D0%B8%D1%85%D1%81%D1%8F_%D0%BD%D0%B5%D0%BF%D0%BE%D0%BB%D0%B0%D0%B4%D0%BE%D0%BA "Устранение часто встречающихся неполадок")
* [Указания по созданию отчета об ошибке](/index.php/%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8E_%D0%BE%D1%82%D1%87%D0%B5%D1%82%D0%B0_%D0%BE%D0%B1_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B5 "Указания по созданию отчета об ошибке")
* [Step-by-step debugging guide](/index.php/Step-by-step_debugging_guide "Step-by-step debugging guide")
Эта статья описывает создание отладочного пакета и получение с его помощью отладочной информации для отправки разработчикам в отчётах об ошибках.
## Contents
* [1 Package names](#Package_names)
* [2 PKGBUILD](#PKGBUILD)
* [3 Compilation settings](#Compilation_settings)
* [3.1 Qt](#Qt)
* [3.2 KDE applications](#KDE_applications)
* [4 Building and installing the package](#Building_and_installing_the_package)
* [5 Трассирование](#.D0.A2.D1.80.D0.B0.D1.81.D1.81.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5)
* [6 См. также](#.D0.A1.D0.BC._.D1.82.D0.B0.D0.BA.D0.B6.D0.B5)
## Package names
Во время отладки, при получении backtrace (пример ниже):
```
[...]
Backtrace was generated from '/usr/bin/epiphany'
**(no debugging symbols found)**
Using host libthread_db library "/lib/libthread_db.so.1".
**(no debugging symbols found)**
[Thread debugging using libthread_db enabled]
[New Thread -1241265952 (LWP 12630)]
(no debugging symbols found)
0xb7f25410 in __kernel_vsyscall ()
#0 0xb7f25410 in __kernel_vsyscall ()
#1 0xb741b45b in **??** () from /lib/libpthread.so.0
[...]
```
строки вида `??` и `(no debugging symbols found)` показывают, что необходимая отладочная информация, такая, как названия функций, файлов, библиотек, отсутствует в отлаживаемом файле. Проверить, какому пакету принадлежит исполняемый файл или библиотека можно, например, с помощью [pacman](/index.php/Pacman "Pacman"):
```
# pacman -Qo /lib/libthread_db.so.1
/lib/libthread_db.so.1 is owned by *glibc* 2.5-8
```
Пакет [glibc](https://www.archlinux.org/packages/?name=glibc) версии 2.5-8\. Следует составить список пакетов, которые необходимо заменить для отладки.
## PKGBUILD
Чтобы собрать пакет из исходного кода нужно получить файл PKGBUILD. См. [ABS](/index.php/ABS "ABS") для пакетов из [официальных репозиториев](/index.php/Official_repositories "Official repositories") и [AUR#Acquire build files](/index.php/AUR#Acquire_build_files "AUR") для пакетов из [AUR](/index.php/AUR "AUR").
## Compilation settings
pacman получает параметры компиляции с отладочной информацией из переменных `DEBUG_CFLAGS` и `DEBUG_CXXFLAGS`. Чтобы включить отладку, нужно включить опцию makepkg `debug` и выключить опцию `strip`.
Если нужно собрать всего один пакет с отладочной информацией, достаточно внести в его файл PKGBUILD
```
options=(debug !strip)
```
Если же нужно собирать много пакетов, или makepkg не будет использоваться без отладочной информации, то можно внести в файл `/etc/makepkg.conf`
```
OPTIONS+=(debug !strip)
```
Также, можно включить одновременно обе опции `debug` и `strip`, в таком случае отладочная информация бует удалена из пакета, и будет помещена в отдельный пакет `*foo*-debug`.
**Note:** Просто установить отдельный пакет с отладочной информацией недостаточно, поскольку отладчику придётся искать отладочные символы непосредственно в отлаживаемом файле. Нужно установить оба перекомпилированных пакета. Отладочные символы помещаются в `/usr/lib/debug`. Информацию об отладочных пакетах см. в [документации GDB](https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html) .
Некоторые пакеты, такие как *glibc*, очищаются независимо. В таком случае, для сохранения информации нужно найти в PKGBUILD секцию наподобие:
```
strip $STRIP_BINARIES usr/bin/{gencat,getconf,getent,iconv,iconvconfig} \
usr/bin/{ldconfig,locale,localedef,nscd,makedb} \
usr/bin/{pcprofiledump,pldd,rpcgen,sln,sprof} \
usr/lib/getconf/*
[[ $CARCH = "i686" ]] && strip $STRIP_BINARIES usr/bin/lddlibc4
strip $STRIP_STATIC usr/lib/*.a
strip $STRIP_SHARED usr/lib/{libanl,libBrokenLocale,libcidn,libcrypt}-*.so \
usr/lib/libnss_{compat,db,dns,files,hesiod,nis,nisplus}-*.so \
usr/lib/{libdl,libm,libnsl,libresolv,librt,libutil}-*.so \
usr/lib/{libmemusage,libpcprofile,libSegFault}.so \
usr/lib/{audit,gconv}/*.so
```
и удалить, там, где это возможно.
### Qt
В дополнение к этому нужно добавить в `configure` файла `PKGBUILD` опцию `-developer-build`. По-умолчанию, `-developer-build` указывает компилятору опцию `-Werror`, что может привести к ошибке компиляци. Чтобы избежать этого, может понадобиться также добавить `-no-warnings-are-errors`.
**Note:**
При компилировании Qt при установленном [qtwebkit](https://aur.archlinux.org/packages/qtwebkit/) могут возникнуть ошибки. Может понадобиться временно удалить пакет qtwebkit. Чтобы система игнорировала зависимости, используйте команду
```
# pacman -Rdd qtwebkit
```
Не забудьте установить qtwebkit после компиляции Qt, иначе зависящие от него программы не будут работать!
### KDE applications
[KDE](/index.php/KDE "KDE") использует для сборки [cmake](https://www.archlinux.org/packages/?name=cmake). Замените `-DCMAKE_BUILD_TYPE` на `Debug`.
## Building and installing the package
Сборка пакета осуществляется из директории, содержащей PKGBUILD, командой `makepkg`. Это может занять некоторое время:
```
# makepkg
```
Установка собранного пакета:
```
# pacman -U имя-пакета.tar.gz
```
## Трассирование
Текущий backtrace (or stack trace) может быть получен, например, с помощью [gdb](https://www.archlinux.org/packages/?name=gdb), (GNU Debugger). Запуск осуществляется так:
```
# gdb /path/to/file
```
или:
```
# gdb
(gdb) exec /path/to/file
```
Если путь присутствует в `$PATH`, его можно не указывать.
В `gdb`, введите `run` и аргументы для передачи запускаемому файлу:
```
(gdb) run --no-daemon --verbose
```
После запуска выполните действия, приводящие к возникновению бага. Также можно включить логгирование происходящего командой:
```
(gdb) set logging file trace.log
(gdb) set logging on
```
Чтобы сохранить текущий backtrace в файл trace.log в текущей директории, введите:
```
(gdb) thread apply all bt full
```
Выход осуществляется так:
```
(gdb) set logging off
(gdb) quit
```
**Tip:** Отладка приложений на Python:
```
# gdb /usr/bin/python
(gdb) run <python application>
```
Также, можно отлаживать и уже запущенные приложения, зная их PID:
```
# gdb --pid=$(pidof firefox)
(gdb) continue
```
## См. также
* [Gentoo Wiki - Backtraces with Gentoo](https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces)
* [Fedora - StackTraces](http://fedoraproject.org/wiki/StackTraces)
* [GNOME - Getting Stack Traces](https://wiki.gnome.org/Community/GettingInTouch/Bugzilla/GettingTraces/Details#obtain-a-stacktrace)
* [gdb mini intro](http://linux.bytesex.org/gdb.html)