如何准确确定某个软件在卡住时是做什么,对用户输入没有反应而不更新其显示?
我尝试过oprofile,它记录了正在执行的函数,但它并没有给我足够的线索。它计算在运行期间发生的所有事情,当我需要查看标本程序卡住时发生的事情。
问题可能涉及中断,等待网络套接字,定时器,GUI事件处理程序或谁知道什么。如何尽可能多地了解正在发生的事情,而不仅仅是每个线程的执行点?
感兴趣的软件在Linux上运行,使用gcc构建,主要是C ++,但可能涉及其他语言,包括解释的语言,例如蟒蛇。
现在关注的特殊情况是Firefox,我已经检查了源代码。 Firefox会随机地暂停所有输入和屏幕输出,每次约5-10秒。即使有人在银盘上递给我解决这个特殊问题的解决方案,我肯定会接受它,但仍然会问。如果可能的话,我想学习适用于任何软件的一般技术,特别是我负责的东西。
答案 0 :(得分:2)
strace将跟踪系统调用。这可能会显示网络套接字上阻塞的内容等等。
答案 1 :(得分:2)
This technique应该找到它。 基本上,虽然它花费时间,但几乎总是在堆栈上的函数调用层次结构等待他们的工作完成。 只需对堆栈进行几次采样,您就会看到它们。
补充:正如Don Wakefield指出的那样, pstack 实用程序可能非常适合这项工作。
答案 2 :(得分:1)
可以获得正在运行的程序的堆栈跟踪。在命令行中,使用“ps aux”查找程序的PID。假设它是12345.然后运行:
gdb ---pid=12345
当程序暂停(或做任何可疑的事情)时,在gdb中执行ctrl-C。 gdb中的“bt”命令打印堆栈,可以现在欣赏或粘贴到文本文件中供以后学习。用“c”继续执行程序(继续)。
这种手动技术相对于使用oprofile或其他分析器的主要优点是,我可以在感兴趣的时刻获得准确的呼叫顺序。在遇到麻烦时的一些样本,以及程序正常运行时的一些样本,应该提供有用的线索。