[Bug 48936] Re: GDM: Greeter application crashing

Jonathan Harker jon at jon.geek.nz
Thu Feb 8 03:19:35 UTC 2007


I took the liberty of enabling debug in gdm.conf and relevant bits of
log files are attached.

Meanwhile, my C isn't up to an awful lot, much less gtk glib and so on.
However, looking in the source I can see that the greeter failing error
message is only in one place, from a condition in the
gdm_slave_greeter() function in slave.c

daemon/slave.c:2611:
  if G_UNLIKELY (d->try_different_greeter) {
      /* ... call gdm_error_box with the failure message ... */

Following that, d->try_different_greeter is only set in the
gdm_cleanup_children() function in gdm.c when the exit status is
DISPLAY_GREETERFAILED (defined as 65 in gdm.h line 76), in this block:

daemon/gdm.c:847:
  if (status == DISPLAY_GREETERFAILED) {
      if (d->managetime + 10 >= time (NULL)) {
          d->try_different_greeter = TRUE;
      } else {
          d->try_different_greeter = FALSE;
      }
      /* now just remanage */
      status = DISPLAY_REMANAGE;
  } else {
      d->try_different_greeter = FALSE;
  }

It looks like it is giving up after 10 seconds, so perhaps it is a
timing thing? Anyway, I grepped for things that exit with a
DISPLAY_GREETERFAILED code and found these:

daemon/slave.c:4692: exit_code_to_use = DISPLAY_GREETERFAILED;
daemon/slave.c:4698: exit_code_to_use = DISPLAY_GREETERFAILED;
gui/gdmcommon.c:94:  _exit (DISPLAY_GREETERFAILED);
gui/gdmcommon.c:109: _exit (DISPLAY_GREETERFAILED);

The daemon/slave.c calls are in the gdm_slave_child_handler() function
at line 4621 which handles SIGCHLD signals.

The gui/gdmcommon.c references are in the gdm_common_fail_greeter()
function, which looks like it tries to log, clean up and exit with
DISPLAY_GREETERFAILED. It is called from gui/greeter/greeter.c (and
gui/gdmlogin.c, but we're not concerned with that since it is the fall-
back greeter, which works).

In gui/greeter/greeter.c, gdm_common_fail_greeter() is called from int
main() at line and the process_operation() function contains a
switch(op_code), and the default case calls it at line 451.

gui/greeter/greeter.c:451: gdm_common_fail_greeter ("Unexpected greeter command received: '%c'", op_code);
gui/greeter/greeter.c:1089: gdm_common_fail_greeter ("%s: Error setting up %s signal handler: %s", "main",
gui/greeter/greeter.c:1099: gdm_common_fail_greeter ("%s: Error setting up %s signal handler: %s", "main",
gui/greeter/greeter.c:1104: gdm_common_fail_greeter ("%s: Error setting up %s signal handler: %s", "main",
gui/greeter/greeter.c:1114: gdm_common_fail_greeter ("Could not set signal mask!");
gui/greeter/greeter.c:1122: gdm_common_fail_greeter ("Could not set signal mask!");

So it seems to boil down to gui/greeter/greeter.c and scrutinising what
int main() is doing, or else I wonder if there is some op_code that
isn't being processed by the process_operation() function?


** Attachment added: "/var/log/daemon.log"
   http://librarian.launchpad.net/6346313/part-of-daemon.log.txt

-- 
GDM: Greeter application crashing
https://launchpad.net/bugs/48936




More information about the desktop-bugs mailing list