blob: 729aba8a7cccea619dc38b8d958515620de4b56b [file] [log] [blame]
Austin Schuh745610d2015-09-06 18:19:50 -07001// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*-
2// Copyright (c) 2008, Google Inc.
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31// ---
32// Author: Craig Silverstein
33//
34// This tests ReadStackTraces and ReadGrowthStackTraces. It does this
35// by doing a bunch of allocations and then calling those functions.
36// A driver shell-script can call this, and then call pprof, and
37// verify the expected output. The output is written to
38// argv[1].heap and argv[1].growth
39
40#include "config_for_unittests.h"
41#include <stdio.h>
42#include <stdlib.h>
43#include <string>
44#include "base/logging.h"
45#include <gperftools/malloc_extension.h>
46
47using std::string;
48
49extern "C" void* AllocateAllocate() ATTRIBUTE_NOINLINE;
50
51extern "C" void* AllocateAllocate() {
52 // The VLOG's are mostly to discourage inlining
53 VLOG(1, "Allocating some more");
54 void* p = malloc(10000);
55 VLOG(1, "Done allocating");
56 return p;
57}
58
59static void WriteStringToFile(const string& s, const string& filename) {
60 FILE* fp = fopen(filename.c_str(), "w");
61 fwrite(s.data(), 1, s.length(), fp);
62 fclose(fp);
63}
64
65int main(int argc, char** argv) {
66 if (argc < 2) {
67 fprintf(stderr, "USAGE: %s <base of output files>\n", argv[0]);
68 exit(1);
69 }
70 for (int i = 0; i < 8000; i++) {
71 AllocateAllocate();
72 }
73
74 string s;
75 MallocExtension::instance()->GetHeapSample(&s);
76 WriteStringToFile(s, string(argv[1]) + ".heap");
77
78 s.clear();
79 MallocExtension::instance()->GetHeapGrowthStacks(&s);
80 WriteStringToFile(s, string(argv[1]) + ".growth");
81
82 return 0;
83}