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

Aug*_*rom 2 debian profiling configure evince

我运行 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
Run Code Online (Sandbox Code Playgroud)

但是,当我启动时"$HOME/.local/bin/atril"没有gmon.out创建命名的文件。使用V=1make 命令中的详细模式,我可以看到该选项-pg已添加到编译和链接命令中。有什么线索吗?缺少了什么?互联网上有几个教程展示了如何分析简单的静态链接示例程序,但我们如何分析“真实世界”的应用程序?

编辑:原来 gmon.out 是在我的主目录中创建的。但是,当我通过 gprof 运行 Atril 时,结果输出并没有说太多,因为应用程序是多线程的。

Mar*_*ler 6

我个人不会挖那么深。我建议不要构建自己的 atril,而是使用 debian atril(因为这是您之后将使用的,而且 debian 为您提供调试符号)。

按复杂程度排序:

  • 在启动 atril 时运行top(甚至更好:htop,并在其设置中禁用“隐藏用户进程线程”)。进程是否使用了大量 CPU?前往perfgdb
  • gdb 对于这样的事情通常已经足够了:
    1. 安装 atril 的调试符号,请参阅debian wiki
    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 限制,通常perflinux-base 包中的命令很棒:sudo sysctl -w kernel.perf_event_paranoid=-1,然后perf record -ag atril将定期采样执行卡住的地方(但它会查看所有进程,因此请关闭浏览器,在家折叠并whatnot),然后perf report -g从同一目录显示可浏览的统计信息。如果您安装了调试符号,这些会变得更有用。

  • 感谢您的雄心勃勃的回答。在 GDB 中,我看到所有线程都被卡在 `../sysdeps/unix/sysv/linux/poll.c:29` 并且在堆栈的更深处有一个对 *g_dbus_proxy_new_sync* 的调用。然后通过搜索互联网,我发现了这个错误报告:https://bugs.launchpad.net/ubuntu/+source/dbus/+bug/1852016,标题为“应用程序延迟启动”,这正是我的问题。使用`dbus-launch --exit-with-session /usr/bin/atril`,Atril 可以像以前一样快速启动。 (2认同)