gperftools堆探查器未在多线程中转储信息

时间:2018-10-21 01:41:00

标签: c++ multithreading c++11 gperftools heap-profiling

我正在尝试了解堆分析和std线程,但是遇到了我无法理解的运行时错误。我的代码:

 #include <memory>
 #include <gperftools/heap-profiler.h>
 #include <thread>
 using namespace std;

 void fcn1() // no leaks
 {
    HeapProfilerStart("temp1");
    for(auto i=0; i<10000; i++)
    {
       unique_ptr<long long> t(new long long);
       *t = 10;
    }
    HeapProfilerDump("partial1");
    HeapProfilerStop();
 }

 int fcn2() // leaks
 {
    HeapProfilerStart("temp2");
    for(auto i=0; i<10000; i++)
    {
            long* t = new long;
            *t = 10;
    }
    HeapProfilerDump("partial2");
    HeapProfilerStop();
 }

 int main(void)
 {
    thread t1(fcn1);
    thread t2(fcn2);
    t1.join();
    t2.join();
    return 0;
 }

我遇到两个问题。

  1. 按原样,仅转储第一个文件(temp1.0001.heap)。为什么会这样呢? 它不应该在终止之前等待两个线程完成吗?如果我在多线程环境中不进行处理(即调用fcn1,然后调用fcn2),则两者都会出现。这是gperftools的问题或竞赛条件还是什么?

输出为:

 Starting tracking the heap
 Dumping heap profile to temp1.0001.heap (partial2)
  1. 如果我注释掉HeapProfilerDump调用,则没有文件输出,即没有任何输出。它应该在停止时不转储配置文件,还是必须手动完成?

0 个答案:

没有答案