为啥使用 gprof 会阻止程序的执行?

Posted

技术标签:

【中文标题】为啥使用 gprof 会阻止程序的执行?【英文标题】:Why using gprof blocks the execution of a program?为什么使用 gprof 会阻止程序的执行? 【发布时间】:2013-06-04 10:16:17 【问题描述】:

我正在使用gprof 计算每个函数在执行我的程序期间所花费的时间。

上周我注意到当 CPU 使用率达到 100% 时,程序甚至无法启动!

代码运行了将近一天,没有任何变化。 在某些情况下达到 100% 的 CPU 使用率是不可避免的,特别是当我想在“stress”工具的帮助下对我的系统施加压力并在它使用最大资源量的同时测试程序时:@ 987654321@

我已阅读该主题:

Alternatives to gprof

并阅读 Mike Dunlavey 的 回复:

如果问题没有那么本地化呢?那些不重要吗? 不要对从未声称过的 gprof 寄予厚望。它 只是一种测量工具,而且仅限于 CPU 密集型操作。

还有 Norman Ramsey 的回复获得高分:

Valgrind has an instruction-count profiler with a very nice visualizer called KCacheGrind. As Mike Dunlavey recommends, Valgrind counts the fraction of instructions for which a procedure is live on the stack, although I'm sorry to say it appears to become confused in the presence of mutual recursion. But the visualizer is very nice and light years ahead of gprof.

但是由于线程已关闭,因为非建设性的,我想知道这是否是遵循的好方向

提前致谢

附:在使用谷歌搜索时,我在提出诸如

之类的问题时没有找到相关内容

“为什么当 cpu 达到 100 % 时 gprof 不起作用”

提前致谢

【问题讨论】:

【参考方案1】:

所有这 100% 意味着它已挂起,并且没有执行 I/O。

你是说当你使用gprof 运行程序时程序会挂起,但如果你不这样做则不会?

这很奇怪,但我不会费心去弄清楚。

正如我所说的over and over,我会手动抓取几个堆栈样本。 那么任何例程使用的时间百分比只是它出现的样本的一部分,或多或少。 如果您认为需要高精度测量,请尝试使用堆栈采样器,例如 ZoomOProfile

【讨论】:

确切地说,当我不使用 gprof 和 CPU 100% 时,甚至没有我打印的第一个“欢迎日志 printf”。 另外,我刚刚安装了 Oprofile,我会看看会发生什么,并随时通知您! @user2307229:听起来你的程序在启动时有一个无限循环。为了找到无限循环,我只是在 GDB 下运行它。在输出窗口中,按 Control-C 以停止它。在 GDB 窗口中,执行“thread 1”以确保 GDB 正在查看程序的线程,然后键入“bt”以显示调用堆栈。检查堆栈每一层的代码,因为循环在其中一个上。如果仍然不明显,请单步执行,直到您看到它重复出现。 嗨,迈克,刚刚用 oprofile 完成了我的程序的测试并且运行良好!但是我仍然会在 gdb 中进行调试,因为还有一些我必须澄清的东西。再次非常感谢,我会及时通知您!

以上是关于为啥使用 gprof 会阻止程序的执行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Sleep() 函数会阻止整个循环工作?

PyQt:为啥弹出对话框会阻止其他代码的执行?

为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?

为啥 Javacard 会阻止在单个 javacard 程序的 AID .cap 文件中上传不同的文件?

为啥防病毒软件会阻止我的 Web 服务?

FMDB 阻止用户界面。但为啥?对替代实施有啥建议吗?