Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将调试符号添加到Audacious?_C_Debugging_Gdb_Segmentation Fault - Fatal编程技术网

如何将调试符号添加到Audacious?

如何将调试符号添加到Audacious?,c,debugging,gdb,segmentation-fault,C,Debugging,Gdb,Segmentation Fault,我正在为audacious编写一个插件,我遇到了随机故障。我环顾四周,发现我可以用gdb处理程序的核心转储 所以我这样做了,我得到了这个输出: 正如您所看到的,它说在任何地方都找不到调试符号。我想编译带有调试符号的大胆代码,但我不确定如何编译。我尝试编辑configure,它只包含一个名为buildsys.mk的文件,因此我编辑了该文件并从链接器中删除了-s标志,并确保将-g标志传递给编译器。上面的gdb输出是在我这样做之后,所以显然我所做的没有任何效果 那么,在编译大胆的代码时,如何保留调试

我正在为audacious编写一个插件,我遇到了随机故障。我环顾四周,发现我可以用gdb处理程序的核心转储

所以我这样做了,我得到了这个输出:

正如您所看到的,它说在任何地方都找不到调试符号。我想编译带有调试符号的大胆代码,但我不确定如何编译。我尝试编辑configure,它只包含一个名为buildsys.mk的文件,因此我编辑了该文件并从链接器中删除了-s标志,并确保将-g标志传递给编译器。上面的gdb输出是在我这样做之后,所以显然我所做的没有任何效果

那么,在编译大胆的代码时,如何保留调试符号呢?问题是我只写了一个小插件,还没有掌握这段大胆的代码

更新:我为gtk+和glib添加了调试符号(还尝试了CFLAGS=-g选项),并分析了几个coredumps。底线是:

(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)
if (iter->segments_changed_stamp !=

有人能从中看出什么吗-\

据我所知,大胆使用自动工具。无需修改任何内容,只需配置:

CFLAGS="-g $CFLAGS" ./configure

然后是安装它的常规步骤。这些标志被存储(我认为是config.status中的),因此任何后续调用都将构建一个启用调试的Audaudous。

而执行以下任一操作都是正确的:

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

将得到一个带有调试符号的构建,这不太可能帮助您解决问题

您的程序在
/usr/lib/libgtk-x11-2.0.so.0
中崩溃,而不是在
audacious2
中(不管是什么)。您还错误地分析了
核心
列表
在该阶段没有意义。分析内核时,您的第一个
(gdb)
命令几乎总是
where
,然后是
thread apply all where


安装
libgtk2-debuginfo
或类似的软件包可能会获得更好的结果,这些软件包应该为
libgtk-x11-2.0.so.0
提供调试信息,并允许您在崩溃点查看
libgtk
中的源代码和变量。

谢谢,这听起来很符合逻辑,我将尝试一下。另外,@veryone,我不能确定,但我相信正如我在问题中已经说过的那样,audacious已经用-g编译了。在我看来,这是一种错误的方法:GTK+有一个庞大的用户群,不太可能会有这样的错误,调试其内部是浪费时间(在这种情况下)。在分段错误之后,我会做一个回溯(gdb中的“bt”)并首先检查我的插件调用,只有在我确定插件工作正常时才进行大胆的调试。GTK+调试应该只作为最后一个资源。哪种方法是错误的?我们似乎同意第一个GDB命令应该是“where”(又名“bt”)。诚然,这个bug可能不在libgtk中,而是在它的调用者中。尽管如此,安装libgdtk2 debuginfo可能会立即揭示调用者传入的错误参数。我的建议是不要试图在GTK+中找到问题,而是根据文档仔细检查插件中的调用。调试一个类似beast的GTK+意味着(在我看来)寻找麻烦:这不是一个简单的项目,如果核心转储在类型系统中。。。祝你好运。我想我是对的:我不打算调试GTK+,只看哪个GTK+函数失败,从而看我向哪个GTK+函数传递非法参数:)
./configure CFLAGS=-g && make && make install
make CFLAGS=-g