我目前正在分析一个ddd
因无法连接到 X Window 而挂起的问题。这是 strace 的输出:
connect(4, {sa_family=AF_LOCAL, sun_path=@"/tmp/.X11-unix/X0"}, 20) = 0
getpeername(4, {sa_family=AF_LOCAL, sun_path=@"/tmp/.X11-unix/X0"}, [20]) = 0
uname({sysname="Linux", nodename="terra-arch", ...}) = 0
access("/home/phil/.Xauthority", R_OK) = 0
open("/home/phil/.Xauthority", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0600, st_size=55, ...}) = 0
read(5, "\1\0\0\nterra-arch\0\0010\0\22MIT-MAGIC-COO"..., 4096) = 55
read(5, "", 4096) = 0
close(5) = 0
getsockname(4, {sa_family=AF_LOCAL, NULL}, [2]) = 0
fcntl(4, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
poll([{fd=4, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=4, revents=POLLOUT}])
writev(4, [{"...", 12}, {"", 0}, {"MIT-MAGIC-COOKIE-1", 18}, {"...", 2}, {"...", 16}, {"...", 0}], 6) = 48
recvmsg(4, 0x7ffc641c6e80, 0) = -1 EAGAIN (Resource temporarily unavailable)
在recvmsg调用之前,它与“/tmp/.X11-unix/X0”套接字通信并发送MIT-MAGIC-COOKIE-1
带有writev调用的a。然后它会永远循环(recvmsg 调用不断失败)。
不久前还有效,ddd
是唯一似乎受到影响的应用程序。不幸的是,我不熟悉XWindow授权协议。
我正在使用 Arch Linux。不确定是否相关,但 xorg-server 最近更新了:
ls -alhgtr /var/cache/pacman/pkg/xorg-*
...
-rw-r--r-- 1 root 27K Mar 25 10:01 /var/cache/pacman/pkg/xorg-server-common-1.18.2-4-x86_64.pkg.tar.xz
-rw-r--r-- 1 root 1.3M Mar 25 10:01 /var/cache/pacman/pkg/xorg-server-1.18.2-4-x86_64.pkg.tar.xz
-rw-r--r-- 1 root 708K Mar 25 10:01 /var/cache/pacman/pkg/xorg-server-xvfb-1.18.2-4-x86_64.pkg.tar.xz
-rw-r--r-- 1 root 17K Apr 1 18:25 /var/cache/pacman/pkg/xorg-xinit-1.3.4-4-x86_64.pkg.tar.xz
-rw-r--r-- 1 root 732K Apr 5 19:36 /var/cache/pacman/pkg/xorg-server-xvfb-1.18.3-1-x86_64.pkg.tar.xz
-rw-r--r-- 1 root 27K Apr 5 19:36 /var/cache/pacman/pkg/xorg-server-common-1.18.3-1-x86_64.pkg.tar.xz
-rw-r--r-- 1 root 1.3M Apr 5 19:36 /var/cache/pacman/pkg/xorg-server-1.18.3-1-x86_64.pkg.tar.xz
/tmp/.X11-unix/X0
存在并且由 root 拥有:
$ ls -l /tmp/.X11-unix
total 0
srwxrwxrwx 1 root root 0 Apr 5 21:22 X0
如果我跑步sudo ddd
,它就会起作用。
我不确定是否应该编写错误报告,或者这是否是我本地系统上的错误。你能帮我缩小范围吗?
答案1
结果发现是配置问题。移动~/.ddd
目录以便ddd
使用新的配置,解决了问题。
这解释了为什么它与 sudo 一起工作,因为它是作为 root 用户执行的,没有混乱的配置。
值得一提的是,我对strace
输出的解释也不正确。看到recvmsg
返回循环EAGAIN
(“资源暂时不可用”)是正常行为。它仅意味着应用程序正在轮询套接字以查找事件。这就是它与 X11 通信的方式。