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