2010-08-12 62 views

回答

2

需要剖析用C++编写的守护进程,gprof说它需要终止进程来获取gmon.out。

这符合调试守护程序进程的正常实践:提供一个开关(例如使用命令行选项),这会强制守护进程在前台运行。

我想知道任何人有想法得到与ctrl-c的gmon.out?

我不知道这样的选项。

虽然在gmon的情况下,call to exit() should suffice:如果您例如打算测试说处理100K消息,您可以在代码中添加一个计数器递增每个处理的消息。当计数器超出限制时,只需致电exit()即可。

您也可以尝试为一些未使用的信号(如SIGUSR1或SIGUSR2)添加处理程序,并从那里调用exit()。我认为我没有亲身经历,也不能确定gmon能否在案件中正常工作。

我想找出CPU周期热点

我通常的做法是创建一个测试应用程序,使用相同的源代码的程序,但是不同main(),我模拟精确的情况下(通常用命令行切换很多场景)我需要调试或测试。为此,我通常会创建一个包含整个模块的静态库 - 除了文件main() - 并将测试应用程序与静态库链接起来。 (这有助于保持Makefiles的整洁。)

我更喜欢单独的测试应用程序来攻击代码,因为特别是在性能测试的情况下,我有时可以绕过或减少对昂贵的I/O(或数据库访问)的调用歪曲剖析器的采样并使输出无效。

+0

感谢您的意见,并且我也使用了类似的想法: http://www.linuxquestions。org/questions/linux-software-2/gprof-profile-an-application-782385/ 但是对我而言,守护进程无法优雅地退出,所以当退出核心转储时,没有gmon.out生成 我会尽力提取可疑的暗示来独立测试 – Jingle 2010-08-13 03:21:36

+0

我建议先优先考虑在关机期间修复崩溃。这个问题会阻止许多运行时分析工具正常工作。应该很容易销售给管理层。 – Dummy00001 2010-08-13 09:41:52

0

作为第一个建议,我会说你可能会尝试使用另一种工具。如果该守护进程的性能不是您测试中的问题,那么您可以试试valgrind。这是一个奇妙的工具,我真的很喜欢它。

+0

感谢您的建议,但valgrind在压力测试时迅速减速 – Jingle 2010-08-12 08:26:33

0

如果要使守护进程尽可能快,可以使用lsstackthis technique。它会告诉你什么是需要时间,你可以删除。如果你正在寻找热点,你可能正在寻找错误的东西。通常情况下,函数调用并不是绝对需要的,那些函数调用不会显示为热点,但它们会显示在堆栈中。

另一个不错的选择是RotateRight/Zoom