如何转弯粘性bug

时间:2009-12-02 16:30:32

标签: debugging profiling

如何准确确定某个软件在卡住时是做什么,对用户输入没有反应而不更新其显示?

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

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

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

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

3 个答案:

答案 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或其他分析器的主要优点是,我可以在感兴趣的时刻获得准确的呼叫顺序。在遇到麻烦时的一些样本,以及程序正常运行时的一些样本,应该提供有用的线索。