代码之家  ›  专栏  ›  技术社区  ›  DarenW

解决粘性问题的方法

  •  3
  • DarenW  · 技术社区  · 15 年前

    如何准确地确定当一个软件被卡住、对用户输入没有响应且不更新其显示时它在做什么?

    我试过oprofile,它记录了正在执行的函数,但它没有给我足够的线索。它计算运行期间发生的所有事情,当我只需要在样本程序被卡住时才能看到正在发生的事情。

    问题可能涉及中断、等待网络套接字、计时器、GUI事件处理程序或谁知道什么。如何尽可能多地了解正在发生的事情,而不仅仅是每个线程的执行点?

    感兴趣的软件在Linux上运行,使用GCC构建,主要是C++,但可能涉及其他语言,包括解释的Python。

    现在需要特别关注的是firefox,我已经检查过它的源代码。firefox会随机暂停所有输入和屏幕输出,通常每次暂停约5-10秒。即使有人把这个问题的解决方案放在银盘上交给我,我当然会接受,但我仍然在问。如果可能的话,我想学习适用于任何软件的一般技术,特别是我负责的东西。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Jeff Foster    15 年前

    strace 将跟踪系统调用。这可能会指示网络套接字上阻塞的内容等。

        2
  •  2
  •   Community Ian Goodfellow    7 年前

    This technique 应该找到它。 基本上,虽然它花费了这样的时间,但在堆栈上几乎总是有一个函数调用的层次结构,等待它们的工作完成。 只需对堆栈进行几次采样,就可以看到它们。

    补充:正如Don Wakefield指出的那样, 堆栈 实用性很适合这项工作。

        3
  •  1
  •   DarenW    15 年前

    可以获得正在运行的程序的堆栈跟踪。在命令行中,使用“ps aux”查找程序的PID。假设是12345。然后运行:

    gdb ---pid=12345
    

    当程序暂停时(或者在做任何可疑的事情时),在gdb中执行ctrl-c。gdb中的“bt”命令打印堆栈,现在可以对其进行欣赏,也可以将其粘贴到文本文件中以备以后研究。用“c”恢复程序的执行(继续)。

    与使用oprofile或其他profiler相比,此手动技术的主要优点是,我可以在感兴趣的时刻获得准确的调用序列。在出现故障时,一些样本,以及程序正常运行时,应该提供有用的线索。