Stamped by Maciej.
[WebKit-https.git] / WebKitSite / quality / leakhunting.html
1 <?php
2     $title = "Leak Hunting";
3     include("../header.inc");
4 ?>
5 <h2>Leak Hunting</h2>
6
7 <h3>Finding Leaks</h3>
8
9 <p>
10     Memory leaks are one of our main areas of interest. Since the average user will only notice them by growing memory
11     usage, we don't see as many bugreports on them as we'd like. This is some information about how to hunt down those leaks.
12     The Mac OS X Developer Tools include a very useful program for leak detection. Here's how you can use it:
13 </p>    
14 <ol>
15     <li>
16         Get a <a href="/building/build.html">fresh WebKit build</a>, ideally a Debug build as this turns 
17         off the various custom allocators in WebKit.
18     </li>
19     <li>
20         Set the MallocStackLogging environment variable to YES (in bash, <code>export MallocStackLogging=YES</code>, 
21         in tcsh, <code>setenv MallocStackLogging YES</code>).
22     </li>
23     <li>
24         Run Safari using <code>run-safari</code>.
25     </li>
26     <li>
27         Browse around a little.
28     </li>
29     <li>
30         From the command line, run <code>leaks Safari</code>.
31     </li>
32 </ol>
33     
34 <p>
35     At this point, if you've found memory leaks, the leaks program will tell you how many, and give stack traces for 
36     each. You can file a report, along with a description of what steps you took to get the leak, at
37     <a href="http://bugs.webkit.org/">Bugzilla</a>. Put &#8220;LEAK:&#8221; at the start of the title so 
38     that it's easy to find.
39 </p>
40 <p>
41     If you want to write an even better bug report, see if you can reproduce the leak by following some specific set 
42     of steps, and include them in the bug. You can also look at the backtraces in the leak report and see if you can 
43     eliminate duplicates. It&#8217;s useful to file a separate bug report for each unique leak, 
44     and to consolidate duplicate leaks on different sites. Also, check out our 
45     <a href="/quality/reporting.html">general document about filing bugs</a>.
46 </p>
47
48 <h3>Leaks in Standard Tests</h3>
49 <p>
50     We have two ways to automatically record stack traces for leaks encountered in our <a href="/quality/testing.html">
51     standard webkit tests</a>. This is extremely useful since the webkit tests cover many unusual cases that one might 
52     not run into during a short browsing session. As we continue to <a href="/quality/testwriting.html">add webkit tests</a> 
53     this will continue to test for leaks in more and more corners of the code.
54 </p>
55 <ol>
56     <li>
57         (Fast) To get a single leaks report covering all webkit tests, use run-webkit-tests --leaks. You can also pass a 
58         specific directory or a specific test to get a leaks report covering just part of the test hierarchy. For example 
59         run-webkit-tests --leaks dom/html/level1.
60     </li>
61     <li>
62         (Slow) To get a separate leaks report for each test, use run-webkit-tests --leaks --singly. Again, you can pass a 
63         specific directory to run this on only part of the test hierarchy. This option is much slower, but can be very 
64         helpful in pinning down a leak.
65     </li>
66 </ol>
67
68 <h3>Fixing Leaks</h3>
69 <p>
70     Fixing memory leaks is a bit of a black art. The leak checker will tell you where the leaked memory was allocated, 
71     but not why it was never freed. Sometimes it will be obvious from code inspection that there is no free call to 
72     match a particular allocation. Other times, things get trickier - especially when refcounting is involved. In that 
73     case, you know that some code has taken a ref without releasing it, but it can be very hard to tell what code.
74 </p>
75 <p>
76     Here&#8217;s a trick often found useful for these situations. Fire up the application in <code>gdb</code>. Set 
77     breakpoints on the appropriate ref and deref methods. Then, use the gdb &#8220;commands&#8221; feature to set 
78     commands of &#8220;bt 10; cont&#8221; for these breakpoints. You&#8217;ll get a 10-frame backtrace for every ref and 
79     deref, and that&#8217;s often enough to find the one that doesn&#8217;t pair up.
80 </p>
81
82 <h3>Destroy All Leaks</h3>
83 <p>
84     If you want to help with finding and fixing leaks, and you need more advice, <a href="/contact.html">contact us</a>. 
85     Happy hunting.
86 </p>
87 <?php
88     include("../footer.inc");
89 ?>
90