linux下,终端程序不停输出log信息,此时emacs GUI很容易死掉,永久无响应

终端程序不停输出log时,会让cpu某个核占用到100%。我用的rxvt。

即使log输出停止,此时cpu占用接近0,emacs GUI也恢复不过来,永久无响应了,只能kill掉。遇到好几次了,几乎百分百重现。

用 xterm 会有类似现象吗?

然后贴一下硬件配置好有个参考。

xterm没试。笔记本,酷睿双核2.53G,8G内存。

其他程序都没问题,浏览器也没问题,就emacs挂了。

我觉得可以给 Emacs 和 rxvt 分别报个 bug

应该是emacs的问题了,不过报告一个bug挺麻烦的,特别是英文水平不佳的情况下,描述问题让人头疼。先在这看下有没有人遇到。

emacs版本是25.2, linux是debian 8 64位

在 Debian 8.0 用 rxvt 打开 Emacs 25.2 就能重现?我觉得不太可能。过两天等我有机会我会试试看。同时或许你应该提供详细的重现步骤。

不能重现——没有看到任何 log 输出,或者别的任何异常。

~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.0 (stretch)
Release:        9.0
Codename:       stretch
~$ apt list rxvt
正在列表... 完成
rxvt/stable,now 1:2.7.10-7+b1 amd64 [已安装]
~$ emacs --version
GNU Emacs 25.1.1
Copyright (C) 2016 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
~$ emacs -Q

刚才试了两次,都是在10分钟内重现。

系统:debian 8 64位,昨天刚更新最新补丁。 emacs: 25.2正式版。 rxvt是unicode版本的,debian中叫rxvt-unicode,同时使用了tmux。

  1. 测试用来输出log的是一个简单的c程序,在while(1)里不停printf,一次最多输出200个字符,偶尔输出一行中文。
  2. 打开rxvt,运行tmux,将rxvt窗口拖到桌面右边(即右半屏,窗口调整尽量大),启动1中的程序,先运行两分钟。
  3. 再开一个终端,用来启动emacs(emacs GUI):emacs -Q,将emacs窗口拖到桌面左边(即左半屏)
  4. 在emacs中打开emacs源码中的xdisp.c文件,然后按住方向键(向下键),让光标不停往下走。我这边测试走到文件3%的时候挂掉。关掉rxvt窗口,emacs无法恢复。此时查看启动emacs的终端,没有任何输出。

emacs无响应后,看系统资源占用,cpu占60%左右,内存空余3G多。然后把rxvt关掉,emacs无法恢复(窗口内容不刷新,点关闭按钮没反应,此时系统cpu占用不超过10%,且不是emacs占用的)。

这个问题有没有人遇到? 现在终端程序打印log的时候都不敢操作emacs了

你描述的问题和重现步骤看起来太诡异,我怀疑即便按照你的步骤也不能重现(我已经懒得试了),我建议你提交一个 Bug,附上精确的重现步骤(站在别人的角度看;除非你确认,任何一个步骤都不能从简,比如你口中的"输出 log 信息")。

另外,我有个不相干的问题——你平时都是从终端启动 Emacs(GUI)的吗?那样不会占有当前的终端吗?我都是从系统菜单启动 Emacs 的。

占用终端而不能以 daemon 运行的命令行应用可以用 GNU screen 挂着。这样就算关掉终端,screen 里面的进程还是会运行的。我就是用这个在服务器上挂 IRC Bot 的。

不知道哪里诡异了。rxvt加tmux的组合应该不算另类吧?用终端启动emacs GUI是为了加-Q参数(即不加载自己的配置文件)。

整体是很正常的工作流程:用终端编译运行程序,用emacs编辑代码。问题是编译运行的程序不停输出log的时候,emacs就挂了。

“输出log信息”是最关键的,而且要包含中文字符。输出log的窗口拉大是因为窗口越大占用的cpu越高,越容易重现。

估计是 CPU 性能问题。

一个终端打印信息就会导致另一个终端启动的 Emacs 死掉?听起来就像我把电灯开关几次空调就挂了一样。

无论如何,更重要的是你首先需要确认别人也可以重现你的问题,如果一个问题无法重现,那么我们先假设它不存在。

不停输出log的时候,会占用xorg很多绘图资源,xorg是个cs模式,一个客户端占了太多资源,另一个可能就无法及时响应,而这个情况如果客户端处理不好可能就进入了异常状态。就像大功率电器会对让其他电器工作不正常。并不觉得诡异。

已经上报了bug,在这讨论好像很难有进展。

可能emacs在系统高负载模式下,某些情况没处理好的原因,已经向官方提交了bug

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=27670

前天升级了一下debian的最新补丁(里面有一个xorg的更新, 不知道是不是这个影响), 今天测试发现重现难度加大了, 需要pagedown配合down按键, 强制让emacs频繁刷新屏幕, 最后问题还是重现了.