UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

202 lines (128 loc) 9.76 kB
Ссылки по теме * [Устранение часто встречающихся неполадок](/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)