我运行的是 Debian 10,大约两周以来,PDF 阅读器 Atril(Evince 的一个分支)需要 25 秒才能启动。以前它几乎是立即启动的。现在我试图找出导致延迟的原因。我已下载源包并在启用了分析功能的情况下构建和安装了它:
cd "$HOME/.local/src"
apt source atril
cd atril-1.20.3
./autogen.sh
./configure CFLAGS=-pg LDFLAGS=-pg --prefix="$HOME/.local" --disable-caja
make V=1
make install
但是,当我启动时,不会创建"$HOME/.local/bin/atril"
名为的文件。gmon.out
通过 make 命令中的详细模式,V=1
我可以看到该选项-pg
已添加到编译和链接命令中。有什么线索吗?少了什么东西?互联网上有一些教程展示了如何分析简单的静态链接示例程序,但我们如何分析“现实世界”应用程序?
编辑:原来 gmon.out 是在我的主目录中创建的。然而,当我通过 gprof 运行 Atril 时,结果输出并没有说明太多,因为该应用程序是多线程的。
答案1
我个人不会挖那么深。我会推荐不是构建您自己的 atril,但使用 debian atril(因为这是您之后将使用的,而且 debian 为您提供了调试符号)。
按复杂程度排序:
- 在启动 atril 时运行
top
(甚至更好:htop
,并在其设置中禁用“隐藏用户态进程线程”)。该进程是否使用大量 CPU?前往perf
或gdb
。 gdb
对于这样的事情来说通常已经足够了:- 安装 atril 的调试符号,请参阅Debian 维基
- 启动 gdb,加载 atril:(
gdb atril
提示:gdb 可能会告诉您缺少一些调试符号 - 您也可以安装这些符号,这样当回溯当前不在 atril 中时,您可以更轻松地破译它们) - 在
(gdb)
外壳上,说run
- 在 15 秒的无聊时间里,按ctrl+ c。这会中断 gdb 中的执行
- 由于 atril 可能是多线程的,因此
info threads
会显示每个线程是否被卡住 - 通过键入以下内容,按编号 N 选择最有趣的线程
thread N
- 获取回溯:
bt
.你会看到你从哪里来。
- 如果它本身不使用 CPU,则几乎可以肯定它正在等待系统调用完成。
strace atril
将告诉显示它所做的实时调用。您最近接到的几个电话是什么?也许它想睡觉? - 如果你受 CPU 限制,一般来说,
perf
来自 linux-base 包的命令很棒:sudo sysctl -w kernel.perf_event_paranoid=-1
,然后perf record -ag atril
会定期采样执行被卡住的地方(但它会查看所有进程,因此关闭浏览器,在家里折叠并等等),然后,perf report -g
从同一目录向您显示可浏览的统计信息。如果您安装了调试符号,这些会变得更有用。