5

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

4

3 回答 3

3

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

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

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

我不知道这样的选择。

虽然在 gmon 的情况下,调用就exit()足够了:例如,如果您打算测试处理 100K 消息,您可以在代码中添加一个计数器,在每个处理的消息上递增。当计数器超过限制时,只需调用exit().

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

我想找出cpu周期的热点

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

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

于 2010-08-12T09:48:24.897 回答
0

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

于 2010-08-12T07:53:40.007 回答
0

如果你想让守护进程尽可能快地运行,你可以使用lsstack这个技术。它将向您显示您可以删除哪些需要时间。如果您正在寻找热点,您可能正在寻找错误的东西。通常,有些函数调用不是绝对需要的,它们不会显示为热点,但它们确实会显示在堆栈快照上。

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

于 2010-08-25T17:33:22.123 回答