返回顶部
首页 > 资讯 > 精选 >使用strace查找Emacs启动阻塞的原因有哪些
  • 574
分享到

使用strace查找Emacs启动阻塞的原因有哪些

2023-06-16 06:06:44 574人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关使用strace查找EMacs启动阻塞的原因有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。由于使用了 spacemacs 的配置,配置上比较复杂,不太想通过实验缩减配置的方式来摸索

这篇文章给大家分享的是有关使用strace查找EMacs启动阻塞的原因有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

由于使用了 spacemacs 的配置,配置上比较复杂,不太想通过实验缩减配置的方式来摸索出问题的地方。刚好最近在学习使用 strace 工具,因此决定使用 strace 来看看 Emacs 到底卡在哪里。

strace emacs --fg-daemon

输出的内容特别多,这里只截取卡顿前的部分内容

readlinkat(AT_FDCWD, "/home", 0x7ffd1d3abb50, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972", 0x7ffd1d3abf00, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d", 0x7ffd1d3ac2b0, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa", 0x7ffd1d3ac660, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904", 0x7ffd1d3aca10, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904/exec-path-from-shell.elc", 0x7ffd1d3acdc0, 1024) = -1 EINVAL (无效的参数)lseek(7, -2655, SEEK_CUR)               = 1441read(7, "\n(defvar exec-path-from-shell-de"..., 4096) = 4096lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537brk(0x7507000)                          = 0x7507000lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537lseek(7, 5537, SEEK_SET)                = 5537read(7, "230\\205\26\0\t\22\\307\\310\t!\vC\\\"\\211\24\\2"..., 4096) = 2430lseek(7, 7967, SEEK_SET)                = 7967lseek(7, 7967, SEEK_SET)                = 7967lseek(7, 7967, SEEK_SET)                = 7967lseek(7, 7967, SEEK_SET)                = 7967read(7, "", 4096)                       = 0close(7)                                = 0getpid()                                = 10818faccessat(AT_FDCWD, "/home/lujun9972/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录)faccessat(AT_FDCWD, "/usr/local/sbin/printf", X_OK) = -1 ENOENT (没有那个文件或目录)faccessat(AT_FDCWD, "/usr/local/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录)faccessat(AT_FDCWD, "/usr/bin/printf", X_OK) = 0stat("/usr/bin/printf", {st_mode=S_IFREG|0755, st_size=51176, ...}) = 0openat(AT_FDCWD, "/dev/null", O_RDONLY|O_CLOEXEC) = 7faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0faccessat(AT_FDCWD, "/bin/bash", X_OK)  = 0stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=903440, ...}) = 0pipe2([8, 9], O_CLOEXEC)                = 0rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0vfork()                                 = 10949rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0close(9)                                = 0close(7)                                = 0read(8, "bash: \346\227\240\346\263\225\350\256\276\345\256\232\347\273\210\347\253\257\350\277\233\347\250\213\347\273"..., 16384) = 74read(8, "bash: \346\255\244 shell \344\270\255\346\227\240\344\273\273\345\212\241\346\216\247\345"..., 16310) = 35read(8, "setterm: \347\273\210\347\253\257 xterm-256color \344"..., 16275) = 51read(8, "Couldn't get a file descriptor r"..., 16224) = 56read(8, "bash: [: \357\274\232\351\234\200\350\246\201\346\225\264\346\225\260\350\241\250\350\276\276\345\274"..., 16168) = 34read(8, "Your display number is 0\n", 16134) = 25read(8, "Test whether fcitx is running co"..., 16109) = 53read(8, "Fcitx is running correctly.\n\n==="..., 16056) = 87read(8, "Launch fbterm...\n", 15969)    = 17read(8, "stdin isn't a tty!\n", 15952)  = 19read(8, "__RESULT\0/home/lujun9972/bin:/ho"..., 15933) = 298read(8, 0x7ffd1d39ce9d, 15635)          = ? ERESTARTSYS (To be restarted if SA_RESTART is set)--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=10949, si_uid=1000, si_status=0, si_utime=10, si_stime=7} ---rt_sigreturn({mask=[]})                 = -1 EINTR (被中断的系统调用)read(8, "", 15635)                      = 0wait4(10949, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 10949close(8)                                = 0getpid()                                = 10818faccessat(AT_FDCWD, "/home/lujun9972/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录)faccessat(AT_FDCWD, "/usr/local/sbin/printf", X_OK) = -1 ENOENT (没有那个文件或目录)faccessat(AT_FDCWD, "/usr/local/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录)faccessat(AT_FDCWD, "/usr/bin/printf", X_OK) = 0stat("/usr/bin/printf", {st_mode=S_IFREG|0755, st_size=51176, ...}) = 0openat(AT_FDCWD, "/dev/null", O_RDONLY|O_CLOEXEC) = 7faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0faccessat(AT_FDCWD, "/bin/bash", X_OK)  = 0stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=903440, ...}) = 0pipe2([8, 9], O_CLOEXEC)                = 0rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0vfork()                                 = 11679rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0close(9)                                = 0close(7)                                = 0read(8, "setterm: \347\273\210\347\253\257 xterm-256color \344"..., 16384) = 51read(8, "Couldn't get a file descriptor r"..., 16333) = 56read(8, "/home/lujun9972/.bash_profile: \347"..., 16277) = 72read(8, "Your display number is 0\nTest wh"..., 16205) = 78read(8, "Fcitx is running correctly.\n\n==="..., 16127) = 104read(8, "stdin isn't a tty!\n", 16023)  = 19read(8, "__RESULT\0b269cd09e7ec4e8a115188c"..., 16004) = 298read(8, 0x7ffd1d39cba6, 15706)          = ? ERESTARTSYS (To be restarted if SA_RESTART is set)--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=11679, si_uid=1000, si_status=0, si_utime=1, si_stime=1} ---rt_sigreturn({mask=[]})                 = -1 EINTR (被中断的系统调用)read(8,

很容易就可以看出,当 Emacs 卡顿时,它在尝试从 8 号文件句柄中读取内容。

那么 8 号文件句柄在哪里定义的呢?往前看可以看到:

pipe2([8, 9], O_CLOEXEC)                = 0rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0vfork()                                 = 11679rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0close(9)                                = 0

可以推测出,Emacs 主进程 fork 出一个子进程(进程号为 11679),并通过管道读取子进程的内容。

然而,从

--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=11679, si_uid=1000, si_status=0, si_utime=1, si_stime=1} ---rt_sigreturn({mask=[]})                 = -1 EINTR (被中断的系统调用)read(8,

可以看出,实际上子进程已经退出了(父进程收到 SIGCHLD 信号),父进程确依然在尝试从管道中读取内容,导致的阻塞。

而且从

read(8, "setterm: \347\273\210\347\253\257 xterm-256color \344"..., 16384) = 51read(8, "Couldn't get a file descriptor r"..., 16333) = 56read(8, "/home/lujun9972/.bash_profile: \347"..., 16277) = 72read(8, "Your display number is 0\nTest wh"..., 16205) = 78read(8, "Fcitx is running correctly.\n\n==="..., 16127) = 104read(8, "stdin isn't a tty!\n", 16023)  = 19read(8, "__RESULT\0b269cd09e7ec4e8a115188c"..., 16004) = 298read(8, 0x7ffd1d39cba6, 15706)          = ? ERESTARTSYS (To be restarted if SA_RESTART is set)

看到,子进程的输出似乎是我的交互式登录 bash 启动时的输出(加载了 .bash_profile

在往前翻发现这么一段信息:

readlinkat(AT_FDCWD, "/home", 0x7ffd1d3abb50, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972", 0x7ffd1d3abf00, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d", 0x7ffd1d3ac2b0, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa", 0x7ffd1d3ac660, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904", 0x7ffd1d3aca10, 1024) = -1 EINVAL (无效的参数)readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904/exec-path-from-shell.elc", 0x7ffd1d3acdc0, 1024) = -1 EINVAL (无效的参数)lseek(7, -2655, SEEK_CUR)               = 1441read(7, "\n(defvar exec-path-from-shell-de"..., 4096) = 4096

这很明显是跟 exec-path-from-shell 有关啊。

通过查看 exec-path-from-shell 的实现,发现 exec-path-from-shell 的实现原理是通过实际调启一个 shell,然后输出 PATH 和 MANPATH 的值的。 而且对于 bash 来说,默认的启动参数为 -i -l(可以通过exec-path-from-shell-arguments来设置)。也就是说 bash 会作为交互式的登录shell来启动的,因此会加载 .bash_profile 和 .bashrc

既然发现跟 exec-path-from-shell 这个包有关,而且据说这个包对 linux 其实意义不大,那不如直接禁用掉好了。

dotspacemacs-excluded-packages '(exec-path-from-shell)

再次重启Emacs,发现这次启动速度明显快了许多了。

感谢各位的阅读!关于“使用strace查找Emacs启动阻塞的原因有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 使用strace查找Emacs启动阻塞的原因有哪些

本文链接: https://www.lsjlt.com/news/282593.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用strace查找Emacs启动阻塞的原因有哪些
    这篇文章给大家分享的是有关使用strace查找Emacs启动阻塞的原因有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。由于使用了 spacemacs 的配置,配置上比较复杂,不太想通过实验缩减配置的方式来摸索...
    99+
    2023-06-16
  • win10启动慢的原因有哪些
    Win10启动慢的原因可能有以下几种:1. 软件冲突: 安装了过多的软件或者一些软件之间冲突,会导致系统启动变慢。2. 启动项过多:...
    99+
    2023-08-30
    win10
  • MySQL 启动失败的原因有哪些
    MySQL 启动失败的原因有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、无法访问系统资源MySQL 不能访问启动需要...
    99+
    2024-04-02
  • MySQL启动不了的原因有哪些
    MySQL启动不了的原因可能有以下几种:1. 配置错误:MySQL配置文件(my.cnf)中的某些配置项可能有误,如端口号、数据目录...
    99+
    2023-09-26
    MySQL
  • tomcat启动闪退的原因有哪些
    Tomcat启动闪退的原因主要有以下几点:1. 系统环境问题:可能是操作系统版本不兼容或者没有安装必要的依赖项。2. 内存不足:To...
    99+
    2023-10-10
    tomcat
  • idea启动不了的原因有哪些
    启动不了的原因可能有以下几个:1. 电源问题:可能是电源线松动或损坏,导致电源无法正常供电。2. 硬件故障:例如主板故障、内存故障、...
    99+
    2023-10-11
    idea
  • tomcat启动错误的原因有哪些
    1. JDK版本不兼容:Tomcat只能在支持的JDK版本上运行,如果使用了不兼容的JDK版本,可能会导致启动错误。2. 端口冲突:...
    99+
    2023-08-30
    tomcat
  • rabbitmq启动不了的原因有哪些
    RabbitMQ启动不了的原因有以下几种: 配置错误:可能是配置文件中的某些参数设置错误,例如端口号、虚拟主机名称、用户名密码等...
    99+
    2023-10-22
    rabbitmq
  • weblogic无法启动的原因有哪些
    WebLogic无法启动的原因有很多,以下是一些可能的原因: 配置错误:WebLogic的配置文件可能存在错误,比如JDBC数据源...
    99+
    2023-10-27
    weblogic
  • prometheus启动报错的原因有哪些
    配置文件错误:配置文件中可能存在错误的参数设置或格式不正确的配置项,导致启动失败。 端口冲突:可能是因为Prometheus要使用...
    99+
    2024-04-02
  • prometheus启动不了的原因有哪些
    配置文件错误:可能是配置文件中的选项设置不正确,导致Prometheus无法启动。 端口被占用:如果Prometheus要使...
    99+
    2024-03-15
    prometheus
  • tomcat启动不起来的原因有哪些
    有以下几种可能的原因导致Tomcat启动不起来:1. 端口被占用:Tomcat默认使用8080端口,如果该端口被其他应用程序占用,T...
    99+
    2023-08-29
    tomcat
  • hp笔记本电脑找不到启动设备的原因有哪些
    这篇“hp笔记本电脑找不到启动设备的原因有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-02-07
    笔记本电脑
  • MySQL服务无法启动的原因有哪些
    MySQL服务无法启动的原因可能有以下几种:1. 配置文件错误:MySQL的配置文件(my.cnf)中可能存在错误,如数据库路径、端...
    99+
    2023-09-26
    MySQL
  • tomcat突然无法启动的原因有哪些
    Tomcat突然无法启动的可能原因有以下几种:1. 端口冲突:Tomcat默认使用的端口为8080,如果其他程序已经占用了该端口,T...
    99+
    2023-09-12
    tomcat
  • centos网卡启动不了的原因有哪些
    CentOS网卡启动不了的原因可能有以下几种: 驱动问题:网卡驱动未正确安装或不兼容操作系统版本。 网络配置问题:网卡配置文件中存...
    99+
    2023-10-25
    centos
  • ubuntu无法正常启动的原因有哪些
    以下是一些常见的导致Ubuntu无法正常启动的原因: 损坏的启动文件:启动文件可能被损坏或删除,导致系统无法正常启动。 错误...
    99+
    2023-10-22
    ubuntu
  • docker容器无法启动的原因有哪些
    容器镜像不存在或损坏:如果容器的镜像不存在或损坏,就无法启动容器。可以使用docker images命令查看本地已有的镜像,使用...
    99+
    2023-10-27
    docker
  • oracle启动监听报错的原因有哪些
    监听程序配置错误:监听程序监听的端口或IP地址配置错误,导致无法正确启动监听。 监听程序文件损坏:监听程序的配置文件或执行文...
    99+
    2024-04-09
    oracle
  • mysql服务启动失败的原因有哪些
    MySQL服务启动失败的原因可能有以下几种: 配置文件错误:MySQL的配置文件(my.cnf或my.ini)中的参数配置错误,比...
    99+
    2024-04-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作