Reviewed by Darin, Geoff.
[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 area's of interest. Since the average user will only notice them by a growing memory
11     usage, we don't see as much bugreports on them as we'd like. This is some information about how 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 Development 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 found memory leaks, the leaks program will tell you how many, and give stack traces for 
36     each. You can file this report, along with a description of what steps you took to get the leak, in 
37     <a href="http://bugzilla.opendarwin.org/">Bugzilla</a>. Put &#8220;LEAK:&#8221; at the start of the title so 
38     these bugs are easy to find.
39 </p>
40 <p>
41     If you want to make an even better bug report, see if you can reproduce the leak by following some specific set 
42     of steps, and include that in the bug. You can also look at the backtraces in the leak report and see if you can 
43     match up ones that look the same. It&#8217;s useful to file a separate bug report for each one that looks different, 
44     and to consolidate leaks on different sites that look like they have the same stack trace. 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 often know that some code is holding an extra ref without releasing it, but it can be very hard to tell 
74     what code.
75 </p>
76 <p>
77     Here&#8217;s a trick often found useful for these situations. Fire up the application in <code>gdb</code>. Set 
78     breakpoints on the appropriate ref and deref methods. Then, use the gdb &#8220;commands&#8221; feature to set 
79     commands of &#8220;bt 10; cont&#8221; for these breakpoints. You&#8217;ll get a 10-frame backtrace for every ref and 
80     deref, and that&#8217;s often enough to find the one that doesn&#8217;t pair up.
81 </p>
82
83 <h3>Destroy All Leaks</h3>
84 <p>
85     If you want to help with finding and fixing leaks, and you need more advice, <a href="/contact.html">contact us</a>. 
86     Happy hunting.
87 </p>
88 <?php
89     include("../footer.inc");
90 ?>
91 \ No newline at end of file