我安装的 Mutt 似乎在各个方面都运行良好,只是如果我让它打开太久,它就会挂起。只要我继续与界面交互,它似乎就会保持活动状态。但如果我开始写电子邮件或让它闲置太久,它就会冻结。Ctrl+c
不会杀死它,所以我只需用 暂停它Ctrl+z
,然后用 杀死它kill <pid>
。
我不想询问我的安装可能出了什么问题,而是想知道如何调试这种问题。(尽管任何提示都会非常有用!)由于 Mutt 屏幕冻结,我不知道发生了什么。调试此类问题的最佳方法是什么?
答案1
mutt
可以在调试模式下启动。这将生成一个.muttdebug0
可能有助于调试的调试文件。
从mutt
手册页中:
-d level
If mutt was complied with +DEBUG log debugging output to ~/.muttdebug0.
Level can range from 1-5 and effects verbosity.
A value of 2 is recommended.
另一种方法是并排打开两个终端会话。在一个终端会话中运行top
或htop
。在另一个终端会话中运行mutt
。当问题出现时,查看top
显示的内容。(如果top
也冻结,则问题可能比 更大mutt
。)
您还可以编辑您的帖子以包含有关您的系统及其正在执行的操作的更多信息。
- 如果
mutt
每天同一时间挂起,那么当时是否有另一项工作正在执行 I/O 操作? - 如果
mutt
总是挂起否登录后的分钟数,您是否有一些其他在登录时启动然后消耗大量资源的任务?(mutt
多次在调试模式下运行将有助于识别日志文件中的模式。) - 您有权访问
/var/log/messages
或其他日志,或者sar
?
可能是这样mutt
,或者mutt
冻结可能是其他原因的征兆。
答案2
我使用 gdb 附加了一个冻结的 mutt 进程。以下是我发现的内容:
(GDB)BT
#0 0x00007f8327de76b0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1 0x00007f832899014b in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#2 0x00007f832898e16b in BIO_read () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#3 0x00007f8328cadb54 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#4 0x00007f8328caed55 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#5 0x00007f8328cac174 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#6 0x0000000000484365 in ssl_socket_read (conn=<optimized out>, buf=<optimized out>, len=<optimized out>) at mutt_ssl.c:304
#7 0x0000000000485bb7 in mutt_sasl_conn_read (conn=0xa1d660,
buf=0xa1d7f0 "+ idling\r\nDLE terminated (Success)\r\n38441 INTERNALDATE \"15-Oct-2017 12:27:13 +0000\" FLAGS () BODY[HEADER.FIELDS (DATE FROM SUBJECT TO CC MESSAGE-ID REFERENCES CONTENT-TYPE CONTENT-DESCRIPTION IN-REPLY"..., len=1024) at mutt_sasl.c:555
#8 0x00000000004836b9 in mutt_socket_readchar (conn=conn@entry=0xa1d660, c=c@entry=0x7ffc9ee890cf "") at mutt_socket.c:172
#9 0x00000000004837d2 in mutt_socket_readln_d (buf=0xa266a0 "+ idling", buflen=512, conn=0xa1d660, dbg=dbg@entry=2) at mutt_socket.c:202
#10 0x0000000000490328 in imap_cmd_step (idata=idata@entry=0x9fe990) at command.c:112
#11 0x0000000000491188 in imap_exec (idata=0x9fe990, cmdstr=cmdstr@entry=0x0, flags=flags@entry=1) at command.c:244
#12 0x00000000004912fc in cmd_queue (cmdstr=0x4b3de5 "IDLE", idata=0x9fe990) at command.c:377
#13 cmd_start (idata=0x9fe990, cmdstr=0x4b3de5 "IDLE", flags=0) at command.c:402
#14 0x0000000000491370 in imap_cmd_start (cmdstr=0x4b3de5 "IDLE", idata=idata@entry=0x9fe990) at command.c:76
#15 imap_cmd_idle (idata=idata@entry=0x9fe990) at command.c:313
#16 0x0000000000493328 in imap_check_mailbox (ctx=ctx@entry=0xa37ba0, index_hint=index_hint@entry=0x7ffc9ee89214, force=force@entry=0) at imap.c:1401
#17 0x0000000000442d2a in mx_check_mailbox (ctx=0xa37ba0, index_hint=index_hint@entry=0x7ffc9ee89214, lock=<optimized out>, lock@entry=0) at mx.c:1336
#18 0x000000000041e1b8 in mutt_index_menu () at curs_main.c:555
#19 0x000000000040833c in main (argc=1, argv=<optimized out>) at main.c:1061
它无限期地等待阻塞读取。为了解决这个问题,应该在读取时设置超时,或者使调用可取消,以便它在收到诸如 SIGINT 之类的信号时中断。