在运行时启用和禁用 gprof?

Posted

技术标签:

【中文标题】在运行时启用和禁用 gprof?【英文标题】:Enable and disable gprof at runtime? 【发布时间】:2016-09-30 10:24:51 【问题描述】:

我想知道gprof 中是否有任何 API 可以在运行时启用和禁用受监控应用程序的分析。我有兴趣禁用对代码某些部分的分析,并使其能够专注于那些我感兴趣的部分。我的意思是,有没有办法避免这样做?

int main (void)


  // disable gprof ?
  uninteresting_routine();
  // enable gprof ?

  interesting_routine();

来自 GCC 网站的这个 link 提到了检测选项,似乎没有包含对这个功能的任何引用。

【问题讨论】:

【参考方案1】:

在某些系统(至少一些,如果不是全部,glibc 和一些 BSD 的版本)上,有一种未记录和隐藏的方法。

$ cat foo.c
extern void moncontrol(int);

static void
foo(void)



static void
bar(void)



int
main(int argc, char **argv)

    moncontrol(0);
    foo();
    moncontrol(1);
    bar();
    return 0;

$ cc -o foo -pg foo.c && ./foo
$ gprof foo | egrep 'foo|bar'
  0.00      0.00     0.00        1     0.00     0.00  bar
[1]      0.0    0.00    0.00       1         bar [1]
   [1] bar

Glibc 没有此功能的原型或手册页,但它确实存在。

【讨论】:

太棒了,谢谢!它也适用于英特尔编译器。只是好奇,你还记得你是从哪里得到这些信息的吗? @Harald 我曾经在内核中分析代码并查看我们的 libc 是如何工作的。大约 10 年前,当我在 linux 上需要这个时,我记得它,检查过,linux 实现了同样的东西。 @Harald 顺便说一句。这根本不应该依赖于编译器,因为编译器只使用 libc 提供的钩子。 刚刚用 MSYS64 测试了这个。也可以。遗憾的是,据我所知,它只记录在 BSD 手册中;在生产中实现它让我感到不安。【参考方案2】:

接受的答案是正确的。只是想提醒C++程序员使用

extern "C" void moncontrol(int);

【讨论】:

以上是关于在运行时启用和禁用 gprof?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 应用程序运行时启用/禁用 Crashlytics

在运行时本地启用/禁用 OpenMP

在应用程序运行时启用/禁用 Core Data 的 iCloud 同步

在运行时禁用/启用 Firebase Crashlytics

如何在运行时将 UITableViewCell 从启用更改为禁用,使其文本从黑色变为灰色?

如何在运行时启用/禁用“org.eclipse.ui.editors”扩展