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

Posted

技术标签:

【中文标题】如何将调试符号添加到 Audacious?【英文标题】:How can I add debugging symbols to Audacious? 【发布时间】:2009-10-15 19:17:58 【问题描述】:

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

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

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 !=

任何人都可以从中得到什么吗? :-\

【问题讨论】:

【参考方案1】:

虽然确实可以:

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

make CFLAGS=-g

将为您提供带有调试符号的构建,这不太可能帮助您解决问题。

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

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

【讨论】:

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

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

CFLAGS="-g $CFLAGS" ./configure

按照通常的步骤进行安装。标志被存储(我认为是在 config.status 中),因此任何后续调用 make 都会构建一个启用调试的大胆。

【讨论】:

以上是关于如何将调试符号添加到 Audacious?的主要内容,如果未能解决你的问题,请参考以下文章

如何给蚂蚁发布参数,所以它不会添加调试符号

如何撤消strip - 即将符号添加回剥离的二进制文件

如何在 Debian Buster 上安装 php 调试符号?

Roslyn 通过 EmbedAllSources 将源代码嵌入到 PDB 符号文件中方便开发者调试

如何告诉 clang 将调试符号放入可执行二进制文件中? [复制]

Flutter 在混淆时上传调试符号没有意义吗?