| <?php |
| $title = "Leak Hunting"; |
| include("../header.inc"); |
| ?> |
| <h2>Leak Hunting</h2> |
| |
| <h3>Finding Leaks</h3> |
| |
| <p> |
| Memory leaks are one of our main areas of interest. Since the average user will only notice them by growing memory |
| 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. |
| The Mac OS X Developer Tools include a very useful program for leak detection. Here's how you can use it: |
| </p> |
| <ol> |
| <li> |
| Get a <a href="/building/build.html">fresh WebKit build</a>, ideally a Debug build as this turns |
| off the various custom allocators in WebKit. |
| </li> |
| <li> |
| Set the MallocStackLogging environment variable to YES (in bash, <code>export MallocStackLogging=YES</code>, |
| in tcsh, <code>setenv MallocStackLogging YES</code>). |
| </li> |
| <li> |
| Run Safari using <code>run-safari</code>. |
| </li> |
| <li> |
| Browse around a little. |
| </li> |
| <li> |
| From the command line, run <code>leaks Safari</code>. |
| </li> |
| </ol> |
| |
| <p> |
| At this point, if you've found memory leaks, the leaks program will tell you how many, and give stack traces for |
| each. You can file a report, along with a description of what steps you took to get the leak, at |
| <a href="https://bugs.webkit.org/">Bugzilla</a>. Put “LEAK:” at the start of the title so |
| that it's easy to find. |
| </p> |
| <p> |
| If you want to write an even better bug report, see if you can reproduce the leak by following some specific set |
| of steps, and include them in the bug. You can also look at the backtraces in the leak report and see if you can |
| eliminate duplicates. It’s useful to file a separate bug report for each unique leak, |
| and to consolidate duplicate leaks on different sites. Also, check out our |
| <a href="/quality/reporting.html">general document about filing bugs</a>. |
| </p> |
| |
| <h3>Leaks in Standard Tests</h3> |
| <p> |
| We have two ways to automatically record stack traces for leaks encountered in our <a href="/quality/testing.html"> |
| standard webkit tests</a>. This is extremely useful since the webkit tests cover many unusual cases that one might |
| not run into during a short browsing session. As we continue to <a href="/quality/testwriting.html">add webkit tests</a> |
| this will continue to test for leaks in more and more corners of the code. |
| </p> |
| <ol> |
| <li> |
| (Fast) To get a single leaks report covering all webkit tests, use run-webkit-tests --leaks. You can also pass a |
| specific directory or a specific test to get a leaks report covering just part of the test hierarchy. For example |
| run-webkit-tests --leaks dom/html/level1. |
| </li> |
| <li> |
| (Slow) To get a separate leaks report for each test, use run-webkit-tests --leaks --singly. Again, you can pass a |
| specific directory to run this on only part of the test hierarchy. This option is much slower, but can be very |
| helpful in pinning down a leak. |
| </li> |
| </ol> |
| |
| <h3>Fixing Leaks</h3> |
| <p> |
| Fixing memory leaks is a bit of a black art. The leak checker will tell you where the leaked memory was allocated, |
| but not why it was never freed. Sometimes it will be obvious from code inspection that there is no free call to |
| match a particular allocation. Other times, things get trickier - especially when refcounting is involved. In that |
| case, you know that some code has taken a ref without releasing it, but it can be very hard to tell what code. |
| </p> |
| <p> |
| Here’s a trick often found useful for these situations. Fire up the application in <code>gdb</code>. Set |
| breakpoints on the appropriate ref and deref methods. Then, use the gdb “commands” feature to set |
| commands of “bt 10; cont” for these breakpoints. You’ll get a 10-frame backtrace for every ref and |
| deref, and that’s often enough to find the one that doesn’t pair up. |
| </p> |
| |
| <h3>Destroy All Leaks</h3> |
| <p> |
| If you want to help with finding and fixing leaks, and you need more advice, <a href="/contact.html">contact us</a>. |
| Happy hunting. |
| </p> |
| <?php |
| include("../footer.inc"); |
| ?> |
| |