Debugging 解决粘性问题的方法

Debugging 解决粘性问题的方法,debugging,profiling,Debugging,Profiling,当软件卡住、对用户输入无响应且不更新其显示时,如何准确地确定软件在做什么 我尝试了oprofile,它记录了正在执行的函数,但它没有给我足够的线索。它计算在运行期间发生的所有事情,当我只需要看到样本程序被卡住时发生的事情 问题可能涉及中断、等待网络套接字、计时器、GUI事件处理程序,或者谁知道是什么。如何尽可能多地了解正在发生的事情,而不仅仅是每个线程的执行点 感兴趣的软件在Linux上运行,使用GCC构建,主要是C++,但可能涉及其他语言,包括解释的Python。p> 现在特别值得关注的是Fi

当软件卡住、对用户输入无响应且不更新其显示时,如何准确地确定软件在做什么

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

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

感兴趣的软件在Linux上运行,使用GCC构建,主要是C++,但可能涉及其他语言,包括解释的Python。p> 现在特别值得关注的是Firefox,我已经查看了它的源代码。Firefox会随机暂停所有输入和屏幕输出,每次暂停时间通常为5-10秒。即使有人把这个问题的解决方案放在银盘上递给我,我当然会接受,但我还是会问。如果可能的话,我想学习适用于任何软件的通用技术,特别是我负责的东西。

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

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


补充:正如Don Wakefield指出的那样,pstack实用程序可能非常适合这项工作。

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

gdb ---pid=12345
当程序暂停时(或执行任何可疑操作时),在gdb中执行ctrl-C。gdb中的“bt”命令打印堆栈,现在可以查看或粘贴到文本文件中供以后研究。用“c”恢复程序的执行(继续)


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

如果您使用的是Linux,甚至不需要调试器。只要使用@Don:谢谢你的提示。它似乎没有显示源代码,但它仍然完成了任务。哦,伙计,我必须停止住在山洞里!直到现在我才听说这个pstack。。。“它可能会起作用的。”@DarenW:我也是。我的洞穴很冷。你能给我发一些佛罗里达航空公司的邮件吗(没有猫毛)?有Linux的lsstack,但不幸的是,它只能在32位上编译和运行;我正在运行64位。我已经使用strace来处理崩溃的程序。它对我不想杀死的正在运行的应用程序有用吗?使用strace启动应用程序,它将截获并记录系统调用,并将它们输出到stdout(或使用-o输出到文件),它将一直运行到您终止它(假设您正在运行的程序没有崩溃)。因此,运行一个不需要杀掉的程序应该没问题。常规评测和我要问的一个大区别是,我想诊断随机发生的延迟,而评测通常会定位重复运行缓慢的代码部分。我在Windows下尝试了gdb中的ctrl-C方法,但运气不好。它似乎到达了一个没有真正堆栈的地方。我想知道我做错了什么。。。。我一遍又一遍地解释为什么这项技术如此有效,让自己在xxx中感到痛苦,例如:。。。此示例显示了40倍的加速比: