如何分析现实世界的应用程序?

如何分析现实世界的应用程序?

我运行的是 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?前往perfgdb
  • gdb对于这样的事情来说通常已经足够了:
    1. 安装 atril 的调试符号,请参阅Debian 维基
    2. 启动 gdb,加载 atril:(gdb atril提示:gdb 可能会告诉您缺少一些调试符号 - 您也可以安装这些符号,这样当回溯当前不在 atril 中时,您可以更轻松地破译它们)
    3. (gdb)外壳上,说run
    4. 在 15 秒的无聊时间里,按ctrl+ c。这会中断 gdb 中的执行
    5. 由于 atril 可能是多线程的,因此info threads会显示每个线程是否被卡住
    6. 通过键入以下内容,按编号 N 选择最有趣的线程thread N
    7. 获取回溯:bt.你会看到你从哪里来。
  • 如果它本身不使用 CPU,则几乎可以肯定它正在等待系统调用完成。strace atril将告诉显示它所做的实时调用。您最近接到的几个电话是什么?也许它想睡觉?
  • 如果你受 CPU 限制,一般来说,perf来自 linux-base 包的命令很棒:sudo sysctl -w kernel.perf_event_paranoid=-1,然后perf record -ag atril会定期采样执行被卡住的地方(但它会查看所有进程,因此关闭浏览器,在家里折叠并等等),然后,perf report -g从同一目录向您显示可浏览的统计信息。如果您安装了调试符号,这些会变得更有用。

相关内容