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

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

int main (void)
{

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

  interesting_routine();
}

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

【问题讨论】:

    标签: c performance gprof


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多