2009-10-15 3 views
0

Я пишу плагин для смелых, и я испытываю случайные segfaults. Я огляделся и обнаружил, что могу обработать основные дампы программы с помощью gdb.Как добавить отладочные символы в Audacious?

Так что я сделал это, и я получил этот результат:

http://pastebin.com/m7d0d663d

Как вы можете видеть, это не говорит, что не символы отладки, где найдены в любом месте. Я хочу скомпилировать смелые с отладочными символами, но я не уверен, как это сделать. Я попытался редактировать configure, который включает только файл с именем buildsys.mk, поэтому я отредактировал это и удалил флаг -s из компоновщика и убедился, что флаг -g передается компилятору. Вывод gdb выше, после того, как я это сделал, поэтому, очевидно, что я ничего не сделал.

Как я могу сохранить отладочные символы при компиляции смелых? Проблема в том, что я пишу только небольшой плагин и не понимаю, какой смелый код.

ОБНОВЛЕНИЕ: Я добавил символы отладки для gtk + и glib (а также попробовал вариант CFLAGS = -g), и я получил пару анализируемых ядер. Суть заключается в следующем:

(gdb) bt 
#0 gtk_text_iter_make_real (_iter=<value optimized out>) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextiter.c:202 
#1 0xb7c1cf5e in _gtk_text_iter_get_any_segment (iter=0x0) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextiter.c:474 
#2 0xb7c24cd6 in IA__gtk_text_layout_get_line_display (layout=0x93a4318, line=0x9af6270, size_only=1) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextlayout.c:2196 
#3 0xb7c29172 in gtk_text_layout_real_wrap (layout=0x93a4318, line=0x9af6270, line_data=0xb10036b8) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextlayout.c:1147 
#4 0xb7c2358f in IA__gtk_text_layout_wrap (layout=0x93a4318, line=0x9af6270, line_data=0x0) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextlayout.c:693 
#5 0xb7c060a1 in _gtk_text_btree_validate_line (tree=0x9407370, line=0x9af6270, view_id=0x93a4318) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextbtree.c:5422 
#6 0xb7c27dc1 in IA__gtk_text_layout_validate_yrange (layout=0x93a4318, anchor=0xbfb0e624, y0=0, y1=635) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextlayout.c:1062 
#7 0xb7c34999 in gtk_text_view_validate_onscreen (text_view=0x9406000) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextview.c:3502 
#8 0xb7c35f85 in gtk_text_view_flush_first_validate (text_view=0x9406000) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextview.c:3558 
#9 0xb7c35fde in first_validate_callback (data=0x9406000) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextview.c:3577 
#10 0xb79c88fb in gdk_threads_dispatch (data=0x9bce910) at /build/buildd/gtk+2.0-2.16.1/gdk/gdk.c:498 
#11 0xb7e38c81 in g_idle_dispatch (source=0x938a400, callback=0, user_data=0x9bce910) at /build/buildd/glib2.0-2.20.1/glib/gmain.c:3922 
#12 0xb7e3ab88 in IA__g_main_context_dispatch (context=0x9250760) at /build/buildd/glib2.0-2.20.1/glib/gmain.c:1814 
#13 0xb7e3e0eb in g_main_context_iterate (context=0x9250760, block=1, dispatch=1, self=0x92333e8) at /build/buildd/glib2.0-2.20.1/glib/gmain.c:2448 
#14 0xb7e3e5ba in IA__g_main_loop_run (loop=0x9a92c88) at /build/buildd/glib2.0-2.20.1/glib/gmain.c:2656 
#15 0xb7b707d9 in IA__gtk_main() at /build/buildd/gtk+2.0-2.16.1/gtk/gtkmain.c:1205 
#16 0xb268d56a in skins_init() from /usr/local/lib/audacious/General/skins.so 
#17 0x0805b42a in ??() 
#18 0xb7540775 in __libc_start_main() from /lib/tls/i686/cmov/libc.so.6 
#19 0x08055361 in ??() 
(gdb) 

И точная ошибка:

#0 gtk_text_iter_make_real (_iter=<value optimized out>) at /build/buildd/gtk+2.0-2.16.1/gtk/gtktextiter.c:202 
202 /build/buildd/gtk+2.0-2.16.1/gtk/gtktextiter.c: No such file or directory. 
in /build/buildd/gtk+2.0-2.16.1/gtk/gtktextiter.c 

Точная линия такова:

if (iter->segments_changed_stamp != 

Можно ли сделать что-нибудь из этого? : - \

+0

-g флаг на gcc. – Tom

ответ

1

Хотя это правда, что делать либо:

./configure CFLAGS=-g && make && make install 

или

make CFLAGS=-g 

поможет вам построить с отладочной, это весьма маловероятно, чтобы помочь вам решить эту проблему.

Вы запрограммировали ошибку в /usr/lib/libgtk-x11-2.0.so.0, а не в audacious2 (независимо от того, что есть). Вы также неправильно анализируете core: list не имеет смысла на этом этапе. Ваша первая команда (gdb) при анализе ядра почти всегда должна быть where, а затем thread apply all where.

Вы также можете получить лучшие результаты от установки libgtk2-debuginfo или какого-либо такого пакета, который должен обеспечить отладочную информацию для libgtk-x11-2.0.so.0, и может позволить вам увидеть источник и переменные в libgtk в точке аварии.

+0

Спасибо, это звучит очень логично, я попробую. Кроме того, все, я не могу быть уверенным, но я считаю, что смелый уже скомпилирован с -g, как я уже сказал в своем вопросе. – FrontierPsycho

+0

По-моему, это неправильный подход: у GTK + есть большая пользовательская база, у нее вряд ли будет такая ошибка, отладка ее внутренних компонентов - пустая трата времени (в данном случае). После ошибки сегментации я делал backtrace («bt» в gdb) и проверял мои вызовы плагинов _first_, отлаживая смелость только тогда, когда я уверен, что плагин работает правильно. Отладка GTK + должна быть оставлена ​​только как последний ресурс. – ntd

+0

Это неправильный подход? Мы, похоже, согласны с тем, что самая первая команда GDB должна быть «где» (aka «bt»). Это правда, что ошибка, скорее всего, не в libgtk, а в ее вызывающем. Тем не менее, установка libgdtk2-debuginfo может сразу показать, какой плохой параметр передал вызывающий. –

0

Насколько я знаю, дерзкий использует autotools. Не нужно ничего изменять, просто настройте с помощью:

CFLAGS="-g $CFLAGS" ./configure 

, за которым следуют обычные шаги по его установке. Флаги хранятся (в файле config.status, я думаю), поэтому любой последующий вызов make будет создавать отладочную поддержку.