Bug#525031: gnome-settings-daemon: spins on cpu, possibly, while, Registering GsdXrandrPlugin
Michael Cree
mcree at orcon.net.nz
Thu Jun 3 10:39:02 UTC 2010
Still present in 2.30-1.
Now that gdb has been updated I can get a backtrace:
gdb) run
Starting program: /usr/bin/gnome-settings-daemon --debug --no-daemon
[Thread debugging using libthread_db enabled]
** (gnome-settings-daemon:17983): DEBUG: Successfully connected to D-Bus
[...snip...]
** (gnome-settings-daemon:17983): DEBUG: Registering GsdXrandrPlugin
Program received signal SIGSEGV, Segmentation fault.
0x0000020001760edc in register_gnome_settings_plugin (module=0x12005a280)
at gsd-xrandr-plugin.c:36
36 GNOME_SETTINGS_PLUGIN_REGISTER (GsdXrandrPlugin, gsd_xrandr_plugin)
(gdb) bt
#0 0x0000020001760edc in register_gnome_settings_plugin
(module=0x12005a280)
at gsd-xrandr-plugin.c:36
#1 0x0000000120009ef4 in gnome_settings_module_load (gmodule=0x12005a280)
at gnome-settings-module.c:78
#2 0x0000020000704af0 in g_type_module_use ()
from /usr/lib/libgobject-2.0.so.0
#3 0x0000000120008bd8 in load_plugin_module (info=0x1200614e0)
at gnome-settings-plugin-info.c:431
#4 0x0000000120008f48 in _activate_plugin (info=0x1200614e0)
at gnome-settings-plugin-info.c:493
#5 0x00000001200090f0 in gnome_settings_plugin_info_activate (
info=0x1200614e0) at gnome-settings-plugin-info.c:520
#6 0x0000000120005c10 in maybe_activate_plugin (info=0x1200614e0,
user_data=0x0) at gnome-settings-manager.c:94
#7 0x00000200007c0ea4 in g_slist_foreach () from /lib/libglib-2.0.so.0
#8 0x0000000120006494 in _load_all (manager=0x12005b000)
at gnome-settings-manager.c:263
#9 0x0000000120006850 in gnome_settings_manager_start
(manager=0x12005b000,
error=0x11f901468) at gnome-settings-manager.c:349
#10 0x0000000120005558 in main (argc=1, argv=0x11f901598) at main.c:487
Taking a close look, i.e., disassembling, the local scope:
gdb) disass /m
Dump of assembler code for function register_gnome_settings_plugin:
36 GNOME_SETTINGS_PLUGIN_REGISTER (GsdXrandrPlugin, gsd_xrandr_plugin)
0x0000020001760e54 <+0>: ldah gp,2(t12)
0x0000020001760e58 <+4>: lda gp,7556(gp)
0x0000020001760e5c <+8>: lda sp,-32(sp)
0x0000020001760e60 <+12>: stq ra,0(sp)
0x0000020001760e64 <+16>: stq fp,8(sp)
0x0000020001760e68 <+20>: mov sp,fp
0x0000020001760e6c <+24>: stq a0,16(fp)
0x0000020001760e70 <+28>: clr a0
0x0000020001760e74 <+32>: lda a1,128
0x0000020001760e78 <+36>: ldah t0,-2(gp)
0x0000020001760e7c <+40>: lda a2,21672(t0)
0x0000020001760e80 <+44>: ldq t12,-31368(gp)
0x0000020001760e84 <+48>: jsr ra,(t12),0x20001760e88
<register_gnome_settings_plugin+52>
0x0000020001760e88 <+52>: ldah gp,2(ra)
0x0000020001760e8c <+56>: lda gp,7504(gp)
0x0000020001760e90 <+60>: ldah t0,-2(gp)
0x0000020001760e94 <+64>: lda a0,21700(t0)
0x0000020001760e98 <+68>: ldah t0,-2(gp)
0x0000020001760e9c <+72>: lda a1,21722(t0)
0x0000020001760ea0 <+76>: ldq t12,-32336(gp)
0x0000020001760ea4 <+80>: jsr ra,(t12),0x20001760ea8
<register_gnome_settings_plugin+84>
0x0000020001760ea8 <+84>: ldah gp,2(ra)
0x0000020001760eac <+88>: lda gp,7472(gp)
0x0000020001760eb0 <+92>: ldah t0,-2(gp)
0x0000020001760eb4 <+96>: lda a0,21700(t0)
0x0000020001760eb8 <+100>: ldah t0,-2(gp)
0x0000020001760ebc <+104>: lda a1,21740(t0)
0x0000020001760ec0 <+108>: ldq t12,-31472(gp)
0x0000020001760ec4 <+112>: jsr ra,(t12),0x20001760ec8
<register_gnome_settings_plugin+116>
0x0000020001760ec8 <+116>: ldah gp,2(ra)
0x0000020001760ecc <+120>: lda gp,7440(gp)
0x0000020001760ed0 <+124>: ldah t0,0(gp)
0x0000020001760ed4 <+128>: ldq t1,16(fp)
0x0000020001760ed8 <+132>: stq t1,-31272(t0)
=> 0x0000020001760edc <+136>: ldq t12,0(gp)
0x0000020001760ee0 <+140>: jsr ra,(t12),0x20001760ee4
<register_gnome_settings_plugin+144>
This code is in the xrandr plugin. We can see the segmentation
violation occurs at the instruction ldq t12,0(gp). This instruction is
loading cpu register t12 with an entry from the data area (presumably
the global offset table) pointed to by the global pointer (gp). The
next instruction (if it were executed) calls the subroutine pointed to
by cpu register t12 and should be gnome_settings_plugin_get_type(),
i.e., a call back into the main program.
Looking at the other jsr instructions register t12 is always loaded with
an offset (typically about -31000) from the gp and I have verified that
they are entries into an offset table with the addresses of the
subroutine being called. But for the offending instruction the offset
is 0 from the gp. I suspect that, somehow, the dynamic linker has not
resolved this symbol properly in the code of the plugin, i.e., that the
0 offset to the gp is incorrect.
I wonder if a similar thing is occurring on the ia64 architecture for
which this bug was first reported.
I personally don't know enough about the glib/gnome plugin mechanisms to
debug this much further without guidance.
Regards
Michael.
More information about the pkg-gnome-maintainers
mailing list