如何使用gprof配置守护进程而不优雅地终止它?

时间:2010-08-12 07:40:43

标签: c++ gprof

需要分析用C ++编写的守护进程,gprof说它需要终止进程来获取gmon.out。我想知道有人有想法用ctrl-c获取gmon.out吗?我想找出cpu周期的热点

3 个答案:

答案 0 :(得分:2)

  

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

这符合调试守护进程的常规做法:配置一个开关(例如使用命令行选项),这会强制守护进程在前台运行。

  

我想知道有人有想法用ctrl-c来获取gmon.out吗?

我不知道这些选择。

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

您也可以尝试为某些未使用的信号(如SIGUSR1或SIGUSR2)添加处理程序,并从那里调用exit()。以为我没有个人经验,也无法确定gmon在这种情况下能否正常工作。

  

我想找出cpu周期的热点

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

我更喜欢单独的测试应用程序来破解代码内部,因为特别是在性能测试的情况下,我有时可以绕过或减少对昂贵的I / O(或DB访问)的调用,这通常会导致分析器的采样偏差并使输出无效

答案 1 :(得分:0)

作为第一个建议我会说你可能会尝试使用其他工具。如果该守护程序的性能在您的测试中不是问题,您可以尝试valgrind。这是一个很棒的工具,我真的很喜欢它。

答案 2 :(得分:0)

如果您想让守护进程尽可能快,您可以将 lsstack this technique一起使用。它会告诉你可以删除的时间。如果你正在寻找热点,你可能正在寻找错误的东西。通常情况下,函数调用并非绝对需要,而且这些函数调用不会显示为热点,但它们确实显示在stackshot上。

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