dbus_connection_send_with_reply_and_block() never returns
I am debugging an issue with the LightDM display manager, which freezes during start up. The backtrace reveals that it calls gtk_init()
which in turn calls atspi_get_a11y_bus()
and this function calls dbus_bus_register()
. Here, dbus_connection_send_with_reply_and_block()
gets called but never returns. It just sits there at poll()
and no matter how long I leave it, nothing happens.
I am not sure how to debug this issue any further. How can I see what DBus is sending and receiving, or find out why it is not getting a reply in this case?
Also, looking at the code, there appears to be no timeout when dbus_bus_register()
makes the blocking call. Wouldn't it be better to have a timeout so that there will at least be an error message after a few seconds rather than a permanent freeze?
In this case when I run lightdm as the root user everything works fine, but when I run it via systemd it freezes as described. When I use strace to compare the two invocations I can see that when everything works, one DBus connection is used:
connect(7, {sa_family=AF_UNIX, sun_path="/var/run/dbus/system_bus_socket"}, 110) = 0
sendto(7, "AUTH EXTERNAL 363230\r\n", 22, MSG_NOSIGNAL, NULL, 0) = 22
recvfrom(7, "OK 7f94aa8da629128be07028bc5e93e"..., 4096, 0, NULL, NULL) = 37
However when launched via systemd and it freezes, I get a different DBus connection:
connect(6, {sa_family=AF_UNIX, sun_path="/run/user/620/bus"}, 19) = 0
sendto(6, "AUTH EXTERNAL 363230\r\n", 22, MSG_NOSIGNAL, NULL, 0) = 22
poll([{fd=6, events=POLLIN}], 1, -1
I am not sure what this means.
What would cause dbus_connection_send_with_reply_and_block()
to never return?